aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs
diff options
context:
space:
mode:
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;