using System; using System.Collections.Generic; using System.Linq; using Jellyfin.Data.Enums; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using Microsoft.Extensions.Logging; namespace Jellyfin.Drawing.Skia; /// /// The default image generator. /// public class DefaultImageGenerator : IImageGenerator { private readonly IImageEncoder _imageEncoder; private readonly IItemRepository _itemRepository; private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// Instance of the interface. /// Instance of the interface. /// Instance of the interface. public DefaultImageGenerator( IImageEncoder imageEncoder, IItemRepository itemRepository, ILogger logger) { _imageEncoder = imageEncoder; _itemRepository = itemRepository; _logger = logger; } /// public IReadOnlyList GetSupportedImages() { return new[] { GeneratedImageType.Splashscreen }; } /// public void Generate(GeneratedImageType imageTypeType, string outputPath) { var posters = GetItemsWithImageType(ImageType.Primary).Select(x => x.GetImages(ImageType.Primary).First().Path).ToList(); var landscape = GetItemsWithImageType(ImageType.Thumb).Select(x => x.GetImages(ImageType.Thumb).First().Path).ToList(); if (landscape.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"); landscape = GetItemsWithImageType(ImageType.Backdrop).Select(x => x.GetImages(ImageType.Backdrop).First().Path).ToList(); } var splashBuilder = new SplashscreenBuilder((SkiaEncoder)_imageEncoder); splashBuilder.GenerateSplash(posters, landscape, outputPath); } 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 } }); } }