#nullable disable #pragma warning disable CS1591 using System; using System.IO; using System.Linq; using Jellyfin.Extensions; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Playlists; using MediaBrowser.Controller.Resolvers; using MediaBrowser.LocalMetadata.Savers; using MediaBrowser.Model.Entities; namespace Emby.Server.Implementations.Library.Resolvers { /// /// for library items. /// public class PlaylistResolver : GenericFolderResolver { private string[] _musicPlaylistCollectionTypes = { string.Empty, CollectionType.Music }; /// protected override Playlist Resolve(ItemResolveArgs args) { if (args.IsDirectory) { // It's a boxset if the path is a directory with [playlist] in it's the name // TODO: Should this use Path.GetDirectoryName() instead? bool isBoxSet = Path.GetFileName(args.Path) ?.Contains("[playlist]", StringComparison.OrdinalIgnoreCase) ?? false; if (isBoxSet) { return new Playlist { Path = args.Path, Name = Path.GetFileName(args.Path).Replace("[playlist]", string.Empty, StringComparison.OrdinalIgnoreCase).Trim() }; } // It's a directory-based playlist if the directory contains a playlist file var filePaths = Directory.EnumerateFiles(args.Path, "*", new EnumerationOptions { IgnoreInaccessible = true }); if (filePaths.Any(f => f.EndsWith(PlaylistXmlSaver.DefaultPlaylistFilename, StringComparison.OrdinalIgnoreCase))) { return new Playlist { Path = args.Path, Name = Path.GetFileName(args.Path) }; } } // Check if this is a music playlist file // It should have the correct collection type and a supported file extension else if (_musicPlaylistCollectionTypes.Contains(args.CollectionType ?? string.Empty, StringComparison.OrdinalIgnoreCase)) { var extension = Path.GetExtension(args.Path); if (Playlist.SupportedExtensions.Contains(extension ?? string.Empty, StringComparison.OrdinalIgnoreCase)) { return new Playlist { Path = args.Path, Name = Path.GetFileNameWithoutExtension(args.Path), IsInMixedFolder = true, PlaylistMediaType = MediaType.Audio }; } } return null; } } }