< Summary - Jellyfin

Information
Class: Jellyfin.Server.Migrations.Routines.MoveTrickplayFiles
Assembly: jellyfin
File(s): /srv/git/jellyfin/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 49
Coverable lines: 49
Total lines: 125
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 16
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

0255075100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
get_Id()100%210%
get_Name()100%210%
get_PerformOnNewInstall()100%210%
Perform()0%156120%
GetOldTrickplayDirectory(...)0%620%
GetNewOldTrickplayDirectory(...)0%620%

File(s)

/srv/git/jellyfin/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs

#LineLine coverage
 1using System;
 2using System.Diagnostics;
 3using System.Globalization;
 4using System.IO;
 5using System.Linq;
 6using Jellyfin.Data.Enums;
 7using MediaBrowser.Controller.Entities;
 8using MediaBrowser.Controller.Library;
 9using MediaBrowser.Controller.Trickplay;
 10using MediaBrowser.Model.IO;
 11using Microsoft.Extensions.Logging;
 12
 13namespace Jellyfin.Server.Migrations.Routines;
 14
 15/// <summary>
 16/// Migration to move trickplay files to the new directory.
 17/// </summary>
 18public class MoveTrickplayFiles : IDatabaseMigrationRoutine
 19{
 20    private readonly ITrickplayManager _trickplayManager;
 21    private readonly IFileSystem _fileSystem;
 22    private readonly ILibraryManager _libraryManager;
 23    private readonly ILogger<MoveTrickplayFiles> _logger;
 24
 25    /// <summary>
 26    /// Initializes a new instance of the <see cref="MoveTrickplayFiles"/> class.
 27    /// </summary>
 28    /// <param name="trickplayManager">Instance of the <see cref="ITrickplayManager"/> interface.</param>
 29    /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
 30    /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
 31    /// <param name="logger">The logger.</param>
 32    public MoveTrickplayFiles(ITrickplayManager trickplayManager, IFileSystem fileSystem, ILibraryManager libraryManager
 33    {
 034        _trickplayManager = trickplayManager;
 035        _fileSystem = fileSystem;
 036        _libraryManager = libraryManager;
 037        _logger = logger;
 038    }
 39
 40    /// <inheritdoc />
 041    public Guid Id => new("9540D44A-D8DC-11EF-9CBB-B77274F77C52");
 42
 43    /// <inheritdoc />
 044    public string Name => "MoveTrickplayFiles";
 45
 46    /// <inheritdoc />
 047    public bool PerformOnNewInstall => true;
 48
 49    /// <inheritdoc />
 50    public void Perform()
 51    {
 52        const int Limit = 100;
 053        int itemCount = 0, offset = 0, previousCount;
 54
 055        var sw = Stopwatch.StartNew();
 056        var trickplayQuery = new InternalItemsQuery
 057        {
 058            MediaTypes = [MediaType.Video],
 059            SourceTypes = [SourceType.Library],
 060            IsVirtualItem = false,
 061            IsFolder = false
 062        };
 63
 64        do
 65        {
 066            var trickplayInfos = _trickplayManager.GetTrickplayItemsAsync(Limit, offset).GetAwaiter().GetResult();
 067            previousCount = trickplayInfos.Count;
 068            offset += Limit;
 69
 070            trickplayQuery.ItemIds = trickplayInfos.Select(i => i.ItemId).Distinct().ToArray();
 071            var items = _libraryManager.GetItemList(trickplayQuery);
 072            foreach (var trickplayInfo in trickplayInfos)
 73            {
 074                var item = items.OfType<Video>().FirstOrDefault(i => i.Id.Equals(trickplayInfo.ItemId));
 075                if (item is null)
 76                {
 77                    continue;
 78                }
 79
 080                if (++itemCount % 1_000 == 0)
 81                {
 082                    _logger.LogInformation("Moved {Count} items in {Time}", itemCount, sw.Elapsed);
 83                }
 84
 085                var oldPath = GetOldTrickplayDirectory(item, trickplayInfo.Width);
 086                var newPath = _trickplayManager.GetTrickplayDirectory(item, trickplayInfo.TileWidth, trickplayInfo.TileH
 087                if (_fileSystem.DirectoryExists(oldPath))
 88                {
 089                    _fileSystem.MoveDirectory(oldPath, newPath);
 90                }
 91
 092                oldPath = GetNewOldTrickplayDirectory(item, trickplayInfo.TileWidth, trickplayInfo.TileHeight, trickplay
 093                if (_fileSystem.DirectoryExists(oldPath))
 94                {
 095                    _fileSystem.MoveDirectory(oldPath, newPath);
 96                }
 97            }
 098        } while (previousCount == Limit);
 99
 0100        _logger.LogInformation("Moved {Count} items in {Time}", itemCount, sw.Elapsed);
 0101    }
 102
 103    private string GetOldTrickplayDirectory(BaseItem item, int? width = null)
 104    {
 0105        var path = Path.Combine(item.GetInternalMetadataPath(), "trickplay");
 106
 0107        return width.HasValue ? Path.Combine(path, width.Value.ToString(CultureInfo.InvariantCulture)) : path;
 108    }
 109
 110    private string GetNewOldTrickplayDirectory(BaseItem item, int tileWidth, int tileHeight, int width, bool saveWithMed
 111    {
 0112        var path = saveWithMedia
 0113            ? Path.Combine(item.ContainingFolderPath, Path.ChangeExtension(item.Path, ".trickplay"))
 0114            : Path.Combine(item.GetInternalMetadataPath(), "trickplay");
 115
 0116        var subdirectory = string.Format(
 0117            CultureInfo.InvariantCulture,
 0118            "{0} - {1}x{2}",
 0119            width.ToString(CultureInfo.InvariantCulture),
 0120            tileWidth.ToString(CultureInfo.InvariantCulture),
 0121            tileHeight.ToString(CultureInfo.InvariantCulture));
 122
 0123        return Path.Combine(path, subdirectory);
 124    }
 125}