Script-Time: Optimale Dateinamen für Jellyfin
Vorschläge für Mediendateien leicht gemacht
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.
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"
}