< Summary - Jellyfin

Information
Class: Jellyfin.Server.Migrations.Routines.FixPlaylistOwner
Assembly: jellyfin
File(s): /srv/git/jellyfin/Jellyfin.Server/Migrations/Routines/FixPlaylistOwner.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 24
Coverable lines: 24
Total lines: 70
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 8
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
Perform()0%7280%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Linq;
 3using System.Threading;
 4
 5using Jellyfin.Data.Enums;
 6using MediaBrowser.Controller.Entities;
 7using MediaBrowser.Controller.Library;
 8using MediaBrowser.Controller.Playlists;
 9using Microsoft.Extensions.Logging;
 10
 11namespace Jellyfin.Server.Migrations.Routines;
 12
 13/// <summary>
 14/// Properly set playlist owner.
 15/// </summary>
 16#pragma warning disable CS0618 // Type or member is obsolete
 17[JellyfinMigration("2025-04-20T15:00:00", nameof(FixPlaylistOwner), "615DFA9E-2497-4DBB-A472-61938B752C5B")]
 18internal class FixPlaylistOwner : IMigrationRoutine
 19#pragma warning restore CS0618 // Type or member is obsolete
 20{
 21    private readonly ILogger<FixPlaylistOwner> _logger;
 22    private readonly ILibraryManager _libraryManager;
 23    private readonly IPlaylistManager _playlistManager;
 24
 25    public FixPlaylistOwner(
 26        ILogger<FixPlaylistOwner> logger,
 27        ILibraryManager libraryManager,
 28        IPlaylistManager playlistManager)
 29    {
 030        _logger = logger;
 031        _libraryManager = libraryManager;
 032        _playlistManager = playlistManager;
 033    }
 34
 35    /// <inheritdoc/>
 36    public void Perform()
 37    {
 038        var playlists = _libraryManager.GetItemList(new InternalItemsQuery
 039        {
 040            IncludeItemTypes = new[] { BaseItemKind.Playlist }
 041        })
 042        .Cast<Playlist>()
 043        .Where(x => x.OwnerUserId.Equals(Guid.Empty))
 044        .ToArray();
 45
 046        if (playlists.Length > 0)
 47        {
 048            foreach (var playlist in playlists)
 49            {
 050                var shares = playlist.Shares;
 051                if (shares.Count > 0)
 52                {
 053                    var firstEditShare = shares.First(x => x.CanEdit);
 054                    if (firstEditShare is not null)
 55                    {
 056                        playlist.OwnerUserId = firstEditShare.UserId;
 057                        playlist.Shares = shares.Where(x => x != firstEditShare).ToArray();
 058                        playlist.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, CancellationToken.None).GetAwaiter
 059                        _playlistManager.SavePlaylistFile(playlist);
 60                    }
 61                }
 62                else
 63                {
 064                    playlist.OpenAccess = true;
 065                    playlist.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, CancellationToken.None).GetAwaiter().G
 66                }
 67            }
 68        }
 069    }
 70}