SplashscreenPostScanTask.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using Jellyfin.Data.Enums;
  7. using MediaBrowser.Controller.Drawing;
  8. using MediaBrowser.Controller.Dto;
  9. using MediaBrowser.Controller.Entities;
  10. using MediaBrowser.Controller.Library;
  11. using MediaBrowser.Controller.Persistence;
  12. using MediaBrowser.Model.Entities;
  13. using MediaBrowser.Model.Querying;
  14. using Microsoft.Extensions.Logging;
  15. namespace Emby.Server.Implementations.Library;
  16. /// <summary>
  17. /// The splashscreen post scan task.
  18. /// </summary>
  19. public class SplashscreenPostScanTask : ILibraryPostScanTask
  20. {
  21. private readonly IItemRepository _itemRepository;
  22. private readonly IImageEncoder _imageEncoder;
  23. private readonly ILogger<SplashscreenPostScanTask> _logger;
  24. /// <summary>
  25. /// Initializes a new instance of the <see cref="SplashscreenPostScanTask"/> class.
  26. /// </summary>
  27. /// <param name="itemRepository">Instance of the <see cref="IItemRepository"/> interface.</param>
  28. /// <param name="imageEncoder">Instance of the <see cref="IImageEncoder"/> interface.</param>
  29. /// <param name="logger">Instance of the <see cref="ILogger{SplashscreenPostScanTask}"/> interface.</param>
  30. public SplashscreenPostScanTask(
  31. IItemRepository itemRepository,
  32. IImageEncoder imageEncoder,
  33. ILogger<SplashscreenPostScanTask> logger)
  34. {
  35. _itemRepository = itemRepository;
  36. _imageEncoder = imageEncoder;
  37. _logger = logger;
  38. }
  39. /// <inheritdoc />
  40. public Task Run(IProgress<double> progress, CancellationToken cancellationToken)
  41. {
  42. var posters = GetItemsWithImageType(ImageType.Primary).Select(x => x.GetImages(ImageType.Primary).First().Path).ToList();
  43. var backdrops = GetItemsWithImageType(ImageType.Thumb).Select(x => x.GetImages(ImageType.Thumb).First().Path).ToList();
  44. if (backdrops.Count == 0)
  45. {
  46. // Thumb images fit better because they include the title in the image but are not provided with TMDb.
  47. // Using backdrops as a fallback to generate an image at all
  48. _logger.LogDebug("No thumb images found. Using backdrops to generate splashscreen");
  49. backdrops = GetItemsWithImageType(ImageType.Backdrop).Select(x => x.GetImages(ImageType.Backdrop).First().Path).ToList();
  50. }
  51. _imageEncoder.CreateSplashscreen(posters, backdrops);
  52. return Task.CompletedTask;
  53. }
  54. private IReadOnlyList<BaseItem> GetItemsWithImageType(ImageType imageType)
  55. {
  56. // TODO make included libraries configurable
  57. return _itemRepository.GetItemList(new InternalItemsQuery
  58. {
  59. CollapseBoxSetItems = false,
  60. Recursive = true,
  61. DtoOptions = new DtoOptions(false),
  62. ImageTypes = new[] { imageType },
  63. Limit = 30,
  64. // TODO max parental rating configurable
  65. MaxParentalRating = 10,
  66. OrderBy = new[]
  67. {
  68. (ItemSortBy.Random, SortOrder.Ascending)
  69. },
  70. IncludeItemTypes = new[] { BaseItemKind.Movie, BaseItemKind.Series }
  71. });
  72. }
  73. }