Script-Time: Optimale Dateinamen für Jellyfin

Vorschläge für Mediendateien leicht gemacht

Script-Time: Optimale Dateinamen für Jellyfin
Photo by Mohammad Rahmani / Unsplash

Wenn man seine Video-Sammlung mit Jellyfin verwaltet, ist es gut ein Dateinamenskonzept einzuhalten.

Für Kodi gibt es dazu eine genaue Beschreibung. Ich halte mich weitestgehend daran, damit diese Plattformen es leichter haben, die Metadaten aus dem Netz zu beschaffen.

Für Serien sollte der Dateiname die Staffel und Episodennummer enthalten (z.B. S01E01), gefolgt vom Namen. Das ist zwar nicht zwingend erforderlich, doch erleichtert es einem selbst die Lesbarkeit. Ich lege daher alle Episoden einer Serie in einem Unterordner ab. Damit darin die Sortierung passt, stelle ich Season und Episode voran.

Ein Beispiel

Sagen wir, wir würden gerne eine Serie unserem offline-Archiv hinzufügen.

Möglicherweise sind die Dateien ungünstig benannt, was eine neue Namensgebung erforderlich macht. Doch wie kann ich das in der Konsole schnell vorbereiten? Hier kommt das kleine Script ins Spiel.

Nutzung

Ich habe das Script seriequery genannt. Es nimmt den Titel als Argument entgegen.

So kann man leicht per copy/paste die Dateien umbenennen. In Jellyfin sieht das dann sehr ansprechend aus:

Die Idee

Einiges habe ich zugegebenerweise bei KODI abgeschaut. Auf Github kann man in die Dateien Einblick haben.

Release TMDb TV Shows v.1.7.0 · xbmc/metadata.tvshows.themoviedb.org.python
themoviedb.org TV Show scraper in Python for Kodi 18 (Leia) or later. - Release TMDb TV Shows v.1.7.0 · xbmc/metadata.tvshows.themoviedb.org.python

Dort findet man auch den API_KEY für themoviedb in der Datei settings.py:

Mischt man alles gut zusammen, kann man sich einiges an Zeit ersparen.

Das Script

seriequery() {
    # API-Key
    local API_KEY="af3a53eb387d57fc935e9128468b1899"

    # Hauptlogik
    if [[ -z "$*" ]]; then
        echo "Usage: seriequery \"Show Name\""
        return 1
    fi

    local show_name="$*"
    
    # Hole die Show-ID
    local show_id=$(curl -s "https://api.themoviedb.org/3/search/tv?api_key=$API_KEY&query=$(echo $show_name | sed 's/ /%20/g')&language=de-DE" | jq -r '.results[0].id')

    if [[ -z "$show_id" || "$show_id" == "null" ]]; then
        echo "TV Show not found: $show_name"
        return 1
    fi

    echo "Fetching episodes for: $show_name (German Titles)"

    # Hole die Staffel-Informationen
    local seasons=$(curl -s "https://api.themoviedb.org/3/tv/$show_id?api_key=$API_KEY&language=de-DE" | jq -r '.seasons[] | select(.season_number > 0) | "\(.season_number):\(.episode_count)"')

    if [[ -z "$seasons" ]]; then
        echo "No seasons found for: $show_name"
        return 1
    fi

    # Durchlaufe jede Staffel und hole die Episoden
    while IFS=: read -r season episode_count; do
        echo "Season $season ($episode_count episodes):"
        
        # Hole die Episoden für die aktuelle Staffel
        curl -s "https://api.themoviedb.org/3/tv/$show_id/season/$season?api_key=$API_KEY&language=de-DE" | jq -r '.episodes[] | 
            "S" + (.season_number | tostring | if length == 1 then "0" + . else . end) + 
            "E" + (.episode_number | tostring | if length == 1 then "0" + . else . end) + 
            "_" + (.name 
                | gsub("ä"; "ae") 
                | gsub("ö"; "oe") 
                | gsub("ü"; "ue") 
                | gsub("ß"; "ss") 
                | gsub("[^a-zA-Z0-9]"; "_") 
                | gsub("_+"; "_") 
                | gsub("^_|_$"; "") )'
        echo
    done <<< "$seasons"
}