diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 19cb14bbd5..0fa75af4d2 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -159,6 +159,25 @@ namespace MediaBrowser.Api.Images /// The request stream. public Stream RequestStream { get; set; } } + + [Route("/Items/{Id}/Images/{Type}", "POST")] + [Route("/Items/{Id}/Images/{Type}/{Index}", "POST")] + [Api(Description = "Posts an item image")] + public class PostItemImage : DeleteImageRequest, IRequiresRequestStream, IReturnVoid + { + /// + /// Gets or sets the id. + /// + /// The id. + [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] + public string Id { get; set; } + + /// + /// The raw Http Request Input Stream + /// + /// The request stream. + public Stream RequestStream { get; set; } + } /// /// Class ImageService @@ -288,6 +307,24 @@ namespace MediaBrowser.Api.Images Task.WaitAll(task); } + /// + /// Posts the specified request. + /// + /// The request. + public void Post(PostItemImage request) + { + var pathInfo = PathInfo.Parse(RequestContext.PathInfo); + var id = new Guid(pathInfo.GetArgumentValue(1)); + + request.Type = (ImageType)Enum.Parse(typeof(ImageType), pathInfo.GetArgumentValue(3), true); + + var item = _libraryManager.GetItemById(id); + + var task = PostImage(item, request.RequestStream, request.Type, RequestContext.ContentType); + + Task.WaitAll(task); + } + /// /// Deletes the specified request. /// diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs index 5a9f5890e2..3e8501dfaf 100644 --- a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs @@ -197,7 +197,7 @@ namespace MediaBrowser.Controller.Providers item.SetImage(ImageType.Thumb, image.FullName); } - // Thumbnail Image + // Box Image image = GetImage(item, "box"); if (image != null) @@ -205,6 +205,14 @@ namespace MediaBrowser.Controller.Providers item.SetImage(ImageType.Box, image.FullName); } + // BoxRear Image + image = GetImage(item, "boxrear"); + + if (image != null) + { + item.SetImage(ImageType.BoxRear, image.FullName); + } + // Thumbnail Image image = GetImage(item, "menu"); diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index e51be6d724..a82f7be4d3 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -455,6 +455,7 @@ namespace MediaBrowser.WebDashboard.Api "boxsets.js", "clientsettings.js", "dashboardpage.js", + "edititemimages.js", "edituserpage.js", "gamesrecommendedpage.js", "gamesystemspage.js", diff --git a/MediaBrowser.WebDashboard/ApiClient.js b/MediaBrowser.WebDashboard/ApiClient.js index 84f34e6814..2e11a72fca 100644 --- a/MediaBrowser.WebDashboard/ApiClient.js +++ b/MediaBrowser.WebDashboard/ApiClient.js @@ -839,6 +839,63 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) { return deferred.promise(); }; + self.uploadImage = function (itemId, imageType, file) { + + if (!itemId) { + throw new Error("null itemId"); + } + + if (!imageType) { + throw new Error("null imageType"); + } + + if (!file) { + throw new Error("File must be an image."); + } + + if (file.type != "image/png" && file.type != "image/jpeg" && file.type != "image/jpeg") { + throw new Error("File must be an image."); + } + + var deferred = $.Deferred(); + + var reader = new FileReader(); + + reader.onerror = function () { + deferred.reject(); + }; + + reader.onabort = function () { + deferred.reject(); + }; + + // Closure to capture the file information. + reader.onload = function (e) { + + var data = window.btoa(e.target.result); + + var url = self.getUrl("Items/" + itemId + "/Images/" + imageType); + + self.ajax({ + type: "POST", + url: url, + data: data, + contentType: "image/" + file.name.substring(file.name.lastIndexOf('.') + 1) + }).done(function (result) { + + deferred.resolveWith(null, [result]); + + }).fail(function () { + deferred.reject(); + }); + }; + + // Read in the image file as a data URL. + reader.readAsBinaryString(file); + + return deferred.promise(); + }; + /** * Gets the list of installed plugins on the server */ diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 8fc53a0a10..bda7c013c6 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -210,6 +210,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -270,6 +273,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/MediaBrowser.WebDashboard/packages.config b/MediaBrowser.WebDashboard/packages.config index e8ca33ab5f..23ebca2930 100644 --- a/MediaBrowser.WebDashboard/packages.config +++ b/MediaBrowser.WebDashboard/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file