using System; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using Jellyfin.Data.Enums; using MediaBrowser.Common; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Trickplay; using MediaBrowser.Model.IO; using Microsoft.Extensions.Logging; namespace Jellyfin.Server.Migrations.Routines; /// /// Migration to move trickplay files to the new directory. /// public class MoveTrickplayFiles : IMigrationRoutine { private readonly ITrickplayManager _trickplayManager; private readonly IFileSystem _fileSystem; private readonly ILibraryManager _libraryManager; private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// Instance of the interface. /// Instance of the interface. /// Instance of the interface. /// The logger. public MoveTrickplayFiles(ITrickplayManager trickplayManager, IFileSystem fileSystem, ILibraryManager libraryManager, ILogger logger) { _trickplayManager = trickplayManager; _fileSystem = fileSystem; _libraryManager = libraryManager; _logger = logger; } /// public Guid Id => new("4EF123D5-8EFF-4B0B-869D-3AED07A60E1B"); /// public string Name => "MoveTrickplayFiles"; /// public bool PerformOnNewInstall => true; /// public void Perform() { const int Limit = 100; int itemCount = 0, offset = 0, previousCount; var sw = Stopwatch.StartNew(); var trickplayQuery = new InternalItemsQuery { MediaTypes = [MediaType.Video], SourceTypes = [SourceType.Library], IsVirtualItem = false, IsFolder = false }; do { var trickplayInfos = _trickplayManager.GetTrickplayItemsAsync(Limit, offset).GetAwaiter().GetResult(); previousCount = trickplayInfos.Count; offset += Limit; trickplayQuery.ItemIds = trickplayInfos.Select(i => i.ItemId).Distinct().ToArray(); var items = _libraryManager.GetItemList(trickplayQuery); foreach (var trickplayInfo in trickplayInfos) { var item = items.OfType