This commit is contained in:
2026-02-03 15:59:30 +01:00
parent f4957f167d
commit 16ec7703cd

View File

@@ -206,11 +206,143 @@ find_subs_dir() {
return 1
}
# ---------------- subtitle meta (no language override) ----------------
# ---------------- language "database" for display names (GERMAN) ----------------
# Maps ISO 639-1/2 codes to German display names
declare -A LANG_DB=(
# Deutsch
[de]="Deutsch" [deu]="Deutsch" [ger]="Deutsch"
# Englisch
[en]="Englisch" [eng]="Englisch"
# Französisch
[fr]="Französisch" [fra]="Französisch" [fre]="Französisch"
# Spanisch
[es]="Spanisch" [spa]="Spanisch"
# Italienisch
[it]="Italienisch" [ita]="Italienisch"
# Niederländisch
[nl]="Niederländisch" [nld]="Niederländisch" [dut]="Niederländisch"
# Polnisch
[pl]="Polnisch" [pol]="Polnisch"
# Russisch
[ru]="Russisch" [rus]="Russisch"
# Portugiesisch
[pt]="Portugiesisch" [por]="Portugiesisch"
# Türkisch
[tr]="Türkisch" [tur]="Türkisch"
# Schwedisch
[sv]="Schwedisch" [swe]="Schwedisch"
# Norwegisch
[no]="Norwegisch" [nor]="Norwegisch"
# Dänisch
[da]="Dänisch" [dan]="Dänisch"
# Finnisch
[fi]="Finnisch" [fin]="Finnisch"
# Tschechisch
[cs]="Tschechisch" [ces]="Tschechisch" [cze]="Tschechisch"
# Ungarisch
[hu]="Ungarisch" [hun]="Ungarisch"
# Rumänisch
[ro]="Rumänisch" [ron]="Rumänisch" [rum]="Rumänisch"
# Bulgarisch
[bg]="Bulgarisch" [bul]="Bulgarisch"
# Griechisch
[el]="Griechisch" [ell]="Griechisch" [gre]="Griechisch"
# Hebräisch
[he]="Hebräisch" [heb]="Hebräisch"
)
# Extract language code from VobSub .idx (first "id:" line), lowercased.
# Example line: "id: en, index: 0"
idx_lang_from_file() {
local idx="$1"
local code=""
code="$(awk '
BEGIN{IGNORECASE=1}
/^[ \t]*id:[ \t]*[a-z][a-z][a-z]?[ \t]*,/ {
gsub(/^[ \t]*/, "", $0)
sub(/^id:[ \t]*/, "", $0)
sub(/,.*/, "", $0)
print tolower($0)
exit
}
/^[ \t]*id:[ \t]*[a-z][a-z][a-z]?[ \t]*$/ {
gsub(/^[ \t]*/, "", $0)
sub(/^id:[ \t]*/, "", $0)
print tolower($0)
exit
}
' "$idx" 2>/dev/null || true)"
[[ -n "$code" ]] && printf '%s' "$code"
}
# Try to infer a language "code" from filename tokens (best effort).
# Returns: code or empty
lang_code_from_filename() {
local stem="$1"
local lc="${stem,,}"
# English tokens
if [[ "$lc" =~ (^|[._\ \-])eng([._\ \-]|$) ]] || \
[[ "$lc" =~ (^|[._\ \-])en([._\ \-]|$) ]] || \
[[ "$lc" == *english* ]]; then
printf 'en'; return 0
fi
# German tokens
if [[ "$lc" =~ (^|[._\ \-])deu([._\ \-]|$) ]] || \
[[ "$lc" =~ (^|[._\ \-])ger([._\ \-]|$) ]] || \
[[ "$lc" =~ (^|[._\ \-])de([._\ \-]|$) ]] || \
[[ "$lc" == *german* ]]; then
printf 'de'; return 0
fi
# French tokens
if [[ "$lc" =~ (^|[._\ \-])fra([._\ \-]|$) ]] || \
[[ "$lc" =~ (^|[._\ \-])fre([._\ \-]|$) ]] || \
[[ "$lc" =~ (^|[._\ \-])fr([._\ \-]|$) ]] || \
[[ "$lc" == *french* ]]; then
printf 'fr'; return 0
fi
# Spanish tokens
if [[ "$lc" =~ (^|[._\ \-])spa([._\ \-]|$) ]] || \
[[ "$lc" =~ (^|[._\ \-])es([._\ \-]|$) ]] || \
[[ "$lc" == *spanish* ]]; then
printf 'es'; return 0
fi
# Italian tokens
if [[ "$lc" =~ (^|[._\ \-])ita([._\ \-]|$) ]] || \
[[ "$lc" =~ (^|[._\ \-])it([._\ \-]|$) ]] || \
[[ "$lc" == *italian* ]]; then
printf 'it'; return 0
fi
# Add more here if you want...
return 1
}
# Convert a language code to a nice name using LANG_DB.
# Returns: name or empty
lang_name_from_code() {
local code="${1,,}"
[[ -n "${LANG_DB[$code]:-}" ]] && printf '%s' "${LANG_DB[$code]}"
}
# Echoes: track_name|forcedFlag
# Strategy:
# 1) Prefer filename tokens (more reliable for scene releases)
# 2) If filename gives no hint -> read idx "id: xx" and map to display name
# 3) If still unknown -> empty name (=> don't set --track-name)
infer_meta_for_idx() {
local idx="$1"
local stem lc forced name
local stem lc forced name code_file code_idx
stem="$(basename "$idx" .idx)"
lc="${stem,,}"
@@ -218,19 +350,37 @@ infer_meta_for_idx() {
forced="no"
[[ "$lc" == *forced* ]] && forced="yes"
# Track name heuristic (display only, not language)
if [[ "$lc" =~ (^|[._\ \-])eng([._\ \-]|$) ]] || [[ "$lc" == *english* ]]; then
name="English"
elif [[ "$lc" =~ (^|[._\ \-])de([._\ \-]|$) ]] || [[ "$lc" == *german* ]] || [[ "$lc" =~ (^|[._\ \-])ger([._\ \-]|$) ]] || [[ "$lc" == *deu* ]]; then
name="Deutsch"
else
name="$stem"
name=""
# 1) from filename
code_file="$(lang_code_from_filename "$stem" || true)"
if [[ -n "${code_file:-}" ]]; then
name="$(lang_name_from_code "$code_file" || true)"
fi
[[ "$forced" == "yes" ]] && name+=" (Forced)"
# 2) fallback: from idx file content
if [[ -z "$name" ]]; then
code_idx="$(idx_lang_from_file "$idx" || true)"
if [[ -n "${code_idx:-}" ]]; then
name="$(lang_name_from_code "$code_idx" || true)"
fi
fi
# Optional: warn on mismatch if both exist (filename wins)
if [[ -n "${code_file:-}" ]]; then
code_idx="$(idx_lang_from_file "$idx" || true)"
if [[ -n "${code_idx:-}" && "$code_idx" != "$code_file" ]]; then
dbg "WARN: language mismatch for $(basename "$idx"): filename=$code_file, idx=$code_idx (using filename)"
fi
fi
[[ -n "$name" && "$forced" == "yes" ]] && name+=" (Forced)"
echo "${name}|${forced}"
}
# ---------------- mux one mkv ----------------
mux_one_mkv() {
local mkv="$1"
@@ -282,7 +432,10 @@ mux_one_mkv() {
dbg "Add VobSub: $(basename "$idx") -> name='$name', forced=$forcedFlag"
# IMPORTANT: do NOT override language; keep what is in the .idx
if [[ -n "$name" ]]; then
cmd+=( --track-name 0:"$name" )
fi
if [[ "$forcedFlag" == "yes" ]]; then
cmd+=( --forced-track 0:yes --default-track 0:no )
else