aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs')
-rw-r--r--MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs97
1 files changed, 96 insertions, 1 deletions
diff --git a/MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs b/MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs
index f846aa5dec..fbec4e9634 100644
--- a/MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs
+++ b/MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs
@@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Emby.Naming.Common;
using Emby.Naming.ExternalFiles;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Dlna;
@@ -148,7 +149,49 @@ namespace MediaBrowser.Providers.MediaInfo
}
}
- return mediaStreams.AsReadOnly();
+ return mediaStreams;
+ }
+
+ /// <summary>
+ /// Retrieves the external streams for the provided audio.
+ /// </summary>
+ /// <param name="audio">The <see cref="Audio"/> object to search external streams for.</param>
+ /// <param name="startIndex">The stream index to start adding external streams at.</param>
+ /// <param name="directoryService">The directory service to search for files.</param>
+ /// <param name="clearCache">True if the directory service cache should be cleared before searching.</param>
+ /// <returns>The external streams located.</returns>
+ public IReadOnlyList<MediaStream> GetExternalStreams(
+ Audio audio,
+ int startIndex,
+ IDirectoryService directoryService,
+ bool clearCache)
+ {
+ if (!audio.IsFileProtocol)
+ {
+ return Array.Empty<MediaStream>();
+ }
+
+ var pathInfos = GetExternalFiles(audio, directoryService, clearCache);
+
+ if (pathInfos.Count == 0)
+ {
+ return Array.Empty<MediaStream>();
+ }
+
+ var mediaStreams = new MediaStream[pathInfos.Count];
+
+ for (var i = 0; i < pathInfos.Count; i++)
+ {
+ mediaStreams[i] = new MediaStream
+ {
+ Type = MediaStreamType.Lyric,
+ Path = pathInfos[i].Path,
+ Language = pathInfos[i].Language,
+ Index = startIndex++
+ };
+ }
+
+ return mediaStreams;
}
/// <summary>
@@ -210,6 +253,58 @@ namespace MediaBrowser.Providers.MediaInfo
}
/// <summary>
+ /// Returns the external file infos for the given audio.
+ /// </summary>
+ /// <param name="audio">The <see cref="Audio"/> object to search external files for.</param>
+ /// <param name="directoryService">The directory service to search for files.</param>
+ /// <param name="clearCache">True if the directory service cache should be cleared before searching.</param>
+ /// <returns>The external file paths located.</returns>
+ public IReadOnlyList<ExternalPathParserResult> GetExternalFiles(
+ Audio audio,
+ IDirectoryService directoryService,
+ bool clearCache)
+ {
+ if (!audio.IsFileProtocol)
+ {
+ return Array.Empty<ExternalPathParserResult>();
+ }
+
+ string folder = audio.ContainingFolderPath;
+ var files = directoryService.GetFilePaths(folder, clearCache, true).ToList();
+ files.Remove(audio.Path);
+ var internalMetadataPath = audio.GetInternalMetadataPath();
+ if (_fileSystem.DirectoryExists(internalMetadataPath))
+ {
+ files.AddRange(directoryService.GetFilePaths(internalMetadataPath, clearCache, true));
+ }
+
+ if (files.Count == 0)
+ {
+ return Array.Empty<ExternalPathParserResult>();
+ }
+
+ var externalPathInfos = new List<ExternalPathParserResult>();
+ ReadOnlySpan<char> prefix = audio.FileNameWithoutExtension;
+ foreach (var file in files)
+ {
+ var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file.AsSpan());
+ if (fileNameWithoutExtension.Length >= prefix.Length
+ && prefix.Equals(fileNameWithoutExtension[..prefix.Length], StringComparison.OrdinalIgnoreCase)
+ && (fileNameWithoutExtension.Length == prefix.Length || _namingOptions.MediaFlagDelimiters.Contains(fileNameWithoutExtension[prefix.Length])))
+ {
+ var externalPathInfo = _externalPathParser.ParseFile(file, fileNameWithoutExtension[prefix.Length..].ToString());
+
+ if (externalPathInfo is not null)
+ {
+ externalPathInfos.Add(externalPathInfo);
+ }
+ }
+ }
+
+ return externalPathInfos;
+ }
+
+ /// <summary>
/// Returns the media info of the given file.
/// </summary>
/// <param name="path">The path to the file.</param>