diff --git a/Jellyfin.Drawing.Skia/SkiaCodecException.cs b/Jellyfin.Drawing.Skia/SkiaCodecException.cs new file mode 100644 index 0000000000..f848636bcb --- /dev/null +++ b/Jellyfin.Drawing.Skia/SkiaCodecException.cs @@ -0,0 +1,46 @@ +using System.Globalization; +using SkiaSharp; + +namespace Jellyfin.Drawing.Skia +{ + /// + /// Represents errors that occur during interaction with Skia codecs. + /// + public class SkiaCodecException : SkiaException + { + /// + /// Returns the non-successfull codec result returned by Skia. + /// + /// The non-successfull codec result returned by Skia. + public SKCodecResult CodecResult { get; } + + /// + /// Initializes a new instance of the class. + /// + /// The non-successfull codec result returned by Skia. + public SkiaCodecException(SKCodecResult result) : base() + { + CodecResult = result; + } + + /// + /// Initializes a new instance of the class + /// with a specified error message. + /// + /// The non-successfull codec result returned by Skia. + /// The message that describes the error. + public SkiaCodecException(SKCodecResult result, string message) + : base(message) + { + CodecResult = result; + } + + /// + public override string ToString() + => string.Format( + CultureInfo.InvariantCulture, + "Non-success codec result: {0}\n{1}", + CodecResult, + base.ToString()); + } +} diff --git a/Jellyfin.Drawing.Skia/SkiaEncoder.cs b/Jellyfin.Drawing.Skia/SkiaEncoder.cs index 80b9974fa0..66b814f6eb 100644 --- a/Jellyfin.Drawing.Skia/SkiaEncoder.cs +++ b/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 } } + /// 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); diff --git a/Jellyfin.Drawing.Skia/SkiaException.cs b/Jellyfin.Drawing.Skia/SkiaException.cs new file mode 100644 index 0000000000..7aeaf083e2 --- /dev/null +++ b/Jellyfin.Drawing.Skia/SkiaException.cs @@ -0,0 +1,26 @@ +using System; + +namespace Jellyfin.Drawing.Skia +{ + /// + /// Represents errors that occur during interaction with Skia. + /// + public class SkiaException : Exception + { + /// + public SkiaException() : base() + { + } + + /// + public SkiaException(string message) : base(message) + { + } + + /// + public SkiaException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/Jellyfin.Drawing.Skia/SkiaHelper.cs b/Jellyfin.Drawing.Skia/SkiaHelper.cs new file mode 100644 index 0000000000..f9c79c8558 --- /dev/null +++ b/Jellyfin.Drawing.Skia/SkiaHelper.cs @@ -0,0 +1,23 @@ +using SkiaSharp; + +namespace Jellyfin.Drawing.Skia +{ + /// + /// Class containing helper methods for working with SkiaSharp. + /// + public static class SkiaHelper + { + /// + /// Ensures the result is a success + /// by throwing an exception when that's not the case. + /// + /// The result returned by Skia. + public static void EnsureSuccess(SKCodecResult result) + { + if (result != SKCodecResult.Success) + { + throw new SkiaCodecException(result); + } + } + } +}