Example #1
0
        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
            }));
        }
Example #2
0
        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
            }));
        }
Example #3
0
        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));
        }
Example #4
0
        /// <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));
        }
Example #5
0
        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);
        }
Example #6
0
        /// <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));
        }
Example #7
0
        /// <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));
        }
Example #8
0
        /// <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));
        }
Example #9
0
        /// <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);
        }
Example #10
0
        /// <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));
        }
Example #11
0
        /// <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);
        }
Example #12
0
        /// <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);
        }
Example #13
0
        /// <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));
        }