|  | @@ -18,6 +18,7 @@ using System.Threading.Tasks;
 | 
	
		
			
				|  |  |  using MediaBrowser.Model.IO;
 | 
	
		
			
				|  |  |  using Emby.Drawing.Common;
 | 
	
		
			
				|  |  |  using MediaBrowser.Controller.Library;
 | 
	
		
			
				|  |  | +using MediaBrowser.Controller.MediaEncoding;
 | 
	
		
			
				|  |  |  using MediaBrowser.Model.Net;
 | 
	
		
			
				|  |  |  using MediaBrowser.Model.Threading;
 | 
	
		
			
				|  |  |  using MediaBrowser.Model.Extensions;
 | 
	
	
		
			
				|  | @@ -56,22 +57,24 @@ namespace Emby.Drawing
 | 
	
		
			
				|  |  |          private readonly IServerApplicationPaths _appPaths;
 | 
	
		
			
				|  |  |          private IImageEncoder _imageEncoder;
 | 
	
		
			
				|  |  |          private readonly Func<ILibraryManager> _libraryManager;
 | 
	
		
			
				|  |  | +        private readonly Func<IMediaEncoder> _mediaEncoder;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public ImageProcessor(ILogger logger,
 | 
	
		
			
				|  |  |              IServerApplicationPaths appPaths,
 | 
	
		
			
				|  |  |              IFileSystem fileSystem,
 | 
	
		
			
				|  |  |              IJsonSerializer jsonSerializer,
 | 
	
		
			
				|  |  |              IImageEncoder imageEncoder,
 | 
	
		
			
				|  |  | -            Func<ILibraryManager> libraryManager, ITimerFactory timerFactory)
 | 
	
		
			
				|  |  | +            Func<ILibraryManager> libraryManager, ITimerFactory timerFactory, Func<IMediaEncoder> mediaEncoder)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              _logger = logger;
 | 
	
		
			
				|  |  |              _fileSystem = fileSystem;
 | 
	
		
			
				|  |  |              _jsonSerializer = jsonSerializer;
 | 
	
		
			
				|  |  |              _imageEncoder = imageEncoder;
 | 
	
		
			
				|  |  |              _libraryManager = libraryManager;
 | 
	
		
			
				|  |  | +            _mediaEncoder = mediaEncoder;
 | 
	
		
			
				|  |  |              _appPaths = appPaths;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            ImageEnhancers = new IImageEnhancer[] {};
 | 
	
		
			
				|  |  | +            ImageEnhancers = new IImageEnhancer[] { };
 | 
	
		
			
				|  |  |              _saveImageSizeTimer = timerFactory.Create(SaveImageSizeCallback, null, Timeout.Infinite, Timeout.Infinite);
 | 
	
		
			
				|  |  |              ImageHelper.ImageProcessor = this;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -120,7 +123,36 @@ namespace Emby.Drawing
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              get
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                return _imageEncoder.SupportedInputFormats;
 | 
	
		
			
				|  |  | +                return new string[]
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    "tiff",
 | 
	
		
			
				|  |  | +                    "jpeg",
 | 
	
		
			
				|  |  | +                    "jpg",
 | 
	
		
			
				|  |  | +                    "png",
 | 
	
		
			
				|  |  | +                    "aiff",
 | 
	
		
			
				|  |  | +                    "cr2",
 | 
	
		
			
				|  |  | +                    "crw",
 | 
	
		
			
				|  |  | +                    "dng", 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    // Remove until supported
 | 
	
		
			
				|  |  | +                    //"nef", 
 | 
	
		
			
				|  |  | +                    "orf",
 | 
	
		
			
				|  |  | +                    "pef",
 | 
	
		
			
				|  |  | +                    "arw",
 | 
	
		
			
				|  |  | +                    "webp",
 | 
	
		
			
				|  |  | +                    "gif",
 | 
	
		
			
				|  |  | +                    "bmp",
 | 
	
		
			
				|  |  | +                    "erf",
 | 
	
		
			
				|  |  | +                    "raf",
 | 
	
		
			
				|  |  | +                    "rw2",
 | 
	
		
			
				|  |  | +                    "nrw",
 | 
	
		
			
				|  |  | +                    "dng",
 | 
	
		
			
				|  |  | +                    "ico",
 | 
	
		
			
				|  |  | +                    "astc",
 | 
	
		
			
				|  |  | +                    "ktx",
 | 
	
		
			
				|  |  | +                    "pkm",
 | 
	
		
			
				|  |  | +                    "wbmp"
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -203,6 +235,10 @@ namespace Emby.Drawing
 | 
	
		
			
				|  |  |                  return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            var supportedImageInfo = await GetSupportedImage(originalImagePath, dateModified).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +            originalImagePath = supportedImageInfo.Item1;
 | 
	
		
			
				|  |  | +            dateModified = supportedImageInfo.Item2;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              if (options.Enhancers.Count > 0)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  if (item == null)
 | 
	
	
		
			
				|  | @@ -663,6 +699,42 @@ namespace Emby.Drawing
 | 
	
		
			
				|  |  |              return string.Join("|", cacheKeys.ToArray(cacheKeys.Count)).GetMD5().ToString("N");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        private async Task<Tuple<string, DateTime>> GetSupportedImage(string originalImagePath, DateTime dateModified)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var inputFormat = (Path.GetExtension(originalImagePath) ?? string.Empty)
 | 
	
		
			
				|  |  | +                .TrimStart('.')
 | 
	
		
			
				|  |  | +                .Replace("jpeg", "jpg", StringComparison.OrdinalIgnoreCase);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (!_imageEncoder.SupportedInputFormats.Contains(inputFormat, StringComparer.OrdinalIgnoreCase))
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                try
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    var filename = (originalImagePath + dateModified.Ticks.ToString(UsCulture)).GetMD5().ToString("N");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    var outputPath = Path.Combine(_appPaths.ImageCachePath, "converted-images", filename + ".webp");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    var file = _fileSystem.GetFileInfo(outputPath);
 | 
	
		
			
				|  |  | +                    if (!file.Exists)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        await _mediaEncoder().ConvertImage(originalImagePath, outputPath).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                        dateModified = _fileSystem.GetLastWriteTimeUtc(outputPath);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    else
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        dateModified = file.LastWriteTimeUtc;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    originalImagePath = outputPath;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                catch (Exception ex)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _logger.ErrorException("Image conversion failed for {0}", ex, originalImagePath);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return new Tuple<string, DateTime>(originalImagePath, dateModified);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// Gets the enhanced image.
 | 
	
		
			
				|  |  |          /// </summary>
 |