diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-05-12 14:04:42 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-05-12 14:04:42 -0400 |
| commit | dc3fa99ea5d48ef715836faf522482abb0f20fcf (patch) | |
| tree | 6ae78913f9ee74f6958d58115521c096c905dc33 | |
| parent | 631442883085b10e36675fca5117fa3a49a608e0 (diff) | |
stub out media stream selector
4 files changed, 98 insertions, 0 deletions
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index ef59f8878..9ae4f4d5c 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -560,6 +560,9 @@ <Compile Include="..\MediaBrowser.Model\MediaInfo\IBlurayExaminer.cs"> <Link>MediaInfo\IBlurayExaminer.cs</Link> </Compile> + <Compile Include="..\MediaBrowser.Model\MediaInfo\MediaStreamSelector.cs"> + <Link>MediaInfo\MediaStreamSelector.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\MediaInfo\SubtitleFormat.cs"> <Link>MediaInfo\SubtitleFormat.cs</Link> </Compile> diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index 38ca64019..fddccc09a 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -541,6 +541,9 @@ <Compile Include="..\MediaBrowser.Model\MediaInfo\IBlurayExaminer.cs"> <Link>MediaInfo\IBlurayExaminer.cs</Link> </Compile> + <Compile Include="..\MediaBrowser.Model\MediaInfo\MediaStreamSelector.cs"> + <Link>MediaInfo\MediaStreamSelector.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\MediaInfo\SubtitleFormat.cs"> <Link>MediaInfo\SubtitleFormat.cs</Link> </Compile> diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index 2c714f831..9bf52baed 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -172,6 +172,7 @@ <Compile Include="Logging\NullLogger.cs" /> <Compile Include="MediaInfo\AudioCodec.cs" /> <Compile Include="MediaInfo\Container.cs" /> + <Compile Include="MediaInfo\MediaStreamSelector.cs" /> <Compile Include="MediaInfo\SubtitleFormat.cs" /> <Compile Include="MediaInfo\TransportStreamTimestamp.cs" /> <Compile Include="MediaInfo\VideoCodec.cs" /> diff --git a/MediaBrowser.Model/MediaInfo/MediaStreamSelector.cs b/MediaBrowser.Model/MediaInfo/MediaStreamSelector.cs new file mode 100644 index 000000000..d498c3a32 --- /dev/null +++ b/MediaBrowser.Model/MediaInfo/MediaStreamSelector.cs @@ -0,0 +1,91 @@ +using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MediaBrowser.Model.MediaInfo +{ + public static class MediaStreamSelector + { + public static int? GetDefaultAudioStreamIndex(MediaSourceInfo mediaSource, IEnumerable<string> preferredLanguages, bool preferDefaultTrack) + { + var streams = GetSortedStreams(mediaSource.MediaStreams, MediaStreamType.Audio, preferredLanguages.FirstOrDefault()) + .ToList(); + + if (preferDefaultTrack) + { + var defaultStream = streams.FirstOrDefault(i => i.IsDefault); + + if (defaultStream != null) + { + return defaultStream.Index; + } + } + + var stream = streams.FirstOrDefault(); + + if (stream != null) + { + return stream.Index; + } + + return null; + } + + public static int? GetDefaultSubtitleStreamIndex(MediaSourceInfo mediaSource, + IEnumerable<string> preferredLanguages, + SubtitlePlaybackMode mode, + string audioTrackLanguage) + { + var streams = GetSortedStreams(mediaSource.MediaStreams, MediaStreamType.Subtitle, preferredLanguages.FirstOrDefault()) + .ToList(); + + MediaStream stream = null; + + if (mode == SubtitlePlaybackMode.Default) + { + stream = streams.FirstOrDefault(i => i.IsDefault); + } + else if (mode == SubtitlePlaybackMode.Always) + { + stream = streams.FirstOrDefault(i => i.IsDefault) ?? + streams.FirstOrDefault(); + } + else if (mode == SubtitlePlaybackMode.OnlyForced) + { + stream = streams.FirstOrDefault(i => i.IsForced); + } + + if (stream != null) + { + return stream.Index; + } + + return null; + } + + private static IEnumerable<MediaStream> GetSortedStreams(IEnumerable<MediaStream> streams, MediaStreamType type, string defaultLanguage) + { + var orderStreams = streams + .Where(i => i.Type == type); + + // For subs give a preference to text for performance + + if (string.IsNullOrEmpty(defaultLanguage)) + { + return orderStreams.OrderBy(i => i.IsDefault) + .ThenBy(i => !i.IsGraphicalSubtitleStream) + .ThenBy(i => i.Index) + .ToList(); + } + + return orderStreams.OrderBy(i => string.Equals(i.Language, defaultLanguage, StringComparison.OrdinalIgnoreCase)) + .ThenBy(i => i.IsDefault) + .ThenBy(i => !i.IsGraphicalSubtitleStream) + .ThenBy(i => i.Index) + .ToList(); + } + } +} |
