2
0

MediaSegmentExtractionTask.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using Jellyfin.Data.Enums;
  7. using MediaBrowser.Controller.Dto;
  8. using MediaBrowser.Controller.Entities;
  9. using MediaBrowser.Controller.Library;
  10. using MediaBrowser.Controller.MediaSegments;
  11. using MediaBrowser.Model.Globalization;
  12. using MediaBrowser.Model.Tasks;
  13. namespace Emby.Server.Implementations.ScheduledTasks.Tasks;
  14. /// <summary>
  15. /// Task to obtain media segments.
  16. /// </summary>
  17. public class MediaSegmentExtractionTask : IScheduledTask
  18. {
  19. /// <summary>
  20. /// The library manager.
  21. /// </summary>
  22. private readonly ILibraryManager _libraryManager;
  23. private readonly ILocalizationManager _localization;
  24. private readonly IMediaSegmentManager _mediaSegmentManager;
  25. private static readonly BaseItemKind[] _itemTypes = [BaseItemKind.Episode, BaseItemKind.Movie, BaseItemKind.Audio, BaseItemKind.AudioBook];
  26. /// <summary>
  27. /// Initializes a new instance of the <see cref="MediaSegmentExtractionTask" /> class.
  28. /// </summary>
  29. /// <param name="libraryManager">The library manager.</param>
  30. /// <param name="localization">The localization manager.</param>
  31. /// <param name="mediaSegmentManager">The segment manager.</param>
  32. public MediaSegmentExtractionTask(ILibraryManager libraryManager, ILocalizationManager localization, IMediaSegmentManager mediaSegmentManager)
  33. {
  34. _libraryManager = libraryManager;
  35. _localization = localization;
  36. _mediaSegmentManager = mediaSegmentManager;
  37. }
  38. /// <inheritdoc/>
  39. public string Name => _localization.GetLocalizedString("TaskExtractMediaSegments");
  40. /// <inheritdoc/>
  41. public string Description => _localization.GetLocalizedString("TaskExtractMediaSegmentsDescription");
  42. /// <inheritdoc/>
  43. public string Category => _localization.GetLocalizedString("TasksLibraryCategory");
  44. /// <inheritdoc/>
  45. public string Key => "TaskExtractMediaSegments";
  46. /// <inheritdoc/>
  47. public async Task ExecuteAsync(IProgress<double> progress, CancellationToken cancellationToken)
  48. {
  49. cancellationToken.ThrowIfCancellationRequested();
  50. progress.Report(0);
  51. var pagesize = 100;
  52. var query = new InternalItemsQuery
  53. {
  54. MediaTypes = [MediaType.Video, MediaType.Audio],
  55. IsVirtualItem = false,
  56. IncludeItemTypes = _itemTypes,
  57. DtoOptions = new DtoOptions(true),
  58. SourceTypes = [SourceType.Library],
  59. Recursive = true,
  60. Limit = pagesize
  61. };
  62. var numberOfVideos = _libraryManager.GetCount(query);
  63. var startIndex = 0;
  64. var numComplete = 0;
  65. while (startIndex < numberOfVideos)
  66. {
  67. query.StartIndex = startIndex;
  68. var baseItems = _libraryManager.GetItemList(query);
  69. var currentPageCount = baseItems.Count;
  70. // TODO parallelize with Parallel.ForEach?
  71. for (var i = 0; i < currentPageCount; i++)
  72. {
  73. cancellationToken.ThrowIfCancellationRequested();
  74. var item = baseItems[i];
  75. // Only local files supported
  76. if (item.IsFileProtocol && File.Exists(item.Path))
  77. {
  78. var libraryOptions = _libraryManager.GetLibraryOptions(item);
  79. await _mediaSegmentManager.RunSegmentPluginProviders(item, libraryOptions, false, cancellationToken).ConfigureAwait(false);
  80. }
  81. // Update progress
  82. numComplete++;
  83. double percent = (double)numComplete / numberOfVideos;
  84. progress.Report(100 * percent);
  85. }
  86. startIndex += pagesize;
  87. }
  88. progress.Report(100);
  89. }
  90. /// <inheritdoc/>
  91. public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
  92. {
  93. yield return new TaskTriggerInfo
  94. {
  95. Type = TaskTriggerInfoType.IntervalTrigger,
  96. IntervalTicks = TimeSpan.FromHours(12).Ticks
  97. };
  98. }
  99. }