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:
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user