diff --git a/back/src/Kyoo.Core/Controllers/Repositories/CollectionRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/CollectionRepository.cs index 9a7682ef..d9f8499b 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/CollectionRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/CollectionRepository.cs @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; using Kyoo.Abstractions.Models.Utils; using Kyoo.Postgresql; @@ -30,7 +31,8 @@ namespace Kyoo.Core.Controllers; /// /// A local repository to handle collections /// -public class CollectionRepository(DatabaseContext database) : GenericRepository(database) +public class CollectionRepository(DatabaseContext database, IThumbnailsManager thumbnails) + : GenericRepository(database) { /// public override async Task> Search( @@ -51,6 +53,7 @@ public class CollectionRepository(DatabaseContext database) : GenericRepository< if (string.IsNullOrEmpty(resource.Name)) throw new ArgumentException("The collection's name must be set and not empty"); + await thumbnails.DownloadImages(resource); } public async Task AddMovie(Guid id, Guid movieId) diff --git a/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs index ff523866..30e8a7a9 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs @@ -32,7 +32,7 @@ namespace Kyoo.Core.Controllers; /// /// A local repository to handle episodes. /// -public class EpisodeRepository(DatabaseContext database, IRepository shows) +public class EpisodeRepository(DatabaseContext database, IRepository shows, IThumbnailsManager thumbnails) : GenericRepository(database) { static EpisodeRepository() @@ -96,6 +96,7 @@ public class EpisodeRepository(DatabaseContext database, IRepository shows x.ShowId == resource.ShowId && x.SeasonNumber == resource.SeasonNumber ); } + await thumbnails.DownloadImages(resource); } /// diff --git a/back/src/Kyoo.Core/Controllers/Repositories/MovieRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/MovieRepository.cs index 569e6274..25d5792c 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/MovieRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/MovieRepository.cs @@ -27,8 +27,11 @@ using Microsoft.EntityFrameworkCore; namespace Kyoo.Core.Controllers; -public class MovieRepository(DatabaseContext database, IRepository studios) - : GenericRepository(database) +public class MovieRepository( + DatabaseContext database, + IRepository studios, + IThumbnailsManager thumbnails +) : GenericRepository(database) { /// public override async Task> Search( @@ -51,5 +54,6 @@ public class MovieRepository(DatabaseContext database, IRepository studi resource.Studio = await studios.CreateIfNotExists(resource.Studio); resource.StudioId = resource.Studio.Id; } + await thumbnails.DownloadImages(resource); } } diff --git a/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs index 18d9d47c..9d7b46bb 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs @@ -31,7 +31,8 @@ using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Core.Controllers; -public class SeasonRepository(DatabaseContext database) : GenericRepository(database) +public class SeasonRepository(DatabaseContext database, IThumbnailsManager thumbnails) + : GenericRepository(database) { static SeasonRepository() { @@ -90,5 +91,6 @@ public class SeasonRepository(DatabaseContext database) : GenericRepository studios) - : GenericRepository(database) +public class ShowRepository( + DatabaseContext database, + IRepository studios, + IThumbnailsManager thumbnails +) : GenericRepository(database) { /// public override async Task> Search( @@ -51,5 +54,6 @@ public class ShowRepository(DatabaseContext database, IRepository studio resource.Studio = await studios.CreateIfNotExists(resource.Studio); resource.StudioId = resource.Studio.Id; } + await thumbnails.DownloadImages(resource); } } diff --git a/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs b/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs index 0ec1d154..d896127c 100644 --- a/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs +++ b/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs @@ -57,8 +57,17 @@ public class ThumbnailsManager( try { if (image.Id == Guid.Empty) - image.Id = new Guid(); - string localPath = $"/metadata/{image.Id}"; + { + using MD5 md5 = MD5.Create(); + image.Id = new Guid(md5.ComputeHash(Encoding.UTF8.GetBytes(image.Source))); + } + + if ( + File.Exists(GetImagePath(image.Id, ImageQuality.High)) + && File.Exists(GetImagePath(image.Id, ImageQuality.Medium)) + && File.Exists(GetImagePath(image.Id, ImageQuality.Low)) + ) + return; logger.LogInformation("Downloading image {What}", what); @@ -81,31 +90,19 @@ public class ThumbnailsManager( new SKSizeI(original.Width, original.Height), SKFilterQuality.High ); - await _WriteTo( - original, - $"{localPath}.{ImageQuality.High.ToString().ToLowerInvariant()}.webp", - 90 - ); + await _WriteTo(original, GetImagePath(image.Id, ImageQuality.High), 90); using SKBitmap medium = high.Resize( new SKSizeI((int)(high.Width / 1.5), (int)(high.Height / 1.5)), SKFilterQuality.Medium ); - await _WriteTo( - medium, - $"{localPath}.{ImageQuality.Medium.ToString().ToLowerInvariant()}.webp", - 75 - ); + await _WriteTo(medium, GetImagePath(image.Id, ImageQuality.Medium), 75); using SKBitmap low = medium.Resize( new SKSizeI(original.Width / 2, original.Height / 2), SKFilterQuality.Low ); - await _WriteTo( - low, - $"{localPath}.{ImageQuality.Low.ToString().ToLowerInvariant()}.webp", - 50 - ); + await _WriteTo(low, GetImagePath(image.Id, ImageQuality.Low), 50); image.Blurhash = Blurhasher.Encode(low, 4, 3); } @@ -136,7 +133,7 @@ public class ThumbnailsManager( public Task DeleteImages(T item) where T : IThumbnails { - IEnumerable images = new[] {item.Poster?.Id, item.Thumbnail?.Id, item.Logo?.Id} + IEnumerable images = new[] { item.Poster?.Id, item.Thumbnail?.Id, item.Logo?.Id } .Where(x => x is not null) .SelectMany(x => $"/metadata/{x}") .SelectMany(x =>