From dc3fa99ea5d48ef715836faf522482abb0f20fcf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 12 May 2014 14:04:42 -0400 Subject: [PATCH] stub out media stream selector --- .../MediaBrowser.Model.Portable.csproj | 3 + .../MediaBrowser.Model.net35.csproj | 3 + MediaBrowser.Model/MediaBrowser.Model.csproj | 1 + .../MediaInfo/MediaStreamSelector.cs | 91 +++++++++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 MediaBrowser.Model/MediaInfo/MediaStreamSelector.cs diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index ef59f88789..9ae4f4d5c5 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -560,6 +560,9 @@ MediaInfo\IBlurayExaminer.cs + + MediaInfo\MediaStreamSelector.cs + MediaInfo\SubtitleFormat.cs diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index 38ca640197..fddccc09a3 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -541,6 +541,9 @@ MediaInfo\IBlurayExaminer.cs + + MediaInfo\MediaStreamSelector.cs + MediaInfo\SubtitleFormat.cs diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index 2c714f8315..9bf52baedd 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -172,6 +172,7 @@ + diff --git a/MediaBrowser.Model/MediaInfo/MediaStreamSelector.cs b/MediaBrowser.Model/MediaInfo/MediaStreamSelector.cs new file mode 100644 index 0000000000..d498c3a32a --- /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 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 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 GetSortedStreams(IEnumerable 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(); + } + } +}