aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs
diff options
context:
space:
mode:
authorT. Adams <t.adams88@gmail.com>2015-04-03 11:04:25 -0700
committerT. Adams <t.adams88@gmail.com>2015-04-03 11:04:25 -0700
commitabf12569ba2aa31ea3a00e4faf3adad2f740cbd9 (patch)
tree47c57c6361825491d38e3def6b716926ddd9aa59 /MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs
parent46c92107490263f8e6abefbd2259780013fa195d (diff)
parentef505c8e9e2b8f348aeaa89be6bc446014b72996 (diff)
Merging in latest dev
Diffstat (limited to 'MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs')
-rw-r--r--MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs77
1 files changed, 73 insertions, 4 deletions
diff --git a/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs b/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs
index 57fddb2b1..a006a1723 100644
--- a/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs
+++ b/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs
@@ -41,8 +41,6 @@ namespace MediaBrowser.Controller.MediaEncoding
streams = GetSortedStreams(streams, MediaStreamType.Subtitle, preferredLanguages)
.ToList();
- var full = streams.Where(s => !s.IsForced);
-
MediaStream stream = null;
if (mode == SubtitlePlaybackMode.None)
@@ -55,13 +53,13 @@ namespace MediaBrowser.Controller.MediaEncoding
// if the audio language is not understood by the user, load their preferred subs, if there are any
if (!ContainsOrdinal(preferredLanguages, audioTrackLanguage))
{
- stream = full.FirstOrDefault(s => ContainsOrdinal(preferredLanguages, s.Language));
+ stream = streams.Where(s => !s.IsForced).FirstOrDefault(s => ContainsOrdinal(preferredLanguages, s.Language));
}
}
else if (mode == SubtitlePlaybackMode.Always)
{
// always load the most suitable full subtitles
- stream = full.FirstOrDefault();
+ stream = streams.FirstOrDefault(s => !s.IsForced);
}
// load forced subs if we have found no suitable full subtitles
@@ -97,6 +95,77 @@ namespace MediaBrowser.Controller.MediaEncoding
.ThenBy(i => i.Index);
}
+ public static void SetSubtitleStreamScores(List<MediaStream> streams,
+ List<string> preferredLanguages,
+ SubtitlePlaybackMode mode,
+ string audioTrackLanguage)
+ {
+ if (mode == SubtitlePlaybackMode.None)
+ {
+ return;
+ }
+
+ streams = GetSortedStreams(streams, MediaStreamType.Subtitle, preferredLanguages)
+ .ToList();
+
+ var filteredStreams = new List<MediaStream>();
+
+ if (mode == SubtitlePlaybackMode.Default)
+ {
+ // if the audio language is not understood by the user, load their preferred subs, if there are any
+ if (!ContainsOrdinal(preferredLanguages, audioTrackLanguage))
+ {
+ filteredStreams = streams.Where(s => !s.IsForced && ContainsOrdinal(preferredLanguages, s.Language))
+ .ToList();
+ }
+ }
+ else if (mode == SubtitlePlaybackMode.Always)
+ {
+ // always load the most suitable full subtitles
+ filteredStreams = streams.Where(s => !s.IsForced)
+ .ToList();
+ }
+
+ // load forced subs if we have found no suitable full subtitles
+ if (filteredStreams.Count == 0)
+ {
+ filteredStreams = streams
+ .Where(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase))
+ .ToList();
+ }
+
+ foreach (var stream in filteredStreams)
+ {
+ stream.Score = GetSubtitleScore(stream, preferredLanguages);
+ }
+ }
+
+ private static int GetSubtitleScore(MediaStream stream, List<string> languagePreferences)
+ {
+ var values = new List<int>();
+
+ var index = languagePreferences.FindIndex(l => string.Equals(stream.Language, l, StringComparison.OrdinalIgnoreCase));
+
+ values.Add(index == -1 ? 0 : 100 - index);
+
+ values.Add(stream.IsDefault ? 1 : 0);
+ values.Add(stream.SupportsExternalStream ? 1 : 0);
+ values.Add(stream.IsTextSubtitleStream ? 1 : 0);
+ values.Add(stream.IsExternal ? 1 : 0);
+
+ values.Reverse();
+ var scale = 1;
+ var score = 0;
+
+ foreach (var value in values)
+ {
+ score += scale * (value + 1);
+ scale *= 10;
+ }
+
+ return score;
+ }
+
private static int GetBooleanOrderBy(bool value)
{
return value ? 0 : 1;