From ecb73168b34e3d58dff186b6d90fb4bdd192e24a Mon Sep 17 00:00:00 2001 From: Cody Robibero Date: Mon, 10 Jan 2022 08:25:46 -0700 Subject: Suggestions from review --- .../Library/SplashscreenPostScanTask.cs | 79 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs (limited to 'Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs') diff --git a/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs b/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs new file mode 100644 index 000000000..65445d3af --- /dev/null +++ b/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Jellyfin.Data.Enums; +using MediaBrowser.Controller.Drawing; +using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Querying; +using Microsoft.Extensions.Logging; + +namespace Emby.Server.Implementations.Library; + +/// +/// The splashscreen post scan task. +/// +public class SplashscreenPostScanTask : ILibraryPostScanTask +{ + private readonly IItemRepository _itemRepository; + private readonly IImageEncoder _imageEncoder; + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + /// Instance of the interface. + /// Instance of the interface. + /// Instance of the interface. + public SplashscreenPostScanTask( + IItemRepository itemRepository, + IImageEncoder imageEncoder, + ILogger logger) + { + _itemRepository = itemRepository; + _imageEncoder = imageEncoder; + _logger = logger; + } + + /// + public Task Run(IProgress progress, CancellationToken cancellationToken) + { + var posters = GetItemsWithImageType(ImageType.Primary).Select(x => x.GetImages(ImageType.Primary).First().Path).ToList(); + var backdrops = GetItemsWithImageType(ImageType.Thumb).Select(x => x.GetImages(ImageType.Thumb).First().Path).ToList(); + if (backdrops.Count == 0) + { + // Thumb images fit better because they include the title in the image but are not provided with TMDb. + // Using backdrops as a fallback to generate an image at all + _logger.LogDebug("No thumb images found. Using backdrops to generate splashscreen"); + backdrops = GetItemsWithImageType(ImageType.Backdrop).Select(x => x.GetImages(ImageType.Backdrop).First().Path).ToList(); + } + + _imageEncoder.CreateSplashscreen(posters, backdrops); + return Task.CompletedTask; + } + + private IReadOnlyList GetItemsWithImageType(ImageType imageType) + { + // TODO make included libraries configurable + return _itemRepository.GetItemList(new InternalItemsQuery + { + CollapseBoxSetItems = false, + Recursive = true, + DtoOptions = new DtoOptions(false), + ImageTypes = new[] { imageType }, + Limit = 30, + // TODO max parental rating configurable + MaxParentalRating = 10, + OrderBy = new ValueTuple[] + { + new(ItemSortBy.Random, SortOrder.Ascending) + }, + IncludeItemTypes = new[] { BaseItemKind.Movie, BaseItemKind.Series } + }); + } +} -- cgit v1.2.3 From 6520ad03f055af5127b44d4afe310f0786bc6275 Mon Sep 17 00:00:00 2001 From: Cody Robibero Date: Mon, 10 Jan 2022 08:30:55 -0700 Subject: Fix release build --- .../Library/SplashscreenPostScanTask.cs | 2 +- MediaBrowser.Controller/Drawing/GeneratedImageType.cs | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 MediaBrowser.Controller/Drawing/GeneratedImageType.cs (limited to 'Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs') diff --git a/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs b/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs index 65445d3af..aed5711fa 100644 --- a/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs +++ b/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs @@ -29,7 +29,7 @@ public class SplashscreenPostScanTask : ILibraryPostScanTask /// /// Instance of the interface. /// Instance of the interface. - /// Instance of the interface. + /// Instance of the interface. public SplashscreenPostScanTask( IItemRepository itemRepository, IImageEncoder imageEncoder, diff --git a/MediaBrowser.Controller/Drawing/GeneratedImageType.cs b/MediaBrowser.Controller/Drawing/GeneratedImageType.cs deleted file mode 100644 index a8db86d4f..000000000 --- a/MediaBrowser.Controller/Drawing/GeneratedImageType.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MediaBrowser.Controller.Drawing; - -/// -/// Which generated image type the supports. -/// -public enum GeneratedImageType -{ - /// - /// The splashscreen. - /// - Splashscreen = 0 -} -- cgit v1.2.3 From 0d335082c8cf541637f4bcae1dc0399f649d24ce Mon Sep 17 00:00:00 2001 From: Cody Robibero Date: Mon, 10 Jan 2022 10:59:32 -0700 Subject: suggestions from review --- Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs | 4 ++-- Jellyfin.Api/Controllers/ImageController.cs | 2 +- Jellyfin.Drawing.Skia/SplashscreenBuilder.cs | 4 +--- MediaBrowser.Model/Branding/BrandingOptions.cs | 6 ------ 4 files changed, 4 insertions(+), 12 deletions(-) (limited to 'Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs') diff --git a/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs b/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs index aed5711fa..320685b1f 100644 --- a/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs +++ b/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs @@ -69,9 +69,9 @@ public class SplashscreenPostScanTask : ILibraryPostScanTask Limit = 30, // TODO max parental rating configurable MaxParentalRating = 10, - OrderBy = new ValueTuple[] + OrderBy = new[] { - new(ItemSortBy.Random, SortOrder.Ascending) + (ItemSortBy.Random, SortOrder.Ascending) }, IncludeItemTypes = new[] { BaseItemKind.Movie, BaseItemKind.Series } }); diff --git a/Jellyfin.Api/Controllers/ImageController.cs b/Jellyfin.Api/Controllers/ImageController.cs index b44a21d03..7cc526d21 100644 --- a/Jellyfin.Api/Controllers/ImageController.cs +++ b/Jellyfin.Api/Controllers/ImageController.cs @@ -1793,7 +1793,7 @@ namespace Jellyfin.Api.Controllers /// Uploads a custom splashscreen. /// /// A indicating success. - /// Sucessfully uploaded new splashscreen. + /// Successfully uploaded new splashscreen. /// Error reading MimeType from uploaded image. /// User does not have permission to upload splashscreen.. /// Error reading the image format. diff --git a/Jellyfin.Drawing.Skia/SplashscreenBuilder.cs b/Jellyfin.Drawing.Skia/SplashscreenBuilder.cs index 132c35e67..e5fa6c2bd 100644 --- a/Jellyfin.Drawing.Skia/SplashscreenBuilder.cs +++ b/Jellyfin.Drawing.Skia/SplashscreenBuilder.cs @@ -52,8 +52,6 @@ namespace Jellyfin.Drawing.Skia /// The created collage as a bitmap. private SKBitmap GenerateCollage(IReadOnlyList posters, IReadOnlyList backdrops) { - var random = new Random(); - var posterIndex = 0; var backdropIndex = 0; @@ -65,7 +63,7 @@ namespace Jellyfin.Drawing.Skia for (int i = 0; i < Rows; i++) { - int imageCounter = random.Next(0, 5); + int imageCounter = Random.Shared.Next(0, 5); int currentWidthPos = i * 75; int currentHeight = i * (posterHeight + Spacing); diff --git a/MediaBrowser.Model/Branding/BrandingOptions.cs b/MediaBrowser.Model/Branding/BrandingOptions.cs index 01db70885..cc42c1718 100644 --- a/MediaBrowser.Model/Branding/BrandingOptions.cs +++ b/MediaBrowser.Model/Branding/BrandingOptions.cs @@ -29,10 +29,4 @@ public class BrandingOptions /// [JsonIgnore] public string? SplashscreenLocation { get; set; } - - /// - /// Gets the splashscreen url. - /// - [XmlIgnore] - public string SplashscreenUrl => "/Branding/Splashscreen"; } -- cgit v1.2.3