Bond-009 5 лет назад
Родитель
Сommit
318b9949f2

+ 46 - 0
Jellyfin.Drawing.Skia/SkiaCodecException.cs

@@ -0,0 +1,46 @@
+using System.Globalization;
+using SkiaSharp;
+
+namespace Jellyfin.Drawing.Skia
+{
+    /// <summary>
+    /// Represents errors that occur during interaction with Skia codecs.
+    /// </summary>
+    public class SkiaCodecException : SkiaException
+    {
+        /// <summary>
+        /// Returns the non-successfull codec result returned by Skia.
+        /// </summary>
+        /// <value>The non-successfull codec result returned by Skia.</value>
+        public SKCodecResult CodecResult { get; }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="SkiaCodecException" /> class.
+        /// </summary>
+        /// <param name="result">The non-successfull codec result returned by Skia.</param>
+        public SkiaCodecException(SKCodecResult result) : base()
+        {
+            CodecResult = result;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="SkiaCodecException" /> class
+        /// with a specified error message.
+        /// </summary>
+        /// <param name="result">The non-successfull codec result returned by Skia.</param>
+        /// <param name="message">The message that describes the error.</param>
+        public SkiaCodecException(SKCodecResult result, string message)
+            : base(message)
+        {
+            CodecResult = result;
+        }
+
+        /// <inheritdoc />
+        public override string ToString()
+            => string.Format(
+                CultureInfo.InvariantCulture,
+                "Non-success codec result: {0}\n{1}",
+                CodecResult,
+                base.ToString());
+    }
+}

+ 10 - 2
Jellyfin.Drawing.Skia/SkiaEncoder.cs

@@ -9,6 +9,7 @@ using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Globalization;
 using Microsoft.Extensions.Logging;
 using SkiaSharp;
+using static Jellyfin.Drawing.Skia.SkiaHelper;
 
 namespace Jellyfin.Drawing.Skia
 {
@@ -184,16 +185,23 @@ namespace Jellyfin.Drawing.Skia
             }
         }
 
+        /// <inheritdoc />
         public ImageDimensions GetImageSize(string path)
         {
+            if (path == null)
+            {
+                throw new ArgumentNullException(nameof(path));
+            }
+
             if (!File.Exists(path))
             {
                 throw new FileNotFoundException("File not found", path);
             }
 
-            using (var s = new SKFileStream(path))
-            using (var codec = SKCodec.Create(s))
+            using (var codec = SKCodec.Create(path, out SKCodecResult result))
             {
+                EnsureSuccess(result);
+
                 var info = codec.Info;
 
                 return new ImageDimensions(info.Width, info.Height);

+ 26 - 0
Jellyfin.Drawing.Skia/SkiaException.cs

@@ -0,0 +1,26 @@
+using System;
+
+namespace Jellyfin.Drawing.Skia
+{
+    /// <summary>
+    /// Represents errors that occur during interaction with Skia.
+    /// </summary>
+    public class SkiaException : Exception
+    {
+        /// <inheritdoc />
+        public SkiaException() : base()
+        {
+        }
+
+        /// <inheritdoc />
+        public SkiaException(string message) : base(message)
+        {
+        }
+
+        /// <inheritdoc />
+        public SkiaException(string message, Exception innerException)
+            : base(message, innerException)
+        {
+        }
+    }
+}

+ 23 - 0
Jellyfin.Drawing.Skia/SkiaHelper.cs

@@ -0,0 +1,23 @@
+using SkiaSharp;
+
+namespace Jellyfin.Drawing.Skia
+{
+    /// <summary>
+    /// Class containing helper methods for working with SkiaSharp.
+    /// </summary>
+    public static class SkiaHelper
+    {
+        /// <summary>
+        /// Ensures the result is a success
+        /// by throwing an exception when that's not the case.
+        /// </summary>
+        /// <param name="result">The result returned by Skia.</param>
+        public static void EnsureSuccess(SKCodecResult result)
+        {
+            if (result != SKCodecResult.Success)
+            {
+                throw new SkiaCodecException(result);
+            }
+        }
+    }
+}