yt-dlp in Script Form

Erstellt am: 14/06/2025 - Lesezeit: 5 Minuten

Der YouTube Downloader. Lange war er weg, jedoch gibt es Ihn seit einiger Zeit wieder in Form eines Forks. yt-dlp und ist u.a. bei GitHub verfügbar. Einige Distributionen haben den auch im PacketManager.

Man sollte im Hinterkopf behalten, dass wir ein Script basteln, womit man sich bei YouTube oder auch anderen Diensten Musik herunterladen kann. Ob man das immer darf, sollte man abklären!

Nutzung daher auf eigene Verantwortung.

Das fertige Script gibt es am Ende als Download.

Eine Anleitung wie man nun yt-dlp installiert, gebe ich hier nicht. Ich gehe in diesem Tutorial davon aus, dass folgende Dinge bereits auf eurem System installiert sind:

  • yt-dlp
  • ffmpeg
  • jq (für JSON-Verarbeitung von Metadaten)
  • eyeD3

Grundlegende Überlegungen

Was soll unser Script denn so alles können

Nun es soll keine Eierlegende Wollmichsau sein, jedoch schon so viel wie möglich erledigen.

Was ich mir überlegt habe
  • Begrüßung bei Programmstart
  • Erstellen von Logfiles
  • Auswahl und Umwandlung von erlaubten Audioformaten (MP3, FLAC, etc. )
  • bei MP3 noch die Bitrate einstellen
  • Abfrage der URL zur entsprechenden Playlist
  • Erstellen eines Ordners mit dem Namen der Playlist
  • Thumbnail Download der Alben Cover und einfügen in die Audiodatei (sofern welche vorhanden sind)
  • saubere Benennung nach Tracknummern
  • Metadaten-Tagging (Titel, Tracknummer, ggf. Künstler, Album)
  • Parallelisierung zur schnelleren Verarbeitung?
  • ID3-V2 Tagging wäre schön
  • Meldung wenn die Aufgaben erledigt sind.

Eine doch recht überschaubare Wunschliste.

Fangen wir an

Als erstes öffnen wir das Terminal und darin den Editor unserer Wahl. Ich verwende nano im Terminal, das reicht mir völlig.

nano youtube.sh

Starten wir ganz normal mit der Begrüßung:

#!/bin/bash

# === Begrüßung ===
echo " Willkommen zum Youtube Downloader in ScriptForm"
echo "-----------------------------------------------"

Als nächstes die LogFiles und die erlaubten Audioformate:

# === Konfiguration ===
LOGFILE ="error.log"
VALID_FORMATS =("flac", "mp3", "aac", "alac")

Eine überprüfung, ob yt-dlp oder noch der Youtube Downloader installiert sind? Klar.

# === Check ob yt-dlp oder youtube-dl und ffmpeg installiert sind ===
if command -v yt-dlp &> /dev/null; then
    YTDL="yt-dlp"
elif command -v youtube-dl &> /dev/null; then
    YTDL="youtube-dl"
else
    echo "❌ yt-dlp oder youtube-dl nicht gefunden." | tee -a "$LOGFILE"
    exit 1
fi

if ! command -v ffmpeg &> /dev/null; then
    echo "❌ ffmpeg ist nicht installiert." | tee -a "$LOGFILE"
    exit 1
fi

if ! command -v jq &> /dev/null; then
    echo "❌ jq ist nicht installiert." | tee -a "$LOGFILE"
    exit 1
fi
# === ffmpeg und jq installiert? ===

if ! command -v ffmpeg &> /dev/null; then
    echo "❌ ffmpeg ist nicht installiert." | tee -a "$LOGFILE"
    exit 1
fi

if ! command -v jq &> /dev/null; then
    echo "❌ jq ist nicht installiert." | tee -a "$LOGFILE"
    exit 1
fi

Als nächstes fragen wir nach der URL und dem gewünschten Audioformat, in dem uns die Audiofiles vorliegen sollen. Optional bei MP3 noch die Bitrate:

# === URL und Format-Abfrage ===
read -p "🎵 Bitte die YouTube-Playlist-URL eingeben: " URL
read -p "🎧 Gewünschtes Audioformat (flac, mp3, wav, aac, ogg, alac): " AUDIO_FORMAT

# Optional Bitrate, wenn MP3
BITRATE_ARG=""
ID3_ARG=""
if [[ "$AUDIO_FORMAT" == "mp3" ]]; then
    read -p "🎚️ Gewünschte MP3-Bitrate (z. B. 192k, 256k, 320k): " BITRATE
    BITRATE_ARG="-b:a $BITRATE"
    ID3_ARG="-id3v2_version 4"
fi

Soweit so gut. Wir haben bis jetzt die Dinge festgelegt, die die Aufmerksamkeit des Nutzers erfordern. Nun sorgen wir dafür, dass das Script auch das macht, was es soll.

Wie in der Wunschliste geschrieben steht, soll der Name der Playlist als Ordnername dienen. Dazu muss der Name der Playlist ermittelt und der Ordner erstellt werden:

# === Playlist-Titel ermitteln ===
echo "🔍 Ermittle Playlist-Titel..."
PLAYLIST_TITLE=$($YTDL --flat-playlist --print "%(playlist_title)s" "$URL" 2>>"$LOGFILE" | head -n 1)
SAFE_NAME=$(echo "${PLAYLIST_TITLE:-YT_Playlist_$(date +%s)}" | tr -cd '[:alnum:] _-' | tr ' ' '_')

# === Verzeichnis vorbereiten ===
DOWNLOAD_DIR="$SAFE_NAME"
mkdir -p "$DOWNLOAD_DIR"
cd "$DOWNLOAD_DIR" || exit

Im nächsten Schritt sollen nun die Titel und Thumbnails heruntergeladen und die Metadaten der Audiodateien ermittelt werden:

# === Herunterladen der Playlist (inkl. Thumbnail) ===
echo "⬇️ Lade Audio und Metadaten..."
$YTDL \
    --extract-audio \
    --audio-format best \
    --write-thumbnail \
    --write-info-json \
    --output "%(playlist_index)03d - %(title)s.%(ext)s" \
    "$URL" 2>>"$LOGFILE"

Zum Abschluss nun die Konvertierung in das von uns gewünschte Audioformat inkl. dem Tagging

# === Umwandlung & Tagging (parallel) ===
shopt -s nullglob
echo "🎶 Konvertiere Dateien in $AUDIO_FORMAT..."
for input in *.{webm,m4a,mp3,opus}; do
    [[ -f "$input" ]] || continue

    (
        base="${input%.*}"
        json="$base.info.json"
        cover=$(ls "$base".* 2>/dev/null | grep -Ei "\.(jpg|png|webp)$" | head -n 1)

        title=$(jq -r .title "$json" 2>/dev/null)
        track=$(echo "$base" | grep -oE '^[0-9]+')
        artist=$(jq -r .uploader "$json" 2>/dev/null)
        album=$(jq -r .playlist_title "$json" 2>/dev/null)

        output="$base.$AUDIO_FORMAT"

        echo "→ $input → $output"
        ffmpeg -i "$input" \
            ${cover:+-i "$cover"} \
            -map 0:a \
            ${cover:+-map 1} \
            -c:a "$AUDIO_FORMAT" $BITRATE_ARG $ID3_ARG \
            -metadata title="$title" \
            -metadata track="$track" \
            -metadata artist="$artist" \
            -metadata album="$album" \
            ${cover:+-disposition:v attached_pic} \
            -loglevel error -y "$output" || echo "⚠️ Fehler bei: $input" >> "$LOGFILE"

        rm -f "$input" "$json" "$cover"
    ) &
done

wait

Jetzt fehlt noch die “Habe fertig Meldung”:


echo "✅ Fertig! Audiodateien im Format $AUDIO_FORMAT wurden im Ordner '$DOWNLOAD_DIR' gespeichert."
echo "📄 Fehler (falls vorhanden) sind in '$LOGFILE'."

Damit wäre das Script auch schon fertig. Nun müssen wir das Script noch ausführbar machen, was relativ einfach geht:

sudo chmod +x youtube.sh

Der Aufruf erfolgt dann mittels ./youtube.sh

Wie versprochen, hier nun der Link für den Download des fertigen Scriptes: Klickst Du hier


Über den Seitenbetreiber
Christian Rumpf
Ich bin ein aktiver Berufskraftfahrer in zweiter Generation. Ich übe diesen Job seit Mitte der 1990er Jahre aus und habe in der Zeit viele verschiedene Bereiche des Transportsektors durchlaufen. Darunter waren auch kurze Abstecher in die Disposition, Lager, Fuhrparkleitung. Auf dieser Seite gebe ich lediglich meine eigene Meinung wieder. Diese muss nicht immer richtig sein. Daher empfehle ich bei rechtlichen Themen grundsätzlich immer den Gang zu einem entsprechenden Anwalt.
Du hast Fragen, Anregungen oder Kritik? Schreib mir eine E-Mail:
info@christiansblog.eu
Autor Avatar
Weitere Interessen:
  • Linux, Open Source & Datenschutz
  • LMDE 6 & Debian 12 Nutzer
  • Kontakt auch via Mastodon