aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/Images/ImageService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/Images/ImageService.cs')
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs101
1 files changed, 99 insertions, 2 deletions
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index 113bad083..d3d76f4f2 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -1,4 +1,6 @@
-using MediaBrowser.Common.Extensions;
+using System.Threading;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
@@ -9,6 +11,7 @@ using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
+using ServiceStack.Text.Controller;
namespace MediaBrowser.Api.Images
{
@@ -101,7 +104,7 @@ namespace MediaBrowser.Api.Images
/// </summary>
[Route("/Users/{Id}/Images/{Type}", "DELETE")]
[Route("/Users/{Id}/Images/{Type}/{Index}", "DELETE")]
- public class DeleteUserImage : DeleteImageRequest
+ public class DeleteUserImage : DeleteImageRequest, IReturnVoid
{
/// <summary>
/// Gets or sets the id.
@@ -109,6 +112,23 @@ namespace MediaBrowser.Api.Images
/// <value>The id.</value>
public Guid Id { get; set; }
}
+
+ [Route("/Users/{Id}/Images/{Type}", "POST")]
+ [Route("/Users/{Id}/Images/{Type}/{Index}", "POST")]
+ public class PostUserImage : DeleteImageRequest, IRequiresRequestStream, IReturnVoid
+ {
+ /// <summary>
+ /// Gets or sets the id.
+ /// </summary>
+ /// <value>The id.</value>
+ public Guid Id { get; set; }
+
+ /// <summary>
+ /// The raw Http Request Input Stream
+ /// </summary>
+ /// <value>The request stream.</value>
+ public Stream RequestStream { get; set; }
+ }
/// <summary>
/// Class ImageService
@@ -198,6 +218,26 @@ namespace MediaBrowser.Api.Images
}
/// <summary>
+ /// Posts the specified request.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ public void Post(PostUserImage request)
+ {
+ var kernel = (Kernel)Kernel;
+
+ var pathInfo = PathInfo.Parse(Request.PathInfo);
+ var id = new Guid(pathInfo.GetArgumentValue<string>(1));
+
+ request.Type = (ImageType)Enum.Parse(typeof(ImageType), pathInfo.GetArgumentValue<string>(3), true);
+
+ var item = kernel.Users.First(i => i.Id == id);
+
+ var task = PostImage(item, request.RequestStream, request.Type, Request.ContentType);
+
+ Task.WaitAll(task);
+ }
+
+ /// <summary>
/// Deletes the specified request.
/// </summary>
/// <param name="request">The request.</param>
@@ -280,5 +320,62 @@ namespace MediaBrowser.Api.Images
return kernel.ImageManager.GetImagePath(item, request.Type, index);
}
+
+ /// <summary>
+ /// Posts the image.
+ /// </summary>
+ /// <param name="entity">The entity.</param>
+ /// <param name="inputStream">The input stream.</param>
+ /// <param name="imageType">Type of the image.</param>
+ /// <param name="mimeType">Type of the MIME.</param>
+ /// <returns>Task.</returns>
+ private async Task PostImage(BaseItem entity, Stream inputStream, ImageType imageType, string mimeType)
+ {
+ using (var reader = new StreamReader(inputStream))
+ {
+ var text = await reader.ReadToEndAsync().ConfigureAwait(false);
+
+ var bytes = Convert.FromBase64String(text);
+
+ string filename;
+
+ switch (imageType)
+ {
+ case ImageType.Art:
+ filename = "clearart";
+ break;
+ case ImageType.Primary:
+ filename = "folder";
+ break;
+ default:
+ filename = imageType.ToString().ToLower();
+ break;
+ }
+
+ var extension = mimeType.Substring(mimeType.IndexOf('/') + 1);
+
+ var oldImagePath = entity.GetImage(imageType);
+
+ var imagePath = Path.Combine(entity.MetaLocation, filename + "." + extension);
+
+ // Save to file system
+ using (var fs = new FileStream(imagePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true))
+ {
+ await fs.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
+ }
+
+ // Set the image
+ entity.SetImage(imageType, imagePath);
+
+ // If the new and old paths are different, delete the old one
+ if (!string.IsNullOrEmpty(oldImagePath) && !oldImagePath.Equals(imagePath, StringComparison.OrdinalIgnoreCase))
+ {
+ File.Delete(oldImagePath);
+ }
+
+ // Directory watchers should repeat this, but do a quick refresh first
+ await entity.RefreshMetadata(CancellationToken.None, forceSave: true, allowSlowProviders: false).ConfigureAwait(false);
+ }
+ }
}
}