PlaylistResolver.cs 3.0 KB

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