diff --git a/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs b/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
index 861037c1fe..73e31279f4 100644
--- a/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
+++ b/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
@@ -455,16 +455,18 @@ public class TrickplayManager : ITrickplayManager
}
///
- public async Task> GetTrickplayItemsAsync()
+ public async Task> GetTrickplayItemsAsync(int limit, int offset)
{
- List trickplayItems;
+ IReadOnlyList trickplayItems;
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
await using (dbContext.ConfigureAwait(false))
{
trickplayItems = await dbContext.TrickplayInfos
.AsNoTracking()
- .Select(i => i.ItemId)
+ .OrderBy(i => i.ItemId)
+ .Skip(offset)
+ .Take(limit)
.ToListAsync()
.ConfigureAwait(false);
}
diff --git a/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs b/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs
index 301541b6ce..c1a9e88949 100644
--- a/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs
+++ b/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs
@@ -1,10 +1,15 @@
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;
@@ -16,6 +21,7 @@ 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.
@@ -23,11 +29,13 @@ public class MoveTrickplayFiles : IMigrationRoutine
/// Instance of the interface.
/// Instance of the interface.
/// Instance of the interface.
- public MoveTrickplayFiles(ITrickplayManager trickplayManager, IFileSystem fileSystem, ILibraryManager libraryManager)
+ /// The logger.
+ public MoveTrickplayFiles(ITrickplayManager trickplayManager, IFileSystem fileSystem, ILibraryManager libraryManager, ILogger logger)
{
_trickplayManager = trickplayManager;
_fileSystem = fileSystem;
_libraryManager = libraryManager;
+ _logger = logger;
}
///
@@ -42,26 +50,49 @@ public class MoveTrickplayFiles : IMigrationRoutine
///
public void Perform()
{
- var trickplayItems = _trickplayManager.GetTrickplayItemsAsync().GetAwaiter().GetResult();
- foreach (var itemId in trickplayItems)
- {
- var resolutions = _trickplayManager.GetTrickplayResolutions(itemId).GetAwaiter().GetResult();
- var item = _libraryManager.GetItemById(itemId);
- if (item is null)
- {
- continue;
- }
+ const int Limit = 100;
+ int itemCount = 0, offset = 0, previousCount;
- foreach (var resolution in resolutions)
+ 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 oldPath = GetOldTrickplayDirectory(item, resolution.Key);
- var newPath = _trickplayManager.GetTrickplayDirectory(item, resolution.Value.TileWidth, resolution.Value.TileHeight, resolution.Value.Width, false);
+ var item = items.OfType