PlaylistResolver.cs 2.9 KB

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