diff options
Diffstat (limited to 'MediaBrowser.Api/Images/ImageService.cs')
| -rw-r--r-- | MediaBrowser.Api/Images/ImageService.cs | 101 |
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); + } + } } } |
