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[] { (ItemSortBy.Random, SortOrder.Ascending) }, IncludeItemTypes = new[] { BaseItemKind.Movie, BaseItemKind.Series } }); } }