aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs
diff options
context:
space:
mode:
authorJPVenson <JPVenson@users.noreply.github.com>2024-09-07 22:56:51 +0200
committerGitHub <noreply@github.com>2024-09-07 14:56:51 -0600
commit5ceedced1c4a8bac5b5b7a5f2bd0913783bd427b (patch)
treee655f4307f550761b855c2acaddb83dd6ecfa11c /Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs
parentfc247dab9243b3de42193c4be351636204dbc2f2 (diff)
Feature/media segments plugin api (#12359)
Diffstat (limited to 'Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs')
-rw-r--r--Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs118
1 files changed, 118 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs b/Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs
new file mode 100644
index 000000000..d6fad7526
--- /dev/null
+++ b/Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs
@@ -0,0 +1,118 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using Jellyfin.Data.Enums;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Dto;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Model.Globalization;
+using MediaBrowser.Model.Tasks;
+
+namespace Emby.Server.Implementations.ScheduledTasks.Tasks;
+
+/// <summary>
+/// Task to obtain media segments.
+/// </summary>
+public class MediaSegmentExtractionTask : IScheduledTask
+{
+ /// <summary>
+ /// The library manager.
+ /// </summary>
+ private readonly ILibraryManager _libraryManager;
+ private readonly ILocalizationManager _localization;
+ private readonly IMediaSegmentManager _mediaSegmentManager;
+ private static readonly BaseItemKind[] _itemTypes = [BaseItemKind.Episode, BaseItemKind.Movie, BaseItemKind.Audio, BaseItemKind.AudioBook];
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MediaSegmentExtractionTask" /> class.
+ /// </summary>
+ /// <param name="libraryManager">The library manager.</param>
+ /// <param name="localization">The localization manager.</param>
+ /// <param name="mediaSegmentManager">The segment manager.</param>
+ public MediaSegmentExtractionTask(ILibraryManager libraryManager, ILocalizationManager localization, IMediaSegmentManager mediaSegmentManager)
+ {
+ _libraryManager = libraryManager;
+ _localization = localization;
+ _mediaSegmentManager = mediaSegmentManager;
+ }
+
+ /// <inheritdoc/>
+ public string Name => _localization.GetLocalizedString("TaskExtractMediaSegments");
+
+ /// <inheritdoc/>
+ public string Description => _localization.GetLocalizedString("TaskExtractMediaSegmentsDescription");
+
+ /// <inheritdoc/>
+ public string Category => _localization.GetLocalizedString("TasksLibraryCategory");
+
+ /// <inheritdoc/>
+ public string Key => "TaskExtractMediaSegments";
+
+ /// <inheritdoc/>
+ public async Task ExecuteAsync(IProgress<double> progress, CancellationToken cancellationToken)
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ progress.Report(0);
+
+ var pagesize = 100;
+
+ var query = new InternalItemsQuery
+ {
+ MediaTypes = new[] { MediaType.Video, MediaType.Audio },
+ IsVirtualItem = false,
+ IncludeItemTypes = _itemTypes,
+ DtoOptions = new DtoOptions(true),
+ SourceTypes = new[] { SourceType.Library },
+ Recursive = true,
+ Limit = pagesize
+ };
+
+ var numberOfVideos = _libraryManager.GetCount(query);
+
+ var startIndex = 0;
+ var numComplete = 0;
+
+ while (startIndex < numberOfVideos)
+ {
+ query.StartIndex = startIndex;
+
+ var baseItems = _libraryManager.GetItemList(query);
+ var currentPageCount = baseItems.Count;
+ // TODO parallelize with Parallel.ForEach?
+ for (var i = 0; i < currentPageCount; i++)
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var item = baseItems[i];
+ // Only local files supported
+ if (item.IsFileProtocol && File.Exists(item.Path))
+ {
+ await _mediaSegmentManager.RunSegmentPluginProviders(item, false, cancellationToken).ConfigureAwait(false);
+ }
+
+ // Update progress
+ numComplete++;
+ double percent = (double)numComplete / numberOfVideos;
+ progress.Report(100 * percent);
+ }
+
+ startIndex += pagesize;
+ }
+
+ progress.Report(100);
+ }
+
+ /// <inheritdoc/>
+ public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
+ {
+ yield return new TaskTriggerInfo
+ {
+ Type = TaskTriggerInfo.TriggerInterval,
+ IntervalTicks = TimeSpan.FromHours(12).Ticks
+ };
+ }
+}