Change subtitle preferences to prefer forced-only and PGS
Some checks failed
Build JellyCon / build (py2) (push) Has been cancelled
Build JellyCon / build (py3) (push) Has been cancelled
CodeQL Analysis / analyze (python, 3.9) (push) Has been cancelled
Release Drafter / Update release draft (push) Has been cancelled
Test JellyCon / test (3.9) (push) Has been cancelled

- Change prefer_srt_over_pgs default from true to false
  PGS has better quality when burned in during transcoding

- Add only_forced_subtitles setting (default: true)
  When enabled, only forced subtitles are selected
  Regular subtitles are skipped even if they match the language

- Skip non-forced subtitles in auto-selection when only_forced is enabled
  Prevents selecting regular German subs when watching German content
  Only shows forced subs for foreign language parts

This is useful for native language content where only foreign
language parts need subtitles (forced), not the entire movie.
This commit is contained in:
mani
2026-01-06 00:34:19 +01:00
parent b9a6b5056a
commit 32f2b12708
4 changed files with 19 additions and 3 deletions

View File

@@ -1325,3 +1325,7 @@ msgstr "Bei keinem Treffer automatisch 'Keine Untertitel' wählen"
msgctxt "#30701"
msgid "Abspielen mit Track-Auswahl"
msgstr "Abspielen mit Track-Auswahl"
msgctxt "#30702"
msgid "Nur Forced-Untertitel auswählen (keine normalen)"
msgstr "Nur Forced-Untertitel auswählen (keine normalen)"

View File

@@ -1316,3 +1316,7 @@ msgstr "Auto-select 'No subtitles' if no match found"
msgctxt "#30701"
msgid "Play with track selection"
msgstr "Play with track selection"
msgctxt "#30702"
msgid "Only select forced subtitles (no regular subs)"
msgstr "Only select forced subtitles (no regular subs)"

View File

@@ -810,6 +810,7 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s
preferred_sub_lang = sub_lang_index_map[sub_lang_index] if sub_lang_index < len(sub_lang_index_map) else ''
prefer_forced = settings.getSetting("prefer_forced_subtitles") == "true"
only_forced = settings.getSetting("only_forced_subtitles") == "true"
prefer_srt = settings.getSetting("prefer_srt_over_pgs") == "true"
auto_no_subs = settings.getSetting("auto_no_subtitles_if_no_match") == "true"
@@ -965,8 +966,8 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s
auto_selected = None
best_score = -1
log.debug("Auto-selecting subtitle: preferred_lang={0}, prefer_forced={1}, prefer_srt={2}".format(
preferred_sub_lang, prefer_forced, prefer_srt))
log.debug("Auto-selecting subtitle: preferred_lang={0}, prefer_forced={1}, only_forced={2}, prefer_srt={3}".format(
preferred_sub_lang, prefer_forced, only_forced, prefer_srt))
for stream in subtitle_streams_data:
score = 0
@@ -975,6 +976,12 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s
is_forced = stream.get('IsForced', False)
is_default = stream.get('IsDefault', False)
# Skip non-forced subtitles if only_forced is enabled
if only_forced and not is_forced:
log.debug("Skipping non-forced subtitle {0} ({1}) - only_forced is enabled".format(
stream_lang, stream['Index']))
continue
# Score based on language match
if preferred_sub_lang and language_matches(stream_lang, preferred_sub_lang):
score += 100

View File

@@ -54,7 +54,8 @@
<setting id="auto_select_default_audio" type="bool" label="30687" default="true" visible="true"/>
<setting id="preferred_subtitle_language" type="select" label="30688" lvalues="30699|30691|30692|30693|30694|30695|30696|30697|30698" default="1" 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="only_forced_subtitles" type="bool" label="30702" default="true" visible="true"/>
<setting id="prefer_srt_over_pgs" type="bool" label="30690" default="false" visible="true"/>
<setting id="auto_no_subtitles_if_no_match" type="bool" label="30700" default="true" visible="true"/>
<setting id="max_play_queue" type="slider" label="30447" default="200" range="20, 10, 1000" option="int" visible="true"/>