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:
Nun es soll keine Eierlegende Wollmichsau sein, jedoch schon so viel wie möglich erledigen.
Eine doch recht überschaubare Wunschliste.
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