diff --git a/back/src/Directory.Build.props b/back/src/Directory.Build.props index c0c382c2..6918ac14 100644 --- a/back/src/Directory.Build.props +++ b/back/src/Directory.Build.props @@ -46,7 +46,7 @@ $(MSBuildThisFileDirectory)../Kyoo.ruleset - 1591 + 1591;1305 diff --git a/back/src/Kyoo.Abstractions/Models/Resources/Interfaces/IThumbnails.cs b/back/src/Kyoo.Abstractions/Models/Resources/Interfaces/IThumbnails.cs index 10e1b742..11dfd6c4 100644 --- a/back/src/Kyoo.Abstractions/Models/Resources/Interfaces/IThumbnails.cs +++ b/back/src/Kyoo.Abstractions/Models/Resources/Interfaces/IThumbnails.cs @@ -16,7 +16,10 @@ // You should have received a copy of the GNU General Public License // along with Kyoo. If not, see . +using System; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; +using System.Globalization; namespace Kyoo.Abstractions.Models { @@ -42,6 +45,7 @@ namespace Kyoo.Abstractions.Models public Image? Logo { get; set; } } + [TypeConverter(typeof(ImageConvertor))] public class Image { /// @@ -54,6 +58,31 @@ namespace Kyoo.Abstractions.Models /// [MaxLength(32)] public string Blurhash { get; set; } + + public Image(string source, string? blurhash = null) + { + Source = source; + Blurhash = blurhash ?? "00000000000000"; + } + + public class ImageConvertor : TypeConverter + { + /// + public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) + { + if (sourceType == typeof(string)) + return true; + return base.CanConvertFrom(context, sourceType); + } + + /// + public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) + { + if (value is not string source) + return base.ConvertFrom(context, culture, value)!; + return new Image(source); + } + } } /// @@ -64,7 +93,7 @@ namespace Kyoo.Abstractions.Models /// /// Small /// - Small, + Low, /// /// Medium @@ -74,6 +103,6 @@ namespace Kyoo.Abstractions.Models /// /// Large /// - Large, + High, } } diff --git a/back/src/Kyoo.Abstractions/Models/Utils/Identifier.cs b/back/src/Kyoo.Abstractions/Models/Utils/Identifier.cs index 2bbcfc5b..ae514d5c 100644 --- a/back/src/Kyoo.Abstractions/Models/Utils/Identifier.cs +++ b/back/src/Kyoo.Abstractions/Models/Utils/Identifier.cs @@ -23,7 +23,6 @@ using System.Globalization; using System.Linq; using System.Linq.Expressions; using System.Reflection; -using JetBrains.Annotations; namespace Kyoo.Abstractions.Models.Utils { @@ -43,7 +42,7 @@ namespace Kyoo.Abstractions.Models.Utils /// /// The slug of the resource or null if the id is specified. /// - private readonly string _slug; + private readonly string? _slug; /// /// Create a new for the given id. @@ -183,7 +182,7 @@ namespace Kyoo.Abstractions.Models.Utils { return _id.HasValue ? _id.Value.ToString() - : _slug; + : _slug!; } /// @@ -192,7 +191,7 @@ namespace Kyoo.Abstractions.Models.Utils public class IdentifierConvertor : TypeConverter { /// - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) { if (sourceType == typeof(int) || sourceType == typeof(string)) return true; @@ -200,12 +199,12 @@ namespace Kyoo.Abstractions.Models.Utils } /// - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) { if (value is int id) return new Identifier(id); if (value is not string slug) - return base.ConvertFrom(context, culture, value); + return base.ConvertFrom(context, culture, value)!; return int.TryParse(slug, out id) ? new Identifier(id) : new Identifier(slug); diff --git a/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs b/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs index 652380d2..b566c195 100644 --- a/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs +++ b/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs @@ -20,6 +20,7 @@ using System; using System.IO; using System.Net.Http; using System.Threading.Tasks; +using BlurHashSharp.SkiaSharp; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; using Microsoft.Extensions.Logging; @@ -76,13 +77,13 @@ namespace Kyoo.Core.Controllers SKBitmap bitmap = SKBitmap.Decode(reader); bitmap.Resize(new SKSizeI(bitmap.Width, bitmap.Height), SKFilterQuality.High); - await _WriteTo(bitmap, $"{localPath}.{ImageQuality.Large.ToString().ToLowerInvariant()}.jpg"); + await _WriteTo(bitmap, $"{localPath}.{ImageQuality.High.ToString().ToLowerInvariant()}.jpg"); bitmap.Resize(new SKSizeI(bitmap.Width, bitmap.Height), SKFilterQuality.Medium); await _WriteTo(bitmap, $"{localPath}.{ImageQuality.Medium.ToString().ToLowerInvariant()}.jpg"); bitmap.Resize(new SKSizeI(bitmap.Width, bitmap.Height), SKFilterQuality.Low); - await _WriteTo(bitmap, $"{localPath}.{ImageQuality.Small.ToString().ToLowerInvariant()}.jpg"); + await _WriteTo(bitmap, $"{localPath}.{ImageQuality.Low.ToString().ToLowerInvariant()}.jpg"); } catch (Exception ex) { diff --git a/back/src/Kyoo.Core/Kyoo.Core.csproj b/back/src/Kyoo.Core/Kyoo.Core.csproj index 0839dfe5..332e4b6a 100644 --- a/back/src/Kyoo.Core/Kyoo.Core.csproj +++ b/back/src/Kyoo.Core/Kyoo.Core.csproj @@ -11,6 +11,7 @@ + diff --git a/back/src/Kyoo.Core/Views/Helper/CrudThumbsApi.cs b/back/src/Kyoo.Core/Views/Helper/CrudThumbsApi.cs index e2c9d6c4..9e6c95f5 100644 --- a/back/src/Kyoo.Core/Views/Helper/CrudThumbsApi.cs +++ b/back/src/Kyoo.Core/Views/Helper/CrudThumbsApi.cs @@ -65,7 +65,7 @@ namespace Kyoo.Core.Api ); if (resource == null) return NotFound(); - string path = _thumbs.GetImagePath(resource, image, quality ?? ImageQuality.Large); + string path = _thumbs.GetImagePath(resource, image, quality ?? ImageQuality.High); if (path == null || !System.IO.File.Exists(path)) return NotFound(); return PhysicalFile(Path.GetFullPath(path), "image/jpeg", true); diff --git a/scanner/providers/types/episode.py b/scanner/providers/types/episode.py index e374e0a7..f46eb488 100644 --- a/scanner/providers/types/episode.py +++ b/scanner/providers/types/episode.py @@ -40,9 +40,5 @@ class Episode: return { **asdict(self), **asdict(self.translations[default_language]), - # "poster": next(iter(self.translations[default_language].posters), None), - # "thumbnail": next(iter(self.translations[default_language].thumbnails), None), - # "logo": next(iter(self.translations[default_language].logos), None), - "thumbnail": None, "show": None, } diff --git a/scanner/providers/types/movie.py b/scanner/providers/types/movie.py index 1f70b8e3..64bcd9b5 100644 --- a/scanner/providers/types/movie.py +++ b/scanner/providers/types/movie.py @@ -50,9 +50,9 @@ class Movie: return { **asdict(self), **asdict(self.translations[default_language]), - # "poster": next(iter(self.translations[default_language].posters), None), - # "thumbnail": next(iter(self.translations[default_language].thumbnails), None), - # "logo": next(iter(self.translations[default_language].logos), None), + "poster": next(iter(self.translations[default_language].posters), None), + "thumbnail": next(iter(self.translations[default_language].thumbnails), None), + "logo": next(iter(self.translations[default_language].logos), None), "trailer": next(iter(self.translations[default_language].trailers), None), "studio": next((x.to_kyoo() for x in self.studios), None), "genres": [x.to_kyoo() for x in self.genres], diff --git a/scanner/providers/types/season.py b/scanner/providers/types/season.py index c234364e..0acfa350 100644 --- a/scanner/providers/types/season.py +++ b/scanner/providers/types/season.py @@ -30,7 +30,6 @@ class Season: return { **asdict(self), **asdict(self.translations[default_language]), - # "poster": next(iter(self.translations[default_language].posters), None), - # "thumbnail": next(iter(self.translations[default_language].thumbnails), None), - # "logo": next(iter(self.translations[default_language].logos), None), + "poster": next(iter(self.translations[default_language].posters), None), + "thumbnail": next(iter(self.translations[default_language].thumbnails), None), } diff --git a/scanner/providers/types/show.py b/scanner/providers/types/show.py index 069eff3e..306a77ec 100644 --- a/scanner/providers/types/show.py +++ b/scanner/providers/types/show.py @@ -54,9 +54,9 @@ class Show: **asdict(self.translations[default_language]), "studio": next((x.to_kyoo() for x in self.studios), None), "seasons": None, - # "poster": next(iter(self.translations[default_language].posters), None), - # "thumbnail": next(iter(self.translations[default_language].thumbnails), None), - # "logo": next(iter(self.translations[default_language].logos), None), + "poster": next(iter(self.translations[default_language].posters), None), + "thumbnail": next(iter(self.translations[default_language].thumbnails), None), + "logo": next(iter(self.translations[default_language].logos), None), "trailer": next(iter(self.translations[default_language].trailers), None), "genres": [x.to_kyoo() for x in self.genres], } diff --git a/scanner/providers/types/studio.py b/scanner/providers/types/studio.py index 756332a3..0ed11f6a 100644 --- a/scanner/providers/types/studio.py +++ b/scanner/providers/types/studio.py @@ -12,5 +12,5 @@ class Studio: def to_kyoo(self): return { **asdict(self), - # "logo": next(iter(self.logos), None), + "logo": next(iter(self.logos), None), }