< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.Library.SplashscreenPostScanTask
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs
Line coverage
100%
Covered lines: 38
Uncovered lines: 0
Coverable lines: 38
Total lines: 91
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Run(...)100%22100%
GetItemsWithImageType(...)100%11100%

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Threading;
 5using System.Threading.Tasks;
 6using Jellyfin.Data.Enums;
 7using Jellyfin.Database.Implementations.Enums;
 8using MediaBrowser.Controller.Drawing;
 9using MediaBrowser.Controller.Dto;
 10using MediaBrowser.Controller.Entities;
 11using MediaBrowser.Controller.Library;
 12using MediaBrowser.Controller.Persistence;
 13using MediaBrowser.Model.Entities;
 14using Microsoft.Extensions.Logging;
 15
 16namespace Emby.Server.Implementations.Library;
 17
 18/// <summary>
 19/// The splashscreen post scan task.
 20/// </summary>
 21public class SplashscreenPostScanTask : ILibraryPostScanTask
 22{
 23    private readonly IItemRepository _itemRepository;
 24    private readonly IImageEncoder _imageEncoder;
 25    private readonly ILogger<SplashscreenPostScanTask> _logger;
 26
 27    /// <summary>
 28    /// Initializes a new instance of the <see cref="SplashscreenPostScanTask"/> class.
 29    /// </summary>
 30    /// <param name="itemRepository">Instance of the <see cref="IItemRepository"/> interface.</param>
 31    /// <param name="imageEncoder">Instance of the <see cref="IImageEncoder"/> interface.</param>
 32    /// <param name="logger">Instance of the <see cref="ILogger{SplashscreenPostScanTask}"/> interface.</param>
 33    public SplashscreenPostScanTask(
 34        IItemRepository itemRepository,
 35        IImageEncoder imageEncoder,
 36        ILogger<SplashscreenPostScanTask> logger)
 37    {
 2138        _itemRepository = itemRepository;
 2139        _imageEncoder = imageEncoder;
 2140        _logger = logger;
 2141    }
 42
 43    /// <inheritdoc />
 44    public Task Run(IProgress<double> progress, CancellationToken cancellationToken)
 45    {
 746        var posters = GetItemsWithImageType(ImageType.Primary)
 747            .Select(x => x.GetImages(ImageType.Primary).FirstOrDefault()?.Path)
 748            .Where(path => !string.IsNullOrEmpty(path))
 749            .Select(path => path!)
 750            .ToList();
 751        var backdrops = GetItemsWithImageType(ImageType.Thumb)
 752            .Select(x => x.GetImages(ImageType.Thumb).FirstOrDefault()?.Path)
 753            .Where(path => !string.IsNullOrEmpty(path))
 754            .Select(path => path!)
 755            .ToList();
 756        if (backdrops.Count == 0)
 57        {
 58            // Thumb images fit better because they include the title in the image but are not provided with TMDb.
 59            // Using backdrops as a fallback to generate an image at all
 760            _logger.LogDebug("No thumb images found. Using backdrops to generate splashscreen");
 761            backdrops = GetItemsWithImageType(ImageType.Backdrop)
 762                .Select(x => x.GetImages(ImageType.Backdrop).FirstOrDefault()?.Path)
 763                .Where(path => !string.IsNullOrEmpty(path))
 764                .Select(path => path!)
 765                .ToList();
 66        }
 67
 768        _imageEncoder.CreateSplashscreen(posters, backdrops);
 769        return Task.CompletedTask;
 70    }
 71
 72    private IReadOnlyList<BaseItem> GetItemsWithImageType(ImageType imageType)
 73    {
 74        // TODO make included libraries configurable
 2175        return _itemRepository.GetItemList(new InternalItemsQuery
 2176        {
 2177            CollapseBoxSetItems = false,
 2178            Recursive = true,
 2179            DtoOptions = new DtoOptions(false),
 2180            ImageTypes = [imageType],
 2181            Limit = 30,
 2182            // TODO max parental rating configurable
 2183            MaxParentalRating = new(10, null),
 2184            OrderBy =
 2185            [
 2186                (ItemSortBy.Random, SortOrder.Ascending)
 2187            ],
 2188            IncludeItemTypes = [BaseItemKind.Movie, BaseItemKind.Series]
 2189        });
 90    }
 91}