DefaultImageGenerator.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. {
  14. /// <summary>
  15. /// The default image generator.
  16. /// </summary>
  17. public class DefaultImageGenerator : IImageGenerator
  18. {
  19. private readonly IImageEncoder _imageEncoder;
  20. private readonly IItemRepository _itemRepository;
  21. private readonly ILogger _logger;
  22. /// <summary>
  23. /// Initializes a new instance of the <see cref="DefaultImageGenerator"/> class.
  24. /// </summary>
  25. /// <param name="imageEncoder">Instance of the <see cref="IImageEncoder"/> interface.</param>
  26. /// <param name="itemRepository">Instance of the <see cref="IItemRepository"/> interface.</param>
  27. /// <param name="logger">Instance of the <see cref="ILogger"/> interface.</param>
  28. public DefaultImageGenerator(
  29. IImageEncoder imageEncoder,
  30. IItemRepository itemRepository,
  31. ILogger<DefaultImageGenerator> logger)
  32. {
  33. _imageEncoder = imageEncoder;
  34. _itemRepository = itemRepository;
  35. _logger = logger;
  36. }
  37. /// <inheritdoc/>
  38. public GeneratedImages[] GetSupportedImages()
  39. {
  40. return new[] { GeneratedImages.Splashscreen };
  41. }
  42. /// <inheritdoc/>
  43. public void GenerateSplashscreen(SplashscreenOptions generationOptions)
  44. {
  45. var posters = GetItemsWithImageType(ImageType.Primary).Select(x => x.GetImages(ImageType.Primary).First().Path).ToList();
  46. var landscape = GetItemsWithImageType(ImageType.Thumb).Select(x => x.GetImages(ImageType.Thumb).First().Path).ToList();
  47. if (landscape.Count == 0)
  48. {
  49. // Thumb images fit better because they include the title in the image but are not provided with TMDb.
  50. // Using backdrops as a fallback to generate an image at all
  51. _logger.LogDebug("No thumb images found. Using backdrops to generate splashscreen.");
  52. landscape = GetItemsWithImageType(ImageType.Backdrop).Select(x => x.GetImages(ImageType.Backdrop).First().Path).ToList();
  53. }
  54. var splashBuilder = new SplashscreenBuilder((SkiaEncoder)_imageEncoder);
  55. splashBuilder.GenerateSplash(posters, landscape, generationOptions.OutputPath, generationOptions.ApplyFilter);
  56. }
  57. private IReadOnlyList<BaseItem> GetItemsWithImageType(ImageType imageType)
  58. {
  59. // todo make included libraries configurable
  60. return _itemRepository.GetItemList(new InternalItemsQuery
  61. {
  62. CollapseBoxSetItems = false,
  63. Recursive = true,
  64. DtoOptions = new DtoOptions(false),
  65. ImageTypes = new ImageType[] { imageType },
  66. Limit = 30,
  67. // todo max parental rating configurable
  68. MaxParentalRating = 10,
  69. OrderBy = new ValueTuple<string, SortOrder>[]
  70. {
  71. new ValueTuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending)
  72. },
  73. IncludeItemTypes = new string[] { "Movie", "Series" }
  74. });
  75. }
  76. }
  77. }