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 =>