diff --git a/resources/language/resource.language.de/strings.po b/resources/language/resource.language.de/strings.po index a5ad46d..61f6323 100644 --- a/resources/language/resource.language.de/strings.po +++ b/resources/language/resource.language.de/strings.po @@ -1257,3 +1257,27 @@ msgstr "AV1" msgctxt "#30684" msgid "Disk-Caching deaktivieren (nur RAM)" msgstr "Disk-Caching deaktivieren (nur RAM)" + +msgctxt "#30685" +msgid "Audio- & Untertitel-Einstellungen" +msgstr "Audio- & Untertitel-Einstellungen" + +msgctxt "#30686" +msgid "Bevorzugte Audio-Sprache" +msgstr "Bevorzugte Audio-Sprache" + +msgctxt "#30687" +msgid "Standard-Audiospur automatisch wählen" +msgstr "Standard-Audiospur automatisch wählen" + +msgctxt "#30688" +msgid "Bevorzugte Untertitel-Sprache" +msgstr "Bevorzugte Untertitel-Sprache" + +msgctxt "#30689" +msgid "Forced-Untertitel bevorzugen" +msgstr "Forced-Untertitel bevorzugen" + +msgctxt "#30690" +msgid "SRT vor PGS/Bild-Untertiteln bevorzugen" +msgstr "SRT vor PGS/Bild-Untertiteln bevorzugen" diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index 0101da1..2e6494e 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -1248,3 +1248,27 @@ msgstr "AV1" msgctxt "#30684" msgid "Disable disk caching (RAM only)" msgstr "Disable disk caching (RAM only)" + +msgctxt "#30685" +msgid "Audio & Subtitle Preferences" +msgstr "Audio & Subtitle Preferences" + +msgctxt "#30686" +msgid "Preferred audio language" +msgstr "Preferred audio language" + +msgctxt "#30687" +msgid "Auto-select default audio track" +msgstr "Auto-select default audio track" + +msgctxt "#30688" +msgid "Preferred subtitle language" +msgstr "Preferred subtitle language" + +msgctxt "#30689" +msgid "Prefer forced subtitles" +msgstr "Prefer forced subtitles" + +msgctxt "#30690" +msgid "Prefer SRT over PGS/image subtitles" +msgstr "Prefer SRT over PGS/image subtitles" diff --git a/resources/lib/play_utils.py b/resources/lib/play_utils.py index 79d61cb..3d90482 100644 --- a/resources/lib/play_utils.py +++ b/resources/lib/play_utils.py @@ -782,8 +782,10 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s dialog = xbmcgui.Dialog() audio_streams_list = {} audio_streams = [] + audio_streams_data = [] # Store full stream data for preference matching subtitle_streams_list = {} subtitle_streams = ['No subtitles'] + subtitle_streams_data = [] # Store full stream data for preference matching downloadable_streams = [] select_audio_index = audio_stream_index select_subs_index = subtitle_stream_index @@ -792,6 +794,13 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s default_sub = media_source.get('DefaultSubtitleStreamIndex', "") source_id = media_source["Id"] + # Read user preferences + preferred_audio_lang = settings.getSetting("preferred_audio_language").lower() + auto_select_default_audio = settings.getSetting("auto_select_default_audio") == "true" + preferred_sub_lang = settings.getSetting("preferred_subtitle_language").lower() + prefer_forced = settings.getSetting("prefer_forced_subtitles") == "true" + prefer_srt = settings.getSetting("prefer_srt_over_pgs") == "true" + media_streams = media_source['MediaStreams'] for stream in media_streams: @@ -815,6 +824,7 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s audio_streams_list[track] = index audio_streams.append(track) + audio_streams_data.append(stream) elif 'Subtitle' in stream['Type']: language = stream.get('Language', 'Unknown') @@ -843,6 +853,70 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s subtitle_streams_list[track] = index subtitle_streams.append(track) + subtitle_streams_data.append(stream) + + # Auto-select audio track based on preferences + if select_audio_index is None and len(audio_streams_data) > 0: + auto_selected = None + + # Try to match preferred language + if preferred_audio_lang: + for stream in audio_streams_data: + stream_lang = stream.get('Language', '').lower() + # Match against common variations (ger, deu, de, german) + if preferred_audio_lang in stream_lang or stream_lang.startswith(preferred_audio_lang[:3]): + auto_selected = stream['Index'] + log.debug("Auto-selected audio by language: {0} (index {1})".format(stream_lang, auto_selected)) + break + + # Fall back to default audio if enabled + if auto_selected is None and auto_select_default_audio: + auto_selected = default_audio + log.debug("Auto-selected default audio (index {0})".format(auto_selected)) + + if auto_selected is not None: + select_audio_index = auto_selected + + # Auto-select subtitle track based on preferences + if select_subs_index is None and len(subtitle_streams_data) > 0: + auto_selected = None + best_score = -1 + + for stream in subtitle_streams_data: + score = 0 + stream_lang = stream.get('Language', '').lower() + codec = stream.get('Codec', '').lower() + is_forced = stream.get('IsForced', False) + is_default = stream.get('IsDefault', False) + + # Score based on language match + if preferred_sub_lang and (preferred_sub_lang in stream_lang or stream_lang.startswith(preferred_sub_lang[:3])): + score += 100 + + # Bonus for forced if preferred + if prefer_forced and is_forced: + score += 50 + + # Bonus for SRT if preferred + if prefer_srt and codec in ['subrip', 'srt']: + score += 30 + elif not prefer_srt and codec in ['hdmv_pgs_subtitle', 'pgs']: + score += 30 + + # Small bonus for default + if is_default: + score += 10 + + log.debug("Subtitle score for {0} ({1}): {2} (forced={3}, codec={4})".format( + stream_lang, stream['Index'], score, is_forced, codec)) + + if score > best_score: + best_score = score + auto_selected = stream['Index'] + + if auto_selected is not None and best_score >= 100: # Only auto-select if language matched + select_subs_index = auto_selected + log.debug("Auto-selected subtitle (index {0}, score {1})".format(auto_selected, best_score)) # set audio index if select_audio_index is not None: diff --git a/resources/settings.xml b/resources/settings.xml index 6ecc497..de1bc06 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -47,6 +47,14 @@ + + + + + + + +