Selaa lähdekoodia

Jellyfin.Drawing minor improvements

Reduce duplicate/dead code
Bond_009 1 vuosi sitten
vanhempi
sitoutus
c707baed83

+ 0 - 11
MediaBrowser.Controller/Drawing/IImageProcessor.cs

@@ -2,7 +2,6 @@
 
 using System;
 using System.Collections.Generic;
-using System.IO;
 using System.Threading.Tasks;
 using Jellyfin.Data.Entities;
 using MediaBrowser.Controller.Entities;
@@ -70,14 +69,6 @@ namespace MediaBrowser.Controller.Drawing
 
         string? GetImageCacheTag(User user);
 
-        /// <summary>
-        /// Processes the image.
-        /// </summary>
-        /// <param name="options">The options.</param>
-        /// <param name="toStream">To stream.</param>
-        /// <returns>Task.</returns>
-        Task ProcessImage(ImageProcessingOptions options, Stream toStream);
-
         /// <summary>
         /// Processes the image.
         /// </summary>
@@ -97,7 +88,5 @@ namespace MediaBrowser.Controller.Drawing
         /// <param name="options">The options.</param>
         /// <param name="libraryName">The library name to draw onto the collage.</param>
         void CreateImageCollage(ImageCollageOptions options, string? libraryName);
-
-        bool SupportsTransparency(string path);
     }
 }

+ 2 - 1
MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs

@@ -119,7 +119,8 @@ namespace MediaBrowser.Controller.Drawing
         private bool IsFormatSupported(string originalImagePath)
         {
             var ext = Path.GetExtension(originalImagePath);
-            return SupportedOutputFormats.Any(outputFormat => string.Equals(ext, "." + outputFormat, StringComparison.OrdinalIgnoreCase));
+            ext = ext.Replace(".jpeg", ".jpg", StringComparison.OrdinalIgnoreCase);
+            return SupportedOutputFormats.Any(outputFormat => string.Equals(ext, outputFormat.GetExtension(), StringComparison.OrdinalIgnoreCase));
         }
     }
 }

+ 1 - 9
MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs

@@ -650,15 +650,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
         {
             ArgumentException.ThrowIfNullOrEmpty(inputPath);
 
-            var outputExtension = targetFormat switch
-            {
-                ImageFormat.Bmp => ".bmp",
-                ImageFormat.Gif => ".gif",
-                ImageFormat.Jpg => ".jpg",
-                ImageFormat.Png => ".png",
-                ImageFormat.Webp => ".webp",
-                _ => ".jpg"
-            };
+            var outputExtension = targetFormat?.GetExtension() ?? ".jpg";
 
             var tempExtractPath = Path.Combine(_configurationManager.ApplicationPaths.TempDirectory, Guid.NewGuid() + outputExtension);
             Directory.CreateDirectory(Path.GetDirectoryName(tempExtractPath));

+ 17 - 0
MediaBrowser.Model/Drawing/ImageFormatExtensions.cs

@@ -24,4 +24,21 @@ public static class ImageFormatExtensions
             ImageFormat.Webp => "image/webp",
             _ => throw new InvalidEnumArgumentException(nameof(format), (int)format, typeof(ImageFormat))
         };
+
+    /// <summary>
+    /// Returns the correct extension for this <see cref="ImageFormat" />.
+    /// </summary>
+    /// <param name="format">This <see cref="ImageFormat" />.</param>
+    /// <exception cref="InvalidEnumArgumentException">The <paramref name="format"/> is an invalid enumeration value.</exception>
+    /// <returns>The correct extension for this <see cref="ImageFormat" />.</returns>
+    public static string GetExtension(this ImageFormat format)
+        => format switch
+        {
+            ImageFormat.Bmp => ".bmp",
+            ImageFormat.Gif => ".gif",
+            ImageFormat.Jpg => ".jpg",
+            ImageFormat.Png => ".png",
+            ImageFormat.Webp => ".webp",
+            _ => throw new InvalidEnumArgumentException(nameof(format), (int)format, typeof(ImageFormat))
+        };
 }

+ 0 - 6
MediaBrowser.Providers/MediaInfo/EmbeddedImageProvider.cs

@@ -204,16 +204,10 @@ namespace MediaBrowser.Providers.MediaInfo
                 ? Path.GetExtension(attachmentStream.FileName)
                 : MimeTypes.ToExtension(attachmentStream.MimeType);
 
-            if (string.IsNullOrEmpty(extension))
-            {
-                extension = ".jpg";
-            }
-
             ImageFormat format = extension switch
             {
                 ".bmp" => ImageFormat.Bmp,
                 ".gif" => ImageFormat.Gif,
-                ".jpg" => ImageFormat.Jpg,
                 ".png" => ImageFormat.Png,
                 ".webp" => ImageFormat.Webp,
                 _ => ImageFormat.Jpg

+ 2 - 12
src/Jellyfin.Drawing.Skia/SkiaEncoder.cs

@@ -200,20 +200,10 @@ public class SkiaEncoder : IImageEncoder
     {
         if (!orientation.HasValue)
         {
-            return SKEncodedOrigin.TopLeft;
+            return SKEncodedOrigin.Default;
         }
 
-        return orientation.Value switch
-        {
-            ImageOrientation.TopRight => SKEncodedOrigin.TopRight,
-            ImageOrientation.RightTop => SKEncodedOrigin.RightTop,
-            ImageOrientation.RightBottom => SKEncodedOrigin.RightBottom,
-            ImageOrientation.LeftTop => SKEncodedOrigin.LeftTop,
-            ImageOrientation.LeftBottom => SKEncodedOrigin.LeftBottom,
-            ImageOrientation.BottomRight => SKEncodedOrigin.BottomRight,
-            ImageOrientation.BottomLeft => SKEncodedOrigin.BottomLeft,
-            _ => SKEncodedOrigin.TopLeft
-        };
+        return (SKEncodedOrigin)orientation.Value;
     }
 
     /// <summary>

+ 2 - 54
src/Jellyfin.Drawing/ImageProcessor.cs

@@ -107,22 +107,10 @@ public sealed class ImageProcessor : IImageProcessor, IDisposable
     /// <inheritdoc />
     public bool SupportsImageCollageCreation => _imageEncoder.SupportsImageCollageCreation;
 
-    /// <inheritdoc />
-    public async Task ProcessImage(ImageProcessingOptions options, Stream toStream)
-    {
-        var file = await ProcessImage(options).ConfigureAwait(false);
-        using var fileStream = AsyncFile.OpenRead(file.Path);
-        await fileStream.CopyToAsync(toStream).ConfigureAwait(false);
-    }
-
     /// <inheritdoc />
     public IReadOnlyCollection<ImageFormat> GetSupportedImageOutputFormats()
         => _imageEncoder.SupportedOutputFormats;
 
-    /// <inheritdoc />
-    public bool SupportsTransparency(string path)
-        => _transparentImageTypes.Contains(Path.GetExtension(path));
-
     /// <inheritdoc />
     public async Task<(string Path, string? MimeType, DateTime DateModified)> ProcessImage(ImageProcessingOptions options)
     {
@@ -224,7 +212,7 @@ public sealed class ImageProcessor : IImageProcessor, IDisposable
                 }
             }
 
-            return (cacheFilePath, GetMimeType(outputFormat, cacheFilePath), _fileSystem.GetLastWriteTimeUtc(cacheFilePath));
+            return (cacheFilePath, outputFormat.GetMimeType(), _fileSystem.GetLastWriteTimeUtc(cacheFilePath));
         }
         catch (Exception ex)
         {
@@ -262,17 +250,6 @@ public sealed class ImageProcessor : IImageProcessor, IDisposable
         return ImageFormat.Jpg;
     }
 
-    private string GetMimeType(ImageFormat format, string path)
-        => format switch
-        {
-            ImageFormat.Bmp => MimeTypes.GetMimeType("i.bmp"),
-            ImageFormat.Gif => MimeTypes.GetMimeType("i.gif"),
-            ImageFormat.Jpg => MimeTypes.GetMimeType("i.jpg"),
-            ImageFormat.Png => MimeTypes.GetMimeType("i.png"),
-            ImageFormat.Webp => MimeTypes.GetMimeType("i.webp"),
-            _ => MimeTypes.GetMimeType(path)
-        };
-
     /// <summary>
     /// Gets the cache file path based on a set of parameters.
     /// </summary>
@@ -374,7 +351,7 @@ public sealed class ImageProcessor : IImageProcessor, IDisposable
         filename.Append(",v=");
         filename.Append(Version);
 
-        return GetCachePath(ResizedImageCachePath, filename.ToString(), "." + format.ToString().ToLowerInvariant());
+        return GetCachePath(ResizedImageCachePath, filename.ToString(), format.GetExtension());
     }
 
     /// <inheritdoc />
@@ -471,35 +448,6 @@ public sealed class ImageProcessor : IImageProcessor, IDisposable
             return Task.FromResult((originalImagePath, dateModified));
         }
 
-        // TODO _mediaEncoder.ConvertImage is not implemented
-        // if (!_imageEncoder.SupportedInputFormats.Contains(inputFormat))
-        // {
-        //     try
-        //     {
-        //         string filename = (originalImagePath + dateModified.Ticks.ToString(CultureInfo.InvariantCulture)).GetMD5().ToString("N", CultureInfo.InvariantCulture);
-        //
-        //         string cacheExtension = _mediaEncoder.SupportsEncoder("libwebp") ? ".webp" : ".png";
-        //         var outputPath = Path.Combine(_appPaths.ImageCachePath, "converted-images", filename + cacheExtension);
-        //
-        //         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.LogError(ex, "Image conversion failed for {Path}", originalImagePath);
-        //     }
-        // }
-
         return Task.FromResult((originalImagePath, dateModified));
     }
 

+ 13 - 0
tests/Jellyfin.Model.Tests/Drawing/ImageFormatExtensionsTests.cs

@@ -30,4 +30,17 @@ public static class ImageFormatExtensionsTests
     [InlineData((ImageFormat)5)]
     public static void GetMimeType_Valid_ThrowsInvalidEnumArgumentException(ImageFormat format)
         => Assert.Throws<InvalidEnumArgumentException>(() => format.GetMimeType());
+
+    [Theory]
+    [MemberData(nameof(GetAllImageFormats))]
+    public static void GetExtension_Valid_Valid(ImageFormat format)
+        => Assert.Null(Record.Exception(() => format.GetExtension()));
+
+    [Theory]
+    [InlineData((ImageFormat)int.MinValue)]
+    [InlineData((ImageFormat)int.MaxValue)]
+    [InlineData((ImageFormat)(-1))]
+    [InlineData((ImageFormat)5)]
+    public static void GetExtension_Valid_ThrowsInvalidEnumArgumentException(ImageFormat format)
+        => Assert.Throws<InvalidEnumArgumentException>(() => format.GetExtension());
 }