From b9abc004a7f86af8df4d0e6599611eafdc5800bc Mon Sep 17 00:00:00 2001 From: jgriff6 <74262798+jgriff6@users.noreply.github.com> Date: Wed, 28 Sep 2022 22:26:42 +0100 Subject: [PATCH 1/3] Fix subtitle selection behaviour --- .../Library/MediaStreamSelector.cs | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/Emby.Server.Implementations/Library/MediaStreamSelector.cs b/Emby.Server.Implementations/Library/MediaStreamSelector.cs index 20a2edb05a..1e6a7c51eb 100644 --- a/Emby.Server.Implementations/Library/MediaStreamSelector.cs +++ b/Emby.Server.Implementations/Library/MediaStreamSelector.cs @@ -45,42 +45,40 @@ namespace Emby.Server.Implementations.Library .ThenByDescending(x => x.IsForced && string.Equals(x.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) .ThenByDescending(x => x.IsForced) .ThenByDescending(x => x.IsDefault) + .ThenByDescending(x => preferredLanguages.Contains(x.Language, StringComparison.OrdinalIgnoreCase)) .ToList(); MediaStream? stream = null; 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)); - } + // Load subtitles according to external, forced and default flags. + stream = sortedStreams.FirstOrDefault(x => x.IsExternal || x.IsForced || x.IsDefault); } else if (mode == SubtitlePlaybackMode.Smart) { - // if the audio language is not understood by the user, load their preferred subs, if there are any + // Respect forced flag. + stream = sortedStreams.FirstOrDefault(x => x.IsForced); + + // Only attempt to load subtitles if the audio language is not one of the user's preferred subtitle languages. + // If no subtitles of preferred language available, use default behaviour. 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)); + stream = sortedStreams.FirstOrDefault(x => preferredLanguages.Contains(x.Language, StringComparison.OrdinalIgnoreCase)) ?? + sortedStreams.FirstOrDefault(x => x.IsExternal || x.IsForced || x.IsDefault); } } else if (mode == SubtitlePlaybackMode.Always) { - // always load the most suitable full subtitles - stream = sortedStreams.FirstOrDefault(s => !s.IsForced); + // Always load subtitles of the user's preferred subtitle language if possible, otherwise default behaviour. + stream = sortedStreams.FirstOrDefault(x => preferredLanguages.Contains(x.Language, StringComparison.OrdinalIgnoreCase)) ?? + sortedStreams.FirstOrDefault(x => x.IsExternal || x.IsForced || x.IsDefault); } else if (mode == SubtitlePlaybackMode.OnlyForced) { - // always load the most suitable full subtitles + // Only load subtitles that are flagged forced. 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; } From fbeec04da725266ce7c4a57a7c598badb861b0fa Mon Sep 17 00:00:00 2001 From: jgriff6 <74262798+jgriff6@users.noreply.github.com> Date: Fri, 7 Oct 2022 14:17:20 +0100 Subject: [PATCH 2/3] Polish smart subtitle selection logic --- .../Library/MediaStreamSelector.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Emby.Server.Implementations/Library/MediaStreamSelector.cs b/Emby.Server.Implementations/Library/MediaStreamSelector.cs index 1e6a7c51eb..c77290aebf 100644 --- a/Emby.Server.Implementations/Library/MediaStreamSelector.cs +++ b/Emby.Server.Implementations/Library/MediaStreamSelector.cs @@ -56,9 +56,6 @@ namespace Emby.Server.Implementations.Library } else if (mode == SubtitlePlaybackMode.Smart) { - // Respect forced flag. - stream = sortedStreams.FirstOrDefault(x => x.IsForced); - // Only attempt to load subtitles if the audio language is not one of the user's preferred subtitle languages. // If no subtitles of preferred language available, use default behaviour. if (!preferredLanguages.Contains(audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) @@ -66,6 +63,11 @@ namespace Emby.Server.Implementations.Library stream = sortedStreams.FirstOrDefault(x => preferredLanguages.Contains(x.Language, StringComparison.OrdinalIgnoreCase)) ?? sortedStreams.FirstOrDefault(x => x.IsExternal || x.IsForced || x.IsDefault); } + else + { + // Respect forced flag. + stream = sortedStreams.FirstOrDefault(x => x.IsForced); + } } else if (mode == SubtitlePlaybackMode.Always) { From a83d4b03dc0aa786397f000499dc0a3e39b5859e Mon Sep 17 00:00:00 2001 From: jgriff6 <74262798+jgriff6@users.noreply.github.com> Date: Tue, 11 Oct 2022 18:36:19 +0100 Subject: [PATCH 3/3] Make 'Always' subtitle mode prioritise full tracks --- Emby.Server.Implementations/Library/MediaStreamSelector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Emby.Server.Implementations/Library/MediaStreamSelector.cs b/Emby.Server.Implementations/Library/MediaStreamSelector.cs index c77290aebf..609b957727 100644 --- a/Emby.Server.Implementations/Library/MediaStreamSelector.cs +++ b/Emby.Server.Implementations/Library/MediaStreamSelector.cs @@ -71,8 +71,8 @@ namespace Emby.Server.Implementations.Library } else if (mode == SubtitlePlaybackMode.Always) { - // Always load subtitles of the user's preferred subtitle language if possible, otherwise default behaviour. - stream = sortedStreams.FirstOrDefault(x => preferredLanguages.Contains(x.Language, StringComparison.OrdinalIgnoreCase)) ?? + // Always load (full/non-forced) subtitles of the user's preferred subtitle language if possible, otherwise default behaviour. + stream = sortedStreams.FirstOrDefault(x => !x.IsForced && preferredLanguages.Contains(x.Language, StringComparison.OrdinalIgnoreCase)) ?? sortedStreams.FirstOrDefault(x => x.IsExternal || x.IsForced || x.IsDefault); } else if (mode == SubtitlePlaybackMode.OnlyForced)