diff --git a/MediaBrowser.Providers/Playlists/PlaylistItemsProvider.cs b/MediaBrowser.Providers/Playlists/PlaylistItemsProvider.cs index 2a2ddb298..256ca617b 100644 --- a/MediaBrowser.Providers/Playlists/PlaylistItemsProvider.cs +++ b/MediaBrowser.Providers/Playlists/PlaylistItemsProvider.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Jellyfin.Data.Enums; using Jellyfin.Extensions; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; @@ -25,10 +26,13 @@ namespace MediaBrowser.Providers.Playlists IHasItemChangeMonitor { private readonly ILogger _logger; + private readonly ILibraryManager _libraryManager; + private readonly CollectionType[] _ignoredCollections = [CollectionType.livetv, CollectionType.boxsets, CollectionType.playlists]; - public PlaylistItemsProvider(ILogger logger) + public PlaylistItemsProvider(ILogger logger, ILibraryManager libraryManager) { _logger = logger; + _libraryManager = libraryManager; } public string Name => "Playlist Reader"; @@ -59,80 +63,87 @@ namespace MediaBrowser.Providers.Playlists private IEnumerable GetItems(string path, string extension) { + var libraryRoots = _libraryManager.GetUserRootFolder().Children + .OfType() + .Where(f => f.CollectionType.HasValue && !_ignoredCollections.Contains(f.CollectionType.Value)) + .SelectMany(f => f.PhysicalLocations) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + using (var stream = File.OpenRead(path)) { if (string.Equals(".wpl", extension, StringComparison.OrdinalIgnoreCase)) { - return GetWplItems(stream, path); + return GetWplItems(stream, path, libraryRoots); } if (string.Equals(".zpl", extension, StringComparison.OrdinalIgnoreCase)) { - return GetZplItems(stream, path); + return GetZplItems(stream, path, libraryRoots); } if (string.Equals(".m3u", extension, StringComparison.OrdinalIgnoreCase)) { - return GetM3uItems(stream, path); + return GetM3uItems(stream, path, libraryRoots); } if (string.Equals(".m3u8", extension, StringComparison.OrdinalIgnoreCase)) { - return GetM3uItems(stream, path); + return GetM3uItems(stream, path, libraryRoots); } if (string.Equals(".pls", extension, StringComparison.OrdinalIgnoreCase)) { - return GetPlsItems(stream, path); + return GetPlsItems(stream, path, libraryRoots); } } return Enumerable.Empty(); } - private IEnumerable GetPlsItems(Stream stream, string path) + private IEnumerable GetPlsItems(Stream stream, string playlistPath, List libraryRoots) { var content = new PlsContent(); var playlist = content.GetFromStream(stream); return playlist.PlaylistEntries - .Select(i => GetLinkedChild(i.Path, path)) + .Select(i => GetLinkedChild(i.Path, playlistPath, libraryRoots)) .Where(i => i is not null); } - private IEnumerable GetM3uItems(Stream stream, string path) + private IEnumerable GetM3uItems(Stream stream, string playlistPath, List libraryRoots) { var content = new M3uContent(); var playlist = content.GetFromStream(stream); return playlist.PlaylistEntries - .Select(i => GetLinkedChild(i.Path, path)) + .Select(i => GetLinkedChild(i.Path, playlistPath, libraryRoots)) .Where(i => i is not null); } - private IEnumerable GetZplItems(Stream stream, string path) + private IEnumerable GetZplItems(Stream stream, string playlistPath, List libraryRoots) { var content = new ZplContent(); var playlist = content.GetFromStream(stream); return playlist.PlaylistEntries - .Select(i => GetLinkedChild(i.Path, path)) + .Select(i => GetLinkedChild(i.Path, playlistPath, libraryRoots)) .Where(i => i is not null); } - private IEnumerable GetWplItems(Stream stream, string path) + private IEnumerable GetWplItems(Stream stream, string playlistPath, List libraryRoots) { var content = new WplContent(); var playlist = content.GetFromStream(stream); return playlist.PlaylistEntries - .Select(i => GetLinkedChild(i.Path, path)) + .Select(i => GetLinkedChild(i.Path, playlistPath, libraryRoots)) .Where(i => i is not null); } - private LinkedChild GetLinkedChild(string itemPath, string playlistPath) + private LinkedChild GetLinkedChild(string itemPath, string playlistPath, List libraryRoots) { - if (TryGetPlaylistItemPath(itemPath, playlistPath, out var parsedPath)) + if (TryGetPlaylistItemPath(itemPath, playlistPath, libraryRoots, out var parsedPath)) { return new LinkedChild { @@ -144,23 +155,20 @@ namespace MediaBrowser.Providers.Playlists return null; } - private bool TryGetPlaylistItemPath(string itemPath, string playlistPath, out string path) + private bool TryGetPlaylistItemPath(string itemPath, string playlistPath, List libraryPaths, out string path) { path = null; var baseFolder = Path.GetDirectoryName(playlistPath); - - if (itemPath.StartsWith(baseFolder, StringComparison.OrdinalIgnoreCase) && File.Exists(itemPath)) - { - path = itemPath; - return true; - } - var basePath = Path.Combine(baseFolder, itemPath); var fullPath = Path.GetFullPath(basePath); - if (fullPath.StartsWith(baseFolder, StringComparison.OrdinalIgnoreCase) && File.Exists(fullPath)) + + foreach (var libraryPath in libraryPaths) { - path = fullPath; - return true; + if (fullPath.StartsWith(libraryPath, StringComparison.OrdinalIgnoreCase) && File.Exists(fullPath)) + { + path = fullPath; + return true; + } } return false;