< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.Library.Resolvers.PlaylistResolver
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/Library/Resolvers/PlaylistResolver.cs
Line coverage
40%
Covered lines: 16
Uncovered lines: 24
Coverable lines: 40
Total lines: 92
Line coverage: 40%
Branch coverage
66%
Covered branches: 8
Total branches: 12
Branch coverage: 66.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 3/26/2026 - 12:14:14 AM Line coverage: 41.6% (15/36) Branch coverage: 66.6% (8/12) Total lines: 827/6/2026 - 12:16:28 AM Line coverage: 40% (16/40) Branch coverage: 66.6% (8/12) Total lines: 92 3/26/2026 - 12:14:14 AM Line coverage: 41.6% (15/36) Branch coverage: 66.6% (8/12) Total lines: 827/6/2026 - 12:16:28 AM Line coverage: 40% (16/40) Branch coverage: 66.6% (8/12) Total lines: 92

Coverage delta

Coverage delta 2 -2

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
Resolve(...)66.66%581231.42%

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/Library/Resolvers/PlaylistResolver.cs

#LineLine coverage
 1#nullable disable
 2
 3using System;
 4using System.Collections.Generic;
 5using System.IO;
 6using System.Linq;
 7using Jellyfin.Data.Enums;
 8using Jellyfin.Extensions;
 9using MediaBrowser.Controller.Library;
 10using MediaBrowser.Controller.Playlists;
 11using MediaBrowser.Controller.Resolvers;
 12using MediaBrowser.LocalMetadata.Savers;
 13
 14namespace Emby.Server.Implementations.Library.Resolvers
 15{
 16    /// <summary>
 17    /// <see cref="IItemResolver"/> for <see cref="Playlist"/> library items.
 18    /// </summary>
 19    public class PlaylistResolver : GenericFolderResolver<Playlist>
 20    {
 2221        private readonly CollectionType?[] _musicPlaylistCollectionTypes =
 2222        [
 2223            null,
 2224            CollectionType.music
 2225        ];
 26
 27        /// <inheritdoc/>
 28        protected override Playlist Resolve(ItemResolveArgs args)
 29        {
 6130            if (args.IsDirectory)
 31            {
 32                // It's a playlist if the path is a directory with [playlist] in its name
 5133                var filename = Path.GetFileName(Path.TrimEndingDirectorySeparator(args.Path));
 5134                if (string.IsNullOrEmpty(filename))
 35                {
 036                    return null;
 37                }
 38
 5139                if (filename.Contains("[playlist]", StringComparison.OrdinalIgnoreCase))
 40                {
 041                    return new Playlist
 042                    {
 043                        Path = args.Path,
 044                        Name = filename.Replace("[playlist]", string.Empty, StringComparison.OrdinalIgnoreCase).Trim(),
 045                        OpenAccess = true
 046                    };
 47                }
 48
 49                // It's a directory-based playlist if the directory contains a playlist file
 50                IEnumerable<string> filePaths;
 51                try
 52                {
 5153                    filePaths = Directory.EnumerateFiles(args.Path, "*", new EnumerationOptions { IgnoreInaccessible = t
 5154                }
 055                catch (IOException)
 56                {
 057                    return null;
 58                }
 59
 5160                if (filePaths.Any(f => f.EndsWith(PlaylistXmlSaver.DefaultPlaylistFilename, StringComparison.OrdinalIgno
 61                {
 062                    return new Playlist
 063                    {
 064                        Path = args.Path,
 065                        Name = filename,
 066                        OpenAccess = true
 067                    };
 68                }
 69            }
 70
 71            // Check if this is a music playlist file
 72            // It should have the correct collection type and a supported file extension
 1073            else if (_musicPlaylistCollectionTypes.Contains(args.CollectionType))
 74            {
 1075                var extension = Path.GetExtension(args.Path.AsSpan());
 1076                if (Playlist.SupportedExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
 77                {
 078                    return new Playlist
 079                    {
 080                        Path = args.Path,
 081                        Name = Path.GetFileNameWithoutExtension(args.Path),
 082                        IsInMixedFolder = true,
 083                        PlaylistMediaType = MediaType.Audio,
 084                        OpenAccess = true
 085                    };
 86                }
 87            }
 88
 6189            return null;
 090        }
 91    }
 92}