TrickplayMoveImagesTask.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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.Entities;
  8. using MediaBrowser.Controller.Library;
  9. using MediaBrowser.Controller.Trickplay;
  10. using MediaBrowser.Model.Globalization;
  11. using MediaBrowser.Model.Tasks;
  12. using Microsoft.Extensions.Logging;
  13. namespace MediaBrowser.Providers.Trickplay;
  14. /// <summary>
  15. /// Class TrickplayMoveImagesTask.
  16. /// </summary>
  17. public class TrickplayMoveImagesTask : IScheduledTask
  18. {
  19. private readonly ILogger<TrickplayMoveImagesTask> _logger;
  20. private readonly ILibraryManager _libraryManager;
  21. private readonly ILocalizationManager _localization;
  22. private readonly ITrickplayManager _trickplayManager;
  23. /// <summary>
  24. /// Initializes a new instance of the <see cref="TrickplayMoveImagesTask"/> class.
  25. /// </summary>
  26. /// <param name="logger">The logger.</param>
  27. /// <param name="libraryManager">The library manager.</param>
  28. /// <param name="localization">The localization manager.</param>
  29. /// <param name="trickplayManager">The trickplay manager.</param>
  30. public TrickplayMoveImagesTask(
  31. ILogger<TrickplayMoveImagesTask> logger,
  32. ILibraryManager libraryManager,
  33. ILocalizationManager localization,
  34. ITrickplayManager trickplayManager)
  35. {
  36. _libraryManager = libraryManager;
  37. _logger = logger;
  38. _localization = localization;
  39. _trickplayManager = trickplayManager;
  40. }
  41. /// <inheritdoc />
  42. public string Name => _localization.GetLocalizedString("TaskMoveTrickplayImages");
  43. /// <inheritdoc />
  44. public string Description => _localization.GetLocalizedString("TaskMoveTrickplayImagesDescription");
  45. /// <inheritdoc />
  46. public string Key => "MoveTrickplayImages";
  47. /// <inheritdoc />
  48. public string Category => _localization.GetLocalizedString("TasksMaintenanceCategory");
  49. /// <inheritdoc />
  50. public IEnumerable<TaskTriggerInfo> GetDefaultTriggers() => [];
  51. /// <inheritdoc />
  52. public async Task ExecuteAsync(IProgress<double> progress, CancellationToken cancellationToken)
  53. {
  54. const int Limit = 100;
  55. int itemCount = 0, offset = 0, previousCount;
  56. // This count may not be accurate, but just get something to show progress on the dashboard.
  57. var totalVideoCount = _libraryManager.GetCount(new InternalItemsQuery
  58. {
  59. MediaTypes = [MediaType.Video],
  60. SourceTypes = [SourceType.Library],
  61. IsVirtualItem = false,
  62. IsFolder = false,
  63. Recursive = true
  64. });
  65. var trickplayQuery = new InternalItemsQuery
  66. {
  67. MediaTypes = [MediaType.Video],
  68. SourceTypes = [SourceType.Library],
  69. IsVirtualItem = false,
  70. IsFolder = false
  71. };
  72. do
  73. {
  74. var trickplayInfos = await _trickplayManager.GetTrickplayItemsAsync(Limit, offset).ConfigureAwait(false);
  75. previousCount = trickplayInfos.Count;
  76. offset += Limit;
  77. trickplayQuery.ItemIds = trickplayInfos.Select(i => i.ItemId).Distinct().ToArray();
  78. var items = _libraryManager.GetItemList(trickplayQuery);
  79. foreach (var trickplayInfo in trickplayInfos)
  80. {
  81. cancellationToken.ThrowIfCancellationRequested();
  82. var video = items.OfType<Video>().FirstOrDefault(i => i.Id.Equals(trickplayInfo.ItemId));
  83. if (video is null)
  84. {
  85. continue;
  86. }
  87. itemCount++;
  88. try
  89. {
  90. var libraryOptions = _libraryManager.GetLibraryOptions(video);
  91. await _trickplayManager.MoveGeneratedTrickplayDataAsync(video, libraryOptions, cancellationToken).ConfigureAwait(false);
  92. }
  93. catch (Exception ex)
  94. {
  95. _logger.LogError(ex, "Error moving trickplay files for {ItemName}", video.Name);
  96. }
  97. }
  98. progress.Report(100d * itemCount / totalVideoCount);
  99. } while (previousCount == Limit);
  100. progress.Report(100);
  101. }
  102. }