PlaylistResolver.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #nullable disable
  2. using System;
  3. using System.IO;
  4. using System.Linq;
  5. using Jellyfin.Data.Enums;
  6. using Jellyfin.Extensions;
  7. using MediaBrowser.Controller.Library;
  8. using MediaBrowser.Controller.Playlists;
  9. using MediaBrowser.Controller.Resolvers;
  10. using MediaBrowser.LocalMetadata.Savers;
  11. namespace Emby.Server.Implementations.Library.Resolvers
  12. {
  13. /// <summary>
  14. /// <see cref="IItemResolver"/> for <see cref="Playlist"/> library items.
  15. /// </summary>
  16. public class PlaylistResolver : GenericFolderResolver<Playlist>
  17. {
  18. private readonly CollectionType?[] _musicPlaylistCollectionTypes =
  19. [
  20. null,
  21. CollectionType.music
  22. ];
  23. /// <inheritdoc/>
  24. protected override Playlist Resolve(ItemResolveArgs args)
  25. {
  26. if (args.IsDirectory)
  27. {
  28. // It's a playlist if the path is a directory with [playlist] in its name
  29. var filename = Path.GetFileName(Path.TrimEndingDirectorySeparator(args.Path));
  30. if (string.IsNullOrEmpty(filename))
  31. {
  32. return null;
  33. }
  34. if (filename.Contains("[playlist]", StringComparison.OrdinalIgnoreCase))
  35. {
  36. return new Playlist
  37. {
  38. Path = args.Path,
  39. Name = filename.Replace("[playlist]", string.Empty, StringComparison.OrdinalIgnoreCase).Trim(),
  40. OpenAccess = true
  41. };
  42. }
  43. // It's a directory-based playlist if the directory contains a playlist file
  44. var filePaths = Directory.EnumerateFiles(args.Path, "*", new EnumerationOptions { IgnoreInaccessible = true });
  45. if (filePaths.Any(f => f.EndsWith(PlaylistXmlSaver.DefaultPlaylistFilename, StringComparison.OrdinalIgnoreCase)))
  46. {
  47. return new Playlist
  48. {
  49. Path = args.Path,
  50. Name = filename,
  51. OpenAccess = true
  52. };
  53. }
  54. }
  55. // Check if this is a music playlist file
  56. // It should have the correct collection type and a supported file extension
  57. else if (_musicPlaylistCollectionTypes.Contains(args.CollectionType))
  58. {
  59. var extension = Path.GetExtension(args.Path.AsSpan());
  60. if (Playlist.SupportedExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
  61. {
  62. return new Playlist
  63. {
  64. Path = args.Path,
  65. Name = Path.GetFileNameWithoutExtension(args.Path),
  66. IsInMixedFolder = true,
  67. PlaylistMediaType = MediaType.Audio,
  68. OpenAccess = true
  69. };
  70. }
  71. }
  72. return null;
  73. }
  74. }
  75. }