|
|
|
|
@ -8,6 +8,7 @@ using ErsatzTV.Core.Domain;
@@ -8,6 +8,7 @@ using ErsatzTV.Core.Domain;
|
|
|
|
|
using ErsatzTV.Core.Interfaces.Images; |
|
|
|
|
using ErsatzTV.Core.Interfaces.Metadata; |
|
|
|
|
using LanguageExt; |
|
|
|
|
using Microsoft.Extensions.Logging; |
|
|
|
|
using SixLabors.ImageSharp; |
|
|
|
|
using SixLabors.ImageSharp.Formats.Jpeg; |
|
|
|
|
using SixLabors.ImageSharp.Processing; |
|
|
|
|
@ -18,10 +19,15 @@ namespace ErsatzTV.Infrastructure.Images
@@ -18,10 +19,15 @@ namespace ErsatzTV.Infrastructure.Images
|
|
|
|
|
{ |
|
|
|
|
private static readonly SHA1CryptoServiceProvider Crypto; |
|
|
|
|
private readonly ILocalFileSystem _localFileSystem; |
|
|
|
|
private readonly ILogger<ImageCache> _logger; |
|
|
|
|
|
|
|
|
|
static ImageCache() => Crypto = new SHA1CryptoServiceProvider(); |
|
|
|
|
|
|
|
|
|
public ImageCache(ILocalFileSystem localFileSystem) => _localFileSystem = localFileSystem; |
|
|
|
|
public ImageCache(ILocalFileSystem localFileSystem, ILogger<ImageCache> logger) |
|
|
|
|
{ |
|
|
|
|
_localFileSystem = localFileSystem; |
|
|
|
|
_logger = logger; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public async Task<Either<BaseError, byte[]>> ResizeImage(byte[] imageBuffer, int height) |
|
|
|
|
{ |
|
|
|
|
@ -75,24 +81,32 @@ namespace ErsatzTV.Infrastructure.Images
@@ -75,24 +81,32 @@ namespace ErsatzTV.Infrastructure.Images
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public string CopyArtworkToCache(string path, ArtworkKind artworkKind) |
|
|
|
|
public async Task<Either<BaseError, string>> CopyArtworkToCache(string path, ArtworkKind artworkKind) |
|
|
|
|
{ |
|
|
|
|
var filenameKey = $"{path}:{_localFileSystem.GetLastWriteTime(path).ToFileTimeUtc()}"; |
|
|
|
|
byte[] hash = Crypto.ComputeHash(Encoding.UTF8.GetBytes(filenameKey)); |
|
|
|
|
string hex = BitConverter.ToString(hash).Replace("-", string.Empty); |
|
|
|
|
string subfolder = hex.Substring(0, 2); |
|
|
|
|
string baseFolder = artworkKind switch |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
ArtworkKind.Poster => Path.Combine(FileSystemLayout.PosterCacheFolder, subfolder), |
|
|
|
|
ArtworkKind.Thumbnail => Path.Combine(FileSystemLayout.ThumbnailCacheFolder, subfolder), |
|
|
|
|
ArtworkKind.Logo => Path.Combine(FileSystemLayout.LogoCacheFolder, subfolder), |
|
|
|
|
ArtworkKind.FanArt => Path.Combine(FileSystemLayout.FanArtCacheFolder, subfolder), |
|
|
|
|
_ => FileSystemLayout.LegacyImageCacheFolder |
|
|
|
|
}; |
|
|
|
|
string target = Path.Combine(baseFolder, hex); |
|
|
|
|
_localFileSystem.CopyFile(path, target); |
|
|
|
|
|
|
|
|
|
return hex; |
|
|
|
|
var filenameKey = $"{path}:{_localFileSystem.GetLastWriteTime(path).ToFileTimeUtc()}"; |
|
|
|
|
byte[] hash = Crypto.ComputeHash(Encoding.UTF8.GetBytes(filenameKey)); |
|
|
|
|
string hex = BitConverter.ToString(hash).Replace("-", string.Empty); |
|
|
|
|
string subfolder = hex.Substring(0, 2); |
|
|
|
|
string baseFolder = artworkKind switch |
|
|
|
|
{ |
|
|
|
|
ArtworkKind.Poster => Path.Combine(FileSystemLayout.PosterCacheFolder, subfolder), |
|
|
|
|
ArtworkKind.Thumbnail => Path.Combine(FileSystemLayout.ThumbnailCacheFolder, subfolder), |
|
|
|
|
ArtworkKind.Logo => Path.Combine(FileSystemLayout.LogoCacheFolder, subfolder), |
|
|
|
|
ArtworkKind.FanArt => Path.Combine(FileSystemLayout.FanArtCacheFolder, subfolder), |
|
|
|
|
_ => FileSystemLayout.LegacyImageCacheFolder |
|
|
|
|
}; |
|
|
|
|
string target = Path.Combine(baseFolder, hex); |
|
|
|
|
Either<BaseError, Unit> maybeResult = await _localFileSystem.CopyFile(path, target); |
|
|
|
|
return maybeResult.Match<Either<BaseError, string>>( |
|
|
|
|
_ => hex, |
|
|
|
|
error => error); |
|
|
|
|
} |
|
|
|
|
catch (Exception ex) |
|
|
|
|
{ |
|
|
|
|
return BaseError.New(ex.ToString()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|