Improve Skia error handling (#1752)

This commit is contained in:
Bond-009 2019-09-15 06:27:42 +02:00 committed by Anthony Lavado
parent cc8609d0aa
commit 318b9949f2
4 changed files with 105 additions and 2 deletions

View File

@ -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());
}
}

View File

@ -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);

View File

@ -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)
{
}
}
}

View File

@ -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);
}
}
}
}