From 5f597ef56704042fdd0649c345a6ae09c57e1b9a Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Sun, 15 Mar 2026 11:40:45 +0100 Subject: [PATCH] fix: prefer exact language code match in track selection Fixes #703 --- lib/services/track_selection_service.dart | 26 +++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/services/track_selection_service.dart b/lib/services/track_selection_service.dart index da557a11..2c6aca92 100644 --- a/lib/services/track_selection_service.dart +++ b/lib/services/track_selection_service.dart @@ -39,9 +39,12 @@ SubtitleTrack? findMpvTrackForPlexSubtitle(PlexSubtitleTrack plexTrack, List for (final mpvTrack in mpvTracks) { int score = 0; - // Language match is most important (+10) + // Language match is most important (+10, +1 bonus for exact code match) if (_languagesMatch(mpvTrack.language, plexTrack.languageCode)) { score += 10; + if (_languageCodesExactMatch(mpvTrack.language, plexTrack.languageCode)) { + score += 1; + } } // Codec match (+5) @@ -176,9 +185,12 @@ PlexAudioTrack? findPlexTrackForMpvAudio(AudioTrack mpvTrack, List= 10 ? bestMatch : null; } +/// Check if two language codes match exactly (after normalizing case and stripping region suffixes) +bool _languageCodesExactMatch(String? a, String? b) { + if (a == null || b == null) return false; + return a.toLowerCase().split('-').first == b.toLowerCase().split('-').first; +} + /// Check if two language codes refer to the same language /// Handles both ISO 639-1 (2-letter) and ISO 639-2 (3-letter) codes bool _languagesMatch(String? mpvLang, String? plexLang) {