private async Task <object> GetImageResult(IHasImages item, ImageRequest request, ItemImageInfo image, ImageFormat format, 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) { 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, AddPlayedIndicator = request.AddPlayedIndicator, PercentPlayed = request.PercentPlayed ?? 0, UnplayedCount = request.UnplayedCount, BackgroundColor = request.BackgroundColor, OutputFormat = format }; 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 async Task <object> GetImageResult(IHasImages item, ImageRequest request, ItemImageInfo image, bool cropwhitespace, List <ImageFormat> supportedFormats, List <IImageEnhancer> enhancers, TimeSpan?cacheDuration, IDictionary <string, string> headers, bool isHeadRequest) { 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 ?? 100, Width = request.Width, AddPlayedIndicator = request.AddPlayedIndicator, PercentPlayed = request.PercentPlayed ?? 0, UnplayedCount = request.UnplayedCount, BackgroundColor = request.BackgroundColor, ForegroundLayer = request.ForegroundLayer, SupportedOutputFormats = supportedFormats }; var imageResult = await _imageProcessor.ProcessImage(options).ConfigureAwait(false); headers["Vary"] = "Accept"; return(ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions { CacheDuration = cacheDuration, ResponseHeaders = headers, ContentType = imageResult.Item2, IsHeadRequest = isHeadRequest, Path = imageResult.Item1, // Sometimes imagemagick keeps a hold on the file briefly even after it's done writing to it. // I'd rather do this than add a delay after saving the file FileShare = FileShare.ReadWrite })); }
private async Task <object> GetImageResult( Guid itemId, ImageRequest request, ItemImageInfo info, IReadOnlyCollection <ImageFormat> supportedFormats, TimeSpan?cacheDuration, IDictionary <string, string> headers, bool isHeadRequest) { info.Type = ImageType.Profile; var options = new ImageProcessingOptions { CropWhiteSpace = true, Height = request.Height, ImageIndex = request.Index ?? 0, Image = info, Item = null, // Hack alert ItemId = itemId, MaxHeight = request.MaxHeight, MaxWidth = request.MaxWidth, Quality = request.Quality ?? 100, Width = request.Width, AddPlayedIndicator = request.AddPlayedIndicator, PercentPlayed = 0, UnplayedCount = request.UnplayedCount, Blur = request.Blur, BackgroundColor = request.BackgroundColor, ForegroundLayer = request.ForegroundLayer, SupportedOutputFormats = supportedFormats }; var imageResult = await _imageProcessor.ProcessImage(options).ConfigureAwait(false); headers[HeaderNames.Vary] = HeaderNames.Accept; return(await ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions { CacheDuration = cacheDuration, ResponseHeaders = headers, ContentType = imageResult.Item2, DateLastModified = imageResult.Item3, IsHeadRequest = isHeadRequest, Path = imageResult.Item1, FileShare = FileShare.Read }).ConfigureAwait(false)); }
/// <summary> /// Gets the image. /// </summary> /// <param name="request">The request.</param> /// <param name="item">The item.</param> /// <returns>System.Object.</returns> /// <exception cref="ResourceNotFoundException"></exception> private object GetImage(ImageRequest request, BaseItem item) { var kernel = Kernel.Instance; var index = request.Index ?? 0; var imagePath = GetImagePath(kernel, request, item); if (string.IsNullOrEmpty(imagePath)) { throw new ResourceNotFoundException(); } // See if we can avoid a file system lookup by looking for the file in ResolveArgs var originalFileImageDateModified = kernel.ImageManager.GetImageDateModified(item, request.Type, index); var supportedImageEnhancers = kernel.ImageEnhancers.Where(i => i.Supports(item, request.Type)).ToList(); // If the file does not exist GetLastWriteTimeUtc will return jan 1, 1601 as opposed to throwing an exception // http://msdn.microsoft.com/en-us/library/system.io.file.getlastwritetimeutc.aspx if (originalFileImageDateModified.Year == 1601 && !File.Exists(imagePath)) { throw new ResourceNotFoundException(string.Format("File not found: {0}", imagePath)); } var contentType = MimeTypes.GetMimeType(imagePath); var dateLastModified = (supportedImageEnhancers.Select(e => e.LastConfigurationChange(item, request.Type)).Concat(new[] { originalFileImageDateModified })).Max(); var cacheGuid = kernel.ImageManager.GetImageCacheTag(imagePath, originalFileImageDateModified, supportedImageEnhancers, item, request.Type); TimeSpan?cacheDuration = null; if (!string.IsNullOrEmpty(request.Tag) && cacheGuid == new Guid(request.Tag)) { cacheDuration = TimeSpan.FromDays(365); } return(ToCachedResult(cacheGuid, dateLastModified, cacheDuration, () => new ImageWriter { Item = item, Request = request, CropWhiteSpace = request.Type == ImageType.Logo || request.Type == ImageType.Art, OriginalImageDateModified = originalFileImageDateModified }, contentType)); }
private static ItemImageInfo GetImageInfo(ImageRequest request, User user) { var info = new ItemImageInfo { Path = user.ProfileImage.Path, Type = ImageType.Primary, DateModified = user.ProfileImage.LastModified, }; if (request.Width.HasValue) { info.Width = request.Width.Value; } if (request.Height.HasValue) { info.Height = request.Height.Value; } return(info); }
/// <summary> /// Gets the image path. /// </summary> /// <param name="request">The request.</param> /// <param name="item">The item.</param> /// <returns>System.String.</returns> private ItemImageInfo GetImageInfo(ImageRequest request, IHasImages item) { var index = request.Index ?? 0; return(item.GetImageInfo(request.Type, index)); }
/// <summary> /// Gets the image. /// </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 Task <object> GetImage(ImageRequest request, Guid itemId, BaseItem item, bool isHeadRequest) { if (request.PercentPlayed.HasValue) { if (request.PercentPlayed.Value <= 0) { request.PercentPlayed = null; } else if (request.PercentPlayed.Value >= 100) { request.PercentPlayed = null; request.AddPlayedIndicator = true; } } if (request.PercentPlayed.HasValue) { request.UnplayedCount = null; } if (request.UnplayedCount.HasValue) { if (request.UnplayedCount.Value <= 0) { request.UnplayedCount = null; } } if (item == null) { item = _libraryManager.GetItemById(itemId); if (item == null) { throw new ResourceNotFoundException(string.Format("Item {0} not found.", itemId.ToString("N"))); } } var imageInfo = GetImageInfo(request, item); if (imageInfo == null) { var displayText = item == null?itemId.ToString() : item.Name; throw new ResourceNotFoundException(string.Format("{0} does not have an image of type {1}", displayText, request.Type)); } IImageEnhancer[] supportedImageEnhancers; if (_imageProcessor.ImageEnhancers.Length > 0) { if (item == null) { item = _libraryManager.GetItemById(itemId); } supportedImageEnhancers = request.EnableImageEnhancers ? _imageProcessor.GetSupportedEnhancers(item, request.Type) : Array.Empty <IImageEnhancer>(); } else { supportedImageEnhancers = Array.Empty <IImageEnhancer>(); } var cropwhitespace = request.Type == ImageType.Logo || request.Type == ImageType.Art; if (request.CropWhitespace.HasValue) { cropwhitespace = request.CropWhitespace.Value; } var outputFormats = GetOutputFormats(request); TimeSpan?cacheDuration = null; if (!string.IsNullOrEmpty(request.Tag)) { cacheDuration = TimeSpan.FromDays(365); } var responseHeaders = new Dictionary <string, string> { { "transferMode.dlna.org", "Interactive" }, { "realTimeInfo.dlna.org", "DLNA.ORG_TLAG=*" } }; return(GetImageResult(item, itemId, request, imageInfo, cropwhitespace, outputFormats, supportedImageEnhancers, cacheDuration, responseHeaders, isHeadRequest)); }
/// <summary> /// Gets the image. /// </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 Task <object> GetImage(ImageRequest request, IHasImages item, bool isHeadRequest) { if (request.PercentPlayed.HasValue) { if (request.PercentPlayed.Value <= 0) { request.PercentPlayed = null; } else if (request.PercentPlayed.Value >= 100) { request.PercentPlayed = null; request.AddPlayedIndicator = true; } } if (request.PercentPlayed.HasValue) { request.UnplayedCount = null; } if (request.UnplayedCount.HasValue) { if (request.UnplayedCount.Value <= 0) { request.UnplayedCount = null; } } var imageInfo = GetImageInfo(request, item); if (imageInfo == null) { throw new ResourceNotFoundException(string.Format("{0} does not have an image of type {1}", item.Name, request.Type)); } var supportedImageEnhancers = request.EnableImageEnhancers ? _imageProcessor.ImageEnhancers.Where(i => { try { return(i.Supports(item, request.Type)); } catch (Exception ex) { Logger.ErrorException("Error in image enhancer: {0}", ex, i.GetType().Name); return(false); } }).ToList() : new List <IImageEnhancer>(); var cropwhitespace = request.Type == ImageType.Logo || request.Type == ImageType.Art; if (request.CropWhitespace.HasValue) { cropwhitespace = request.CropWhitespace.Value; } var outputFormats = GetOutputFormats(request, imageInfo, cropwhitespace, supportedImageEnhancers); TimeSpan?cacheDuration = null; if (!string.IsNullOrEmpty(request.Tag)) { cacheDuration = TimeSpan.FromDays(365); } var responseHeaders = new Dictionary <string, string> { { "transferMode.dlna.org", "Interactive" }, { "realTimeInfo.dlna.org", "DLNA.ORG_TLAG=*" } }; return(GetImageResult(item, request, imageInfo, cropwhitespace, outputFormats, supportedImageEnhancers, cacheDuration, responseHeaders, isHeadRequest)); }
/// <summary> /// Gets the image path. /// </summary> /// <param name="request">The request.</param> /// <param name="item">The item.</param> /// <returns>System.String.</returns> private ItemImageInfo GetImageInfo(ImageRequest request, BaseItem item) { var index = request.Index ?? 0; return item.GetImageInfo(request.Type, index); }
/// <summary> /// Gets the image path. /// </summary> /// <param name="request">The request.</param> /// <param name="item">The item.</param> /// <returns>System.String.</returns> private string GetImagePath(ImageRequest request, BaseItem item) { var index = request.Index ?? 0; return(item.GetImagePath(request.Type, index)); }
/// <summary> /// Gets the image path. /// </summary> /// <param name="kernel">The kernel.</param> /// <param name="request">The request.</param> /// <param name="item">The item.</param> /// <returns>System.String.</returns> private string GetImagePath(Kernel kernel, ImageRequest request, BaseItem item) { var index = request.Index ?? 0; return kernel.ImageManager.GetImagePath(item, request.Type, index); }
/// <summary> /// Gets the image. /// </summary> /// <param name="request">The request.</param> /// <param name="item">The item.</param> /// <returns>System.Object.</returns> /// <exception cref="ResourceNotFoundException"> /// </exception> private object GetImage(ImageRequest request, BaseItem item) { var kernel = Kernel.Instance; var index = request.Index ?? 0; var imagePath = GetImagePath(kernel, request, item); if (string.IsNullOrEmpty(imagePath)) { 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 = kernel.ImageManager.GetImageDateModified(item, imagePath); var supportedImageEnhancers = request.EnableImageEnhancers ? kernel.ImageManager.ImageEnhancers.Where(i => { try { return i.Supports(item, request.Type); } catch (Exception ex) { Logger.ErrorException("Error in image enhancer: {0}", ex, i.GetType().Name); return false; } }).ToList() : new List<IImageEnhancer>(); // If the file does not exist GetLastWriteTimeUtc will return jan 1, 1601 as opposed to throwing an exception // http://msdn.microsoft.com/en-us/library/system.io.file.getlastwritetimeutc.aspx if (originalFileImageDateModified.Year == 1601 && !File.Exists(imagePath)) { throw new ResourceNotFoundException(string.Format("File not found: {0}", imagePath)); } var contentType = MimeTypes.GetMimeType(imagePath); var cacheGuid = kernel.ImageManager.GetImageCacheTag(imagePath, originalFileImageDateModified, supportedImageEnhancers, item, request.Type); TimeSpan? cacheDuration = null; if (!string.IsNullOrEmpty(request.Tag) && cacheGuid == new Guid(request.Tag)) { cacheDuration = TimeSpan.FromDays(365); } // Avoid implicitly captured closure var currentItem = item; var currentRequest = request; return ToCachedResult(cacheGuid, originalFileImageDateModified, cacheDuration, () => new ImageWriter { Item = currentItem, Request = currentRequest, OriginalImageDateModified = originalFileImageDateModified, Enhancers = supportedImageEnhancers, OriginalImagePath = imagePath }, contentType); }
/// <summary> /// Gets the image. /// </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 Task <object> GetImage(ImageRequest request, Guid itemId, BaseItem item, bool isHeadRequest) { if (request.PercentPlayed.HasValue) { if (request.PercentPlayed.Value <= 0) { request.PercentPlayed = null; } else if (request.PercentPlayed.Value >= 100) { request.PercentPlayed = null; request.AddPlayedIndicator = true; } } if (request.PercentPlayed.HasValue) { request.UnplayedCount = null; } if (request.UnplayedCount.HasValue && request.UnplayedCount.Value <= 0) { request.UnplayedCount = null; } if (item == null) { item = _libraryManager.GetItemById(itemId); if (item == null) { throw new ResourceNotFoundException(string.Format("Item {0} not found.", itemId.ToString("N", CultureInfo.InvariantCulture))); } } var imageInfo = GetImageInfo(request, item); if (imageInfo == null) { throw new ResourceNotFoundException(string.Format("{0} does not have an image of type {1}", item.Name, request.Type)); } bool cropWhitespace; if (request.CropWhitespace.HasValue) { cropWhitespace = request.CropWhitespace.Value; } else { cropWhitespace = request.Type == ImageType.Logo || request.Type == ImageType.Art; } var outputFormats = GetOutputFormats(request); TimeSpan?cacheDuration = null; if (!string.IsNullOrEmpty(request.Tag)) { cacheDuration = TimeSpan.FromDays(365); } var responseHeaders = new Dictionary <string, string> { { "transferMode.dlna.org", "Interactive" }, { "realTimeInfo.dlna.org", "DLNA.ORG_TLAG=*" } }; return(GetImageResult( item, itemId, request, imageInfo, cropWhitespace, outputFormats, cacheDuration, responseHeaders, isHeadRequest)); }