DefaultImageGenerator.cs 3.2 KB

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