aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliszto <liszto@users.noreply.github.com>2025-12-28 07:22:11 -0500
committerBond_009 <bond.009@outlook.com>2025-12-28 07:22:11 -0500
commit24acd94015d62673becd73a1f2ec4943433644ba (patch)
tree0740fb3541177fb6ac18a0c1fdccf5b53e3b3791
parentc30654c33c0561ee7f3b7d096038f9604a111003 (diff)
Backport pull request #15659 from jellyfin/release-10.11.z
Fix thumbnails never deletes from temp folder ( issue #15629 ) Original-merge: 636908fc4dc4cd69a1c20949a5f7c6cba25de67a Merged-by: crobibero <cody@robibe.ro> Backported-by: Bond_009 <bond.009@outlook.com>
-rw-r--r--src/Jellyfin.Drawing.Skia/SkiaEncoder.cs86
1 files changed, 58 insertions, 28 deletions
diff --git a/src/Jellyfin.Drawing.Skia/SkiaEncoder.cs b/src/Jellyfin.Drawing.Skia/SkiaEncoder.cs
index 503e2f941..c6eab92ea 100644
--- a/src/Jellyfin.Drawing.Skia/SkiaEncoder.cs
+++ b/src/Jellyfin.Drawing.Skia/SkiaEncoder.cs
@@ -209,39 +209,69 @@ public class SkiaEncoder : IImageEncoder
return default;
}
- using var codec = SKCodec.Create(safePath, out var result);
-
- switch (result)
- {
- case SKCodecResult.Success:
- // Skia/SkiaSharp edge‑case: when the image header is parsed but the actual pixel
- // decode fails (truncated JPEG/PNG, exotic ICC/EXIF, CMYK without color‑transform, etc.)
- // `SKCodec.Create` returns a *non‑null* codec together with
- // SKCodecResult.InternalError. The header still contains valid dimensions,
- // which is all we need here – so we fall back to them instead of aborting.
- // See e.g. Skia bugs #4139, #6092.
- case SKCodecResult.InternalError when codec is not null:
- var info = codec.Info;
- return new ImageDimensions(info.Width, info.Height);
-
- case SKCodecResult.Unimplemented:
- _logger.LogDebug("Image format not supported: {FilePath}", path);
- return default;
-
- default:
+ SKCodec? codec = null;
+ bool isSafePathTemp = !string.Equals(Path.GetFullPath(safePath), Path.GetFullPath(path), StringComparison.OrdinalIgnoreCase);
+ try
+ {
+ codec = SKCodec.Create(safePath, out var result);
+ switch (result)
{
- var boundsInfo = SKBitmap.DecodeBounds(safePath);
+ case SKCodecResult.Success:
+ // Skia/SkiaSharp edge‑case: when the image header is parsed but the actual pixel
+ // decode fails (truncated JPEG/PNG, exotic ICC/EXIF, CMYK without color‑transform, etc.)
+ // `SKCodec.Create` returns a *non‑null* codec together with
+ // SKCodecResult.InternalError. The header still contains valid dimensions,
+ // which is all we need here – so we fall back to them instead of aborting.
+ // See e.g. Skia bugs #4139, #6092.
+ case SKCodecResult.InternalError when codec is not null:
+ var info = codec.Info;
+ return new ImageDimensions(info.Width, info.Height);
+
+ case SKCodecResult.Unimplemented:
+ _logger.LogDebug("Image format not supported: {FilePath}", path);
+ return default;
- if (boundsInfo.Width > 0 && boundsInfo.Height > 0)
+ default:
{
- return new ImageDimensions(boundsInfo.Width, boundsInfo.Height);
+ var boundsInfo = SKBitmap.DecodeBounds(safePath);
+ if (boundsInfo.Width > 0 && boundsInfo.Height > 0)
+ {
+ return new ImageDimensions(boundsInfo.Width, boundsInfo.Height);
+ }
+
+ _logger.LogWarning(
+ "Unable to determine image dimensions for {FilePath}: {SkCodecResult}",
+ path,
+ result);
+
+ return default;
}
+ }
+ }
+ finally
+ {
+ try
+ {
+ codec?.Dispose();
+ }
+ catch (Exception ex)
+ {
+ _logger.LogDebug(ex, "Error by closing codec for {FilePath}", safePath);
+ }
- _logger.LogWarning(
- "Unable to determine image dimensions for {FilePath}: {SkCodecResult}",
- path,
- result);
- return default;
+ if (isSafePathTemp)
+ {
+ try
+ {
+ if (File.Exists(safePath))
+ {
+ File.Delete(safePath);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogDebug(ex, "Unable to remove temporary file '{TempPath}'", safePath);
+ }
}
}
}