diff options
Diffstat (limited to 'MediaBrowser.Api/Images/ImageService.cs')
| -rw-r--r-- | MediaBrowser.Api/Images/ImageService.cs | 142 |
1 files changed, 84 insertions, 58 deletions
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 4f8c348bb..2213a5af1 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Drawing; @@ -13,7 +14,6 @@ using ServiceStack.Text.Controller; using ServiceStack.Web; using System; using System.Collections.Generic; -using System.Globalization; using System.IO; using System.Linq; using System.Threading; @@ -26,6 +26,7 @@ namespace MediaBrowser.Api.Images /// </summary> [Route("/Items/{Id}/Images", "GET")] [Api(Description = "Gets information about an item's images")] + [Authenticated] public class GetItemImageInfos : IReturn<List<ImageInfo>> { /// <summary> @@ -38,6 +39,8 @@ namespace MediaBrowser.Api.Images [Route("/Items/{Id}/Images/{Type}", "GET")] [Route("/Items/{Id}/Images/{Type}/{Index}", "GET")] + [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}", "GET")] + [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}", "HEAD")] [Api(Description = "Gets an item image")] public class GetItemImage : ImageRequest { @@ -47,8 +50,6 @@ namespace MediaBrowser.Api.Images /// <value>The id.</value> [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] public string Id { get; set; } - - public string Params { get; set; } } /// <summary> @@ -56,6 +57,7 @@ namespace MediaBrowser.Api.Images /// </summary> [Route("/Items/{Id}/Images/{Type}/{Index}/Index", "POST")] [Api(Description = "Updates the index for an item image")] + [Authenticated] public class UpdateItemImageIndex : IReturnVoid { /// <summary> @@ -137,6 +139,7 @@ namespace MediaBrowser.Api.Images [Route("/Items/{Id}/Images/{Type}", "DELETE")] [Route("/Items/{Id}/Images/{Type}/{Index}", "DELETE")] [Api(Description = "Deletes an item image")] + [Authenticated] public class DeleteItemImage : DeleteImageRequest, IReturnVoid { /// <summary> @@ -153,6 +156,7 @@ namespace MediaBrowser.Api.Images [Route("/Users/{Id}/Images/{Type}", "DELETE")] [Route("/Users/{Id}/Images/{Type}/{Index}", "DELETE")] [Api(Description = "Deletes a user image")] + [Authenticated] public class DeleteUserImage : DeleteImageRequest, IReturnVoid { /// <summary> @@ -169,6 +173,7 @@ namespace MediaBrowser.Api.Images [Route("/Users/{Id}/Images/{Type}", "POST")] [Route("/Users/{Id}/Images/{Type}/{Index}", "POST")] [Api(Description = "Posts a user image")] + [Authenticated] public class PostUserImage : DeleteImageRequest, IRequiresRequestStream, IReturnVoid { /// <summary> @@ -191,6 +196,7 @@ namespace MediaBrowser.Api.Images [Route("/Items/{Id}/Images/{Type}", "POST")] [Route("/Items/{Id}/Images/{Type}/{Index}", "POST")] [Api(Description = "Posts an item image")] + [Authenticated] public class PostItemImage : DeleteImageRequest, IRequiresRequestStream, IReturnVoid { /// <summary> @@ -355,49 +361,25 @@ namespace MediaBrowser.Api.Images /// <returns>System.Object.</returns> public object Get(GetItemImage request) { - var item = string.IsNullOrEmpty(request.Id) ? + var item = string.IsNullOrEmpty(request.Id) ? _libraryManager.RootFolder : _libraryManager.GetItemById(request.Id); - if (!string.IsNullOrEmpty(request.Params)) - { - ParseOptions(request, request.Params); - } - - return GetImage(request, item); + return GetImage(request, item, false); } - private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - private void ParseOptions(ImageRequest request, string options) + /// <summary> + /// Gets the specified request. + /// </summary> + /// <param name="request">The request.</param> + /// <returns>System.Object.</returns> + public object Head(GetItemImage request) { - var vals = options.Split(';'); - - for (var i = 0; i < vals.Length; i++) - { - var val = vals[i]; - - if (string.IsNullOrWhiteSpace(val)) - { - continue; - } + var item = string.IsNullOrEmpty(request.Id) ? + _libraryManager.RootFolder : + _libraryManager.GetItemById(request.Id); - if (i == 0) - { - request.Tag = val; - } - else if (i == 1) - { - request.Format = (ImageOutputFormat)Enum.Parse(typeof(ImageOutputFormat), val, true); - } - else if (i == 2) - { - request.MaxWidth = int.Parse(val, _usCulture); - } - else if (i == 3) - { - request.MaxHeight = int.Parse(val, _usCulture); - } - } + return GetImage(request, item, true); } /// <summary> @@ -409,7 +391,7 @@ namespace MediaBrowser.Api.Images { var item = _userManager.Users.First(i => i.Id == request.Id); - return GetImage(request, item); + return GetImage(request, item, false); } public object Get(GetItemByNameImage request) @@ -419,7 +401,7 @@ namespace MediaBrowser.Api.Images var item = GetItemByName(request.Name, type, _libraryManager); - return GetImage(request, item); + return GetImage(request, item, false); } /// <summary> @@ -516,10 +498,10 @@ namespace MediaBrowser.Api.Images /// </summary> /// <param name="request">The request.</param> /// <param name="item">The item.</param> + /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param> /// <returns>System.Object.</returns> - /// <exception cref="ResourceNotFoundException"> - /// </exception> - public object GetImage(ImageRequest request, IHasImages item) + /// <exception cref="ResourceNotFoundException"></exception> + public object GetImage(ImageRequest request, IHasImages item, bool isHeadRequest) { var imageInfo = GetImageInfo(request, item); @@ -528,9 +510,6 @@ namespace MediaBrowser.Api.Images throw new ResourceNotFoundException(string.Format("{0} does not have an image of type {1}", item.Name, request.Type)); } - // See if we can avoid a file system lookup by looking for the file in ResolveArgs - var originalFileImageDateModified = imageInfo.DateModified; - var supportedImageEnhancers = request.EnableImageEnhancers ? _imageProcessor.ImageEnhancers.Where(i => { try @@ -557,25 +536,68 @@ namespace MediaBrowser.Api.Images cacheDuration = TimeSpan.FromDays(365); } - // Avoid implicitly captured closure - var currentItem = item; - var currentRequest = request; - var responseHeaders = new Dictionary<string, string> { {"transferMode.dlna.org", "Interactive"}, {"realTimeInfo.dlna.org", "DLNA.ORG_TLAG=*"} }; - return ToCachedResult(cacheGuid, originalFileImageDateModified, cacheDuration, () => new ImageWriter + return GetImageResult(item, + request, + imageInfo, + supportedImageEnhancers, + contentType, + cacheDuration, + responseHeaders, + isHeadRequest) + .Result; + } + + private async Task<object> GetImageResult(IHasImages item, + ImageRequest request, + ItemImageInfo image, + List<IImageEnhancer> enhancers, + string contentType, + TimeSpan? cacheDuration, + IDictionary<string, string> headers, + bool isHeadRequest) + { + var cropwhitespace = request.Type == ImageType.Logo || request.Type == ImageType.Art; + + if (request.CropWhitespace.HasValue) { - Item = currentItem, - Request = currentRequest, - Enhancers = supportedImageEnhancers, - Image = imageInfo, - ImageProcessor = _imageProcessor + cropwhitespace = request.CropWhitespace.Value; + } + + var options = new ImageProcessingOptions + { + CropWhiteSpace = cropwhitespace, + Enhancers = enhancers, + Height = request.Height, + ImageIndex = request.Index ?? 0, + Image = image, + Item = item, + MaxHeight = request.MaxHeight, + MaxWidth = request.MaxWidth, + Quality = request.Quality, + Width = request.Width, + OutputFormat = request.Format, + AddPlayedIndicator = request.AddPlayedIndicator, + PercentPlayed = request.PercentPlayed, + UnplayedCount = request.UnplayedCount, + BackgroundColor = request.BackgroundColor + }; - }, contentType, responseHeaders); + var file = await _imageProcessor.ProcessImage(options).ConfigureAwait(false); + + return ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions + { + CacheDuration = cacheDuration, + ResponseHeaders = headers, + ContentType = contentType, + IsHeadRequest = isHeadRequest, + Path = file + }); } private string GetMimeType(ImageOutputFormat format, string path) @@ -596,6 +618,10 @@ namespace MediaBrowser.Api.Images { return Common.Net.MimeTypes.GetMimeType("i.png"); } + if (format == ImageOutputFormat.Webp) + { + return Common.Net.MimeTypes.GetMimeType("i.webp"); + } return Common.Net.MimeTypes.GetMimeType(path); } |
