Add automatic audio and subtitle track selection

- Add preferred audio language setting (default: ger)
- Add preferred subtitle language setting (default: ger)
- Add auto-select default audio track option
- Add prefer forced subtitles option
- Add prefer SRT over PGS/image subtitles option

Implements intelligent scoring system for subtitle selection:
- Language match: +100 points
- Forced subtitle: +50 points (if enabled)
- SRT codec: +30 points (if enabled)
- Default track: +10 points

Auto-selection only happens when no track is pre-selected.
Falls back to manual dialog selection if no match is found.
This commit is contained in:
mani
2026-01-06 00:13:17 +01:00
parent 10857e39b1
commit 7d26589cf6
4 changed files with 130 additions and 0 deletions

View File

@@ -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"

View File

@@ -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"

View File

@@ -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:

View File

@@ -47,6 +47,14 @@
<setting id="audio_codec" type="select" label="30419" values="ac3|aac" default="ac3"/>
<setting id="audio_playback_bitrate" type="select" label="30418" values="128|160|192|256|320|384|448|640" default="256" visible="true"/>
<setting id="audio_max_channels" type="slider" label="30420" default="8" range="2,1,8" option="int" visible="true"/>
<setting label="30685" type="lsep"/>
<setting type="sep" />
<setting id="preferred_audio_language" type="text" label="30686" default="ger" visible="true"/>
<setting id="auto_select_default_audio" type="bool" label="30687" default="true" visible="true"/>
<setting id="preferred_subtitle_language" type="text" label="30688" default="ger" visible="true"/>
<setting id="prefer_forced_subtitles" type="bool" label="30689" default="true" visible="true"/>
<setting id="prefer_srt_over_pgs" type="bool" label="30690" default="true" visible="true"/>
<setting id="max_play_queue" type="slider" label="30447" default="200" range="20, 10, 1000" option="int" visible="true"/>
</category>