diff --git a/bin/auto_add_sub_folder.sh b/bin/auto_add_sub_folder.sh index 9d120c1..346e864 100755 --- a/bin/auto_add_sub_folder.sh +++ b/bin/auto_add_sub_folder.sh @@ -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 - cmd+=( --track-name 0:"$name" ) + if [[ -n "$name" ]]; then + cmd+=( --track-name 0:"$name" ) + fi + if [[ "$forcedFlag" == "yes" ]]; then cmd+=( --forced-track 0:yes --default-track 0:no ) else