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