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) { // Prefer embedded metadata over smart logic filteredStreams = streams.Where(s => s.IsForced || s.IsDefault) .ToList(); } else if (mode == SubtitlePlaybackMode.Smart) { // Prefer smart logic over embedded metadata // 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(); } else if (mode == SubtitlePlaybackMode.OnlyForced) { // 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); } }
public static int?GetDefaultSubtitleStreamIndex( IEnumerable <MediaStream> streams, string[] preferredLanguages, SubtitlePlaybackMode mode, string audioTrackLanguage) { MediaStream stream = null; if (mode == SubtitlePlaybackMode.None) { return(null); } var sortedStreams = streams .Where(i => i.Type == MediaStreamType.Subtitle) .OrderByDescending(x => x.IsExternal) .ThenByDescending(x => x.IsForced && string.Equals(x.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) .ThenByDescending(x => x.IsForced) .ThenByDescending(x => x.IsDefault) .ToList(); if (mode == SubtitlePlaybackMode.Default) { // Prefer embedded metadata over smart logic stream = sortedStreams.FirstOrDefault(s => s.IsExternal || s.IsForced || s.IsDefault); // if the audio language is not understood by the user, load their preferred subs, if there are any if (stream == null && !preferredLanguages.Contains(audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) { stream = sortedStreams.FirstOrDefault(s => !s.IsForced && preferredLanguages.Contains(s.Language, StringComparison.OrdinalIgnoreCase)); } } else if (mode == SubtitlePlaybackMode.Smart) { // if the audio language is not understood by the user, load their preferred subs, if there are any if (!preferredLanguages.Contains(audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) { stream = streams.FirstOrDefault(s => !s.IsForced && preferredLanguages.Contains(s.Language, StringComparison.OrdinalIgnoreCase)) ?? streams.FirstOrDefault(s => preferredLanguages.Contains(s.Language, StringComparison.OrdinalIgnoreCase)); } } else if (mode == SubtitlePlaybackMode.Always) { // always load the most suitable full subtitles stream = sortedStreams.FirstOrDefault(s => !s.IsForced); } else if (mode == SubtitlePlaybackMode.OnlyForced) { // always load the most suitable full subtitles stream = sortedStreams.FirstOrDefault(x => x.IsForced); } // load forced subs if we have found no suitable full subtitles stream ??= sortedStreams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)); return(stream?.Index); }
public static void SetSubtitleStreamScores( IReadOnlyList <MediaStream> streams, IReadOnlyList <string> preferredLanguages, SubtitlePlaybackMode mode, string audioTrackLanguage) { if (mode == SubtitlePlaybackMode.None) { return; } var sortedStreams = GetSortedStreams(streams, MediaStreamType.Subtitle, preferredLanguages); var filteredStreams = new List <MediaStream>(); if (mode == SubtitlePlaybackMode.Default) { // Prefer embedded metadata over smart logic filteredStreams = sortedStreams.Where(s => s.IsForced || s.IsDefault) .ToList(); } else if (mode == SubtitlePlaybackMode.Smart) { // Prefer smart logic over embedded metadata if (!preferredLanguages.Contains(audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) { filteredStreams = sortedStreams.Where(s => !s.IsForced && preferredLanguages.Contains(s.Language, StringComparison.OrdinalIgnoreCase)) .ToList(); } } else if (mode == SubtitlePlaybackMode.Always) { // always load the most suitable full subtitles filteredStreams = sortedStreams.Where(s => !s.IsForced).ToList(); } else if (mode == SubtitlePlaybackMode.OnlyForced) { // always load the most suitable full subtitles filteredStreams = sortedStreams.Where(s => s.IsForced).ToList(); } // load forced subs if we have found no suitable full subtitles var iterStreams = filteredStreams.Count == 0 ? sortedStreams.Where(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) : filteredStreams; foreach (var stream in iterStreams) { stream.Score = GetSubtitleScore(stream, preferredLanguages); } }
public static int?GetDefaultSubtitleStreamIndex(List <MediaStream> streams, IEnumerable <string> preferredLanguages, SubtitlePlaybackMode mode, string audioTrackLanguage) { var languages = preferredLanguages.ToList(); streams = GetSortedStreams(streams, MediaStreamType.Subtitle, languages).ToList(); var full = streams.Where(s => !s.IsForced); var forced = streams.Where(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)); MediaStream stream = null; if (mode == SubtitlePlaybackMode.None) { return(null); } if (mode == SubtitlePlaybackMode.Default) { // if the audio language is not understood by the user, load their preferred subs, if there are any if (!ContainsOrdinal(languages, audioTrackLanguage)) { stream = full.FirstOrDefault(s => ContainsOrdinal(languages, s.Language)); } } else if (mode == SubtitlePlaybackMode.Always) { // always load the most suitable full subtitles stream = full.FirstOrDefault(); } // load forced subs if we have found no suitable full subtitles stream = stream ?? forced.FirstOrDefault(); if (stream != null) { return(stream.Index); } return(null); }
public static int? GetDefaultSubtitleStreamIndex(List<MediaStream> streams, IEnumerable<string> preferredLanguages, SubtitlePlaybackMode mode, string audioTrackLanguage) { var languages = preferredLanguages.ToList(); streams = GetSortedStreams(streams, MediaStreamType.Subtitle, languages).ToList(); var full = streams.Where(s => !s.IsForced); var forced = streams.Where(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)); MediaStream stream = null; if (mode == SubtitlePlaybackMode.None) { return null; } if (mode == SubtitlePlaybackMode.Default) { // if the audio language is not understood by the user, load their preferred subs, if there are any if (!ContainsOrdinal(languages, audioTrackLanguage)) { stream = full.FirstOrDefault(s => ContainsOrdinal(languages, s.Language)); } } else if (mode == SubtitlePlaybackMode.Always) { // always load the most suitable full subtitles stream = full.FirstOrDefault(); } // load forced subs if we have found no suitable full subtitles stream = stream ?? forced.FirstOrDefault(); if (stream != null) { return stream.Index; } return null; }
public static int?GetDefaultSubtitleStreamIndex(List <MediaStream> streams, string[] preferredLanguages, SubtitlePlaybackMode mode, string audioTrackLanguage) { streams = GetSortedStreams(streams, MediaStreamType.Subtitle, preferredLanguages) .ToList(); MediaStream stream = null; if (mode == SubtitlePlaybackMode.None) { return(null); } if (mode == SubtitlePlaybackMode.Default) { // Prefer embedded metadata over smart logic stream = streams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) ?? streams.FirstOrDefault(s => s.IsForced) ?? streams.FirstOrDefault(s => s.IsDefault); // if the audio language is not understood by the user, load their preferred subs, if there are any if (stream == null && !preferredLanguages.Contains(audioTrackLanguage, StringComparer.OrdinalIgnoreCase)) { stream = streams.Where(s => !s.IsForced).FirstOrDefault(s => preferredLanguages.Contains(s.Language, StringComparer.OrdinalIgnoreCase)); } } else if (mode == SubtitlePlaybackMode.Smart) { // Prefer smart logic over embedded metadata // if the audio language is not understood by the user, load their preferred subs, if there are any if (!preferredLanguages.Contains(audioTrackLanguage, StringComparer.OrdinalIgnoreCase)) { stream = streams.Where(s => !s.IsForced).FirstOrDefault(s => preferredLanguages.Contains(s.Language, StringComparer.OrdinalIgnoreCase)) ?? streams.FirstOrDefault(s => preferredLanguages.Contains(s.Language, StringComparer.OrdinalIgnoreCase)); } } else if (mode == SubtitlePlaybackMode.Always) { // always load the most suitable full subtitles stream = streams.FirstOrDefault(s => !s.IsForced); } else if (mode == SubtitlePlaybackMode.OnlyForced) { // always load the most suitable full subtitles stream = streams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) ?? streams.FirstOrDefault(s => s.IsForced); } // load forced subs if we have found no suitable full subtitles stream = stream ?? streams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)); if (stream != null) { return(stream.Index); } return(null); }
public static int? GetDefaultSubtitleStreamIndex(List<MediaStream> streams, List<string> preferredLanguages, SubtitlePlaybackMode mode, string audioTrackLanguage) { streams = GetSortedStreams(streams, MediaStreamType.Subtitle, preferredLanguages) .ToList(); MediaStream stream = null; if (mode == SubtitlePlaybackMode.None) { return null; } if (mode == SubtitlePlaybackMode.Default) { // Prefer embedded metadata over smart logic stream = streams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) ?? streams.FirstOrDefault(s => s.IsForced) ?? streams.FirstOrDefault(s => s.IsDefault); // if the audio language is not understood by the user, load their preferred subs, if there are any if (stream == null && !ContainsOrdinal(preferredLanguages, audioTrackLanguage)) { stream = streams.Where(s => !s.IsForced).FirstOrDefault(s => ContainsOrdinal(preferredLanguages, s.Language)); } } else if (mode == SubtitlePlaybackMode.Smart) { // Prefer smart logic over embedded metadata // if the audio language is not understood by the user, load their preferred subs, if there are any if (!ContainsOrdinal(preferredLanguages, audioTrackLanguage)) { 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 = streams.FirstOrDefault(s => !s.IsForced); } else if (mode == SubtitlePlaybackMode.OnlyForced) { // always load the most suitable full subtitles stream = streams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) ?? streams.FirstOrDefault(s => s.IsForced); } // load forced subs if we have found no suitable full subtitles stream = stream ?? streams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)); if (stream != null) { return stream.Index; } return null; }
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) { // Prefer embedded metadata over smart logic filteredStreams = streams.Where(s => s.IsForced || s.IsDefault) .ToList(); } else if (mode == SubtitlePlaybackMode.Smart) { // Prefer smart logic over embedded metadata // 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(); } else if (mode == SubtitlePlaybackMode.OnlyForced) { // 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); } }