Skip to main content

YouTube Videos im Linux Terminal schauen - Komplett-Anleitung

Übersicht

Diese Anleitung zeigt dir, wie du mit einem eigenen Bash-Script YouTube-Videos direkt im Terminal suchen und als Audio abspielen kannst - perfekt für Server ohne GUI!

Was du brauchst:

  • mpv - Video/Audio-Player
  • yt-dlp - YouTube-Downloader
  • alsamixer - Audio-Steuerung
  • speaker-test - Audio-Test-Tool

Teil 1: Installation der benötigten Pakete

Schritt 1: System aktualisieren

sudo apt update && sudo apt upgrade -y

Schritt 2: Pakete installieren

# Basis-Pakete
sudo apt install -y mpv ffmpeg alsa-utils

# yt-dlp (neueste Version)
sudo wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp
sudo chmod +x /usr/local/bin/yt-dlp

# Installation prüfen
mpv --version
yt-dlp --version

Teil 2: Audio-Konfiguration

Schritt 1: Audio-Hardware prüfen

# Verfügbare Audio-Geräte anzeigen
aplay -l

Erwartete Ausgabe:

**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC887-VD Analog

Schritt 2: Audio-Test durchführen

# Testton abspielen (2 Sekunden)
speaker-test -t wav -c 2 -l 1

Was passiert:

  • -t wav = Wellenform (wav-Datei)
  • -c 2 = 2 Kanäle (Stereo)
  • -l 1 = 1 Durchlauf

Sollte zu hören sein: "Front Left, Front Right"

Kein Ton? → Weiter zu Schritt 3

Ton funktioniert? → Springe zu Teil 3

Schritt 3: Lautstärke mit alsamixer einstellen

# ALSA-Mixer öffnen
alsamixer

Bedienung:

Taste Funktion
F6 Soundkarte auswählen
↑ / ↓ Lautstärke erhöhen/verringern
M Mute/Unmute (MM = gemuted, 00 = aktiv)
← / → Zwischen Kanälen wechseln
ESC Beenden

Wichtig:

  1. Stelle Master auf mindestens 80%
  2. Prüfe dass MM nicht angezeigt wird (sonst mit M unmuten)
  3. Auch PCM sollte auf 80%+ sein

Schritt 4: Lautstärke per CLI setzen

# Master auf 100% und unmuten
amixer sset Master unmute
amixer sset Master 100%

# PCM ebenfalls
amixer sset PCM unmute
amixer sset PCM 100%

# Status prüfen
amixer get Master

Ausgabe sollte sein:

Simple mixer control 'Master',0
  Capabilities: pvolume pswitch
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 65536
  Front Left: Playback 65536 [100%] [on]
  Front Right: Playback 65536 [100%] [on]

[on] = gut! [off] = nochmal amixer sset Master unmute

Schritt 5: Erneuter Audio-Test

speaker-test -t wav -c 2 -l 1

Jetzt sollte Ton kommen!


Teil 3: mpv für YouTube konfigurieren

mpv-Config erstellen

# Config-Verzeichnis erstellen
mkdir -p ~/.config/mpv

# Config-Datei erstellen
nano ~/.config/mpv/mpv.conf

Inhalt:

# ──────────────────────────────────────
# MPV Konfiguration für YouTube
# ──────────────────────────────────────

# yt-dlp Integration
script-opts=ytdl_hook-ytdl_path=/usr/local/bin/yt-dlp

# Audio-Einstellungen
audio-device=alsa
volume=80
volume-max=150

# YouTube-Format (bestes Audio)
ytdl-format=bestaudio[ext=m4a]/bestaudio/best

# Kein Video (nur Audio)
no-video

# Cache für besseres Streaming
cache=yes
cache-secs=60
demuxer-max-bytes=100M
demuxer-max-back-bytes=50M

# Terminal-Ausgabe
term-osd-bar=yes
msg-level=all=info

# Keine GUI
no-osc

Speichern: Strg + O, Enter, Strg + X

mpv testen

# YouTube-Video nur als Audio abspielen
mpv "https://www.youtube.com/watch?v=dQw4w9WgXcQ"

Sollte jetzt Audio abspielen!


Teil 4: Das YouTube-Such-Script

Script erstellen

# Script erstellen
nano ~/yt-search.sh

Komplettes Script mit Erklärungen:

#!/bin/bash

# ═══════════════════════════════════════════════════════════════
# YouTube-Suche Script für Linux Terminal
# Autor: Leon
# Datei: yt-search.sh
# ═══════════════════════════════════════════════════════════════

# ───────────────────────────────────────────────────────────────
# 1. HILFE-TEXT UND PARAMETER-PRÜFUNG
# ───────────────────────────────────────────────────────────────

# Prüfen ob ein Suchbegriff übergeben wurde
if [ -z "$1" ]; then
    # -z prüft ob String leer ist
    # $1 ist der erste Parameter beim Aufruf
    
    echo "Usage: yt-search.sh 'suchbegriff'"
    echo ""
    echo "Beispiel:"
    echo "  yt-search.sh 'linux tutorial'"
    exit 1  # Beende Script mit Fehlercode 1
fi

# ───────────────────────────────────────────────────────────────
# 2. SUCHBEGRIFF SPEICHERN
# ───────────────────────────────────────────────────────────────

SEARCH="$1"
# $1 wird in Variable SEARCH gespeichert
# Anführungszeichen wichtig für Suchbegriffe mit Leerzeichen!

# ───────────────────────────────────────────────────────────────
# 3. HEADER AUSGEBEN
# ───────────────────────────────────────────────────────────────

echo "Suche nach: $SEARCH"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""

# ───────────────────────────────────────────────────────────────
# 4. YOUTUBE-SUCHE MIT YT-DLP
# ───────────────────────────────────────────────────────────────

# Top 10 Ergebnisse mit yt-dlp abrufen und formatieren
RESULTS=$(yt-dlp "ytsearch10:$SEARCH" \
    --get-title \
    --get-id \
    --get-duration \
    --no-warnings 2>/dev/null | paste - - -)

# Erklärung der Befehle:
# yt-dlp "ytsearch10:$SEARCH"  → Suche top 10 Videos
# --get-title                  → Hole Video-Titel
# --get-id                     → Hole Video-ID
# --get-duration               → Hole Dauer
# --no-warnings                → Unterdrücke Warnungen
# 2>/dev/null                  → Leite Fehler ins Nirvana
# | paste - - -                → Kombiniere je 3 Zeilen zu einer

# ───────────────────────────────────────────────────────────────
# 5. ERGEBNISSE FORMATIERT AUSGEBEN
# ───────────────────────────────────────────────────────────────

echo "$RESULTS" | awk -F'\t' '{printf "%d. %s (%s)\n", NR, $1, $3}'

# Erklärung:
# awk -F'\t'        → Trennzeichen ist Tab
# printf            → Formatierte Ausgabe
# NR                → Zeilennummer (1, 2, 3...)
# $1                → Erste Spalte (Titel)
# $3                → Dritte Spalte (Dauer)

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# ───────────────────────────────────────────────────────────────
# 6. BENUTZER-EINGABE
# ───────────────────────────────────────────────────────────────

read -p "Welches Video? (1-10): " choice

# read -p "TEXT"    → Zeige Text und warte auf Eingabe
# choice            → Speichere Eingabe in Variable "choice"

# ───────────────────────────────────────────────────────────────
# 7. VIDEO-ID EXTRAHIEREN
# ───────────────────────────────────────────────────────────────

VIDEO_ID=$(echo "$RESULTS" | sed -n "${choice}p" | cut -f2)

# Erklärung:
# echo "$RESULTS"       → Gib gespeicherte Ergebnisse aus
# sed -n "${choice}p"   → Nimm Zeile mit Nummer aus $choice
# cut -f2               → Nimm 2. Feld (Video-ID)

# ───────────────────────────────────────────────────────────────
# 8. EINGABE-VALIDIERUNG
# ───────────────────────────────────────────────────────────────

if [ -z "$VIDEO_ID" ]; then
    # Wenn VIDEO_ID leer ist (ungültige Auswahl)
    echo "❌ Ungültige Auswahl!"
    exit 1
fi

# ───────────────────────────────────────────────────────────────
# 9. VIDEO-URL ERSTELLEN
# ───────────────────────────────────────────────────────────────

VIDEO_URL="https://www.youtube.com/watch?v=$VIDEO_ID"

echo ""
echo "▶ Spiele ab: $VIDEO_URL"
echo ""

# ───────────────────────────────────────────────────────────────
# 10. MPV STARTEN MIT OPTIMALEN EINSTELLUNGEN
# ───────────────────────────────────────────────────────────────

mpv --ytdl-format=bestaudio[height<=720][vcodec=avc1][acodec=opus]/bestaudio[height<=720] \
    --cache=yes \
    --cache-secs=60 \
    --demuxer-max-bytes=50M \
    --really-quiet \
    "$VIDEO_URL"

# Erklärung der mpv-Parameter:
#
# --ytdl-format=...         → Wähle bestes Audio-Format
#   bestaudio[height<=720]  → Audio von Video max 720p
#   [vcodec=avc1]           → Video-Codec AVC1 bevorzugen
#   [acodec=opus]           → Audio-Codec Opus bevorzugen
#   /bestaudio[height<=720] → Fallback ohne Codec-Filter
#
# --cache=yes               → Cache aktivieren
# --cache-secs=60           → 60 Sekunden vorpuffern
# --demuxer-max-bytes=50M   → Max 50MB im RAM puffern
# --really-quiet            → Nur wichtige Meldungen zeigen
#
# "$VIDEO_URL"              → Die YouTube-URL

# ═══════════════════════════════════════════════════════════════
# ENDE DES SCRIPTS
# ═══════════════════════════════════════════════════════════════

Speichern: Strg + O, Enter, Strg + X

Script ausführbar machen

Script testen

# Script aufrufen
~/yt-search.sh "linux tutorial"

Was passiert:

  1. Script sucht Top 10 YouTube-Videos
  2. Zeigt Liste mit Nummer, Titel, Dauer
  3. Du gibst eine Nummer ein (1-10)
  4. Video wird als Audio abgespielt

Teil 5: Script global verfügbar machen

Option A: Alias erstellen

# Bash-Config öffnen
nano ~/.bashrc

Am Ende hinzufügen:

# YouTube-Suche Alias
alias yt='~/yt-search.sh'

Speichern und aktivieren:

source ~/.bashrc

Jetzt kannst du einfach schreiben:

yt "linux tutorial"

Option B: In PATH kopieren

# Script nach /usr/local/bin kopieren
sudo cp ~/yt-search.sh /usr/local/bin/yt
sudo chmod +x /usr/local/bin/yt

Jetzt von überall nutzbar:

yt "musik"

Teil 6: Script-Funktionen im Detail

Wie die YouTube-Suche funktioniert

yt-dlp "ytsearch10:linux tutorial"

Was passiert:

  1. ytsearch10: = Suche nach 10 Ergebnissen
  2. linux tutorial = Suchbegriff
  3. yt-dlp fragt YouTube API
  4. Gibt Titel, ID, Dauer zurück

Wie die Formatierung funktioniert

--get-title --get-id --get-duration | paste - - -

Ausgabe ohne paste:

Video Titel 1
dQw4w9WgXcQ
3:32
Video Titel 2
abc123def45
5:12

Ausgabe mit paste - - -:

Video Titel 1    dQw4w9WgXcQ    3:32
Video Titel 2    abc123def45    5:12

paste - - - kombiniert je 3 Zeilen zu einer (mit Tab getrennt)

Wie die Auswahl funktioniert

sed -n "${choice}p"
  • sed -n = Nur gewählte Zeile ausgeben
  • "${choice}p" = Zeile mit Nummer aus Variable choice
  • Beispiel: choice=3 → gibt 3. Zeile aus
cut -f2
  • cut -f2 = Nimm 2. Feld (Tab-getrennt)
  • Feld 1 = Titel, Feld 2 = ID, Feld 3 = Dauer

mpv-Parameter erklärt

--ytdl-format=bestaudio[height<=720][vcodec=avc1][acodec=opus]

Format-Filter:

  • bestaudio = Bestes Audio-Format
  • [height<=720] = Von Video max 720p (spart Bandbreite)
  • [vcodec=avc1] = Video-Codec AVC1 (wenn verfügbar)
  • [acodec=opus] = Audio-Codec Opus (beste Qualität)

Cache-Einstellungen:

  • --cache=yes = Cache aktivieren
  • --cache-secs=60 = 60 Sekunden vorpuffern
  • --demuxer-max-bytes=50M = Max 50 MB im RAM

Teil 7: MPV-Steuerung während Wiedergabe

Wichtigste Tasten

Taste Funktion
Space Pause/Play
q Beenden
Q Beenden und Position merken
9 / 0 Lautstärke -2 / +2
m Mute/Unmute
← / → Kurz Sekunden zurück/vor (z.B. 5-10s)
↑ / ↓ Länger zurück/vor (z.B. 1 min)
PgUp / PgDn Großer Sprung (z.B. 10 min)
[ / ] Geschwindigkeit verringern/erhöhen 
{ / } FeinerGeschwindigkeitsmodus (abhängig von Version/Config)
Backspace Geschwindigkeit zurücksetzen

Erweiterte Steuerung

Taste Funktion
i Infos anzeigen (Format, Bitrate, etc.)
I Erweiterte Infos
` (Backtick) Konsole öffnen
1 / 2 Kontrast -/+
3 / 4 Helligkeit -/+
5 / 6 Gamma -/+
7 / 8 Sättigung -/+

Teil 8: Script erweitern

Erweiterung 1: Mehr Ergebnisse

Im Script ändern:

# Von ytsearch10 zu ytsearch20
RESULTS=$(yt-dlp "ytsearch20:$SEARCH" ...)

# Prompt anpassen
read -p "Welches Video? (1-20): " choice

Erweiterung 2: Playlist-Support

Neues Script yt-playlist.sh:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: yt-playlist.sh 'PLAYLIST_URL'"
    exit 1
fi

PLAYLIST_URL="$1"

echo "Lade Playlist..."

# Playlist-Info anzeigen
yt-dlp --flat-playlist "$PLAYLIST_URL" | head -20

echo ""
read -p "Playlist abspielen? (y/n): " confirm

if [ "$confirm" = "y" ]; then
    mpv --ytdl-format=bestaudio --playlist="$PLAYLIST_URL"
fi

Erweiterung 3: Download-Option

Im Haupt-Script nach Auswahl hinzufügen:

read -p "Abspielen (p) oder Download (d)? " action

if [ "$action" = "d" ]; then
    # Download als MP3
    yt-dlp -f bestaudio --extract-audio --audio-format mp3 \
        -o "%(title)s.%(ext)s" "$VIDEO_URL"
    echo "Download abgeschlossen!"
else
    # Normal abspielen
    mpv --ytdl-format=bestaudio "$VIDEO_URL"
fi

Erweiterung 4: Verlauf speichern

Am Ende des Scripts hinzufügen:

# Verlauf speichern
echo "$(date '+%Y-%m-%d %H:%M:%S') | $SEARCH | $VIDEO_URL" >> ~/yt-history.log

Verlauf anzeigen:

tail -20 ~/yt-history.log

Teil 9: Troubleshooting

Problem: "yt-dlp: command not found"

# Prüfen ob installiert
which yt-dlp

# Wenn nicht gefunden, neu installieren
sudo wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp
sudo chmod +x /usr/local/bin/yt-dlp

# In Script vollständigen Pfad nutzen
/usr/local/bin/yt-dlp "ytsearch10:$SEARCH" ...

Problem: Kein Ton bei mpv

# ALSA neu initialisieren
sudo alsactl init

# Lautstärke setzen
amixer sset Master unmute
amixer sset Master 100%

# mpv mit verbose starten
mpv -v --no-video "URL"

Problem: "Failed to recognize file format"

# yt-dlp aktualisieren
sudo yt-dlp -U

# Oder Cache leeren
rm -rf ~/.cache/yt-dlp/

Problem: Video zu langsam/stottert

Im Script Cache erhöhen:

mpv --cache-secs=120 \
    --demuxer-max-bytes=100M \
    "$VIDEO_URL"

Problem: Script zeigt keine Ergebnisse

# Debug-Mode aktivieren
RESULTS=$(yt-dlp "ytsearch10:$SEARCH" \
    --get-title \
    --get-id \
    --get-duration)

# Ausgabe prüfen
echo "$RESULTS"

# Wenn leer: Netzwerk prüfen
ping -c 3 youtube.com

Teil 10: Nützliche Zusatz-Scripts

Quick-Play Script (ohne Suche)

nano ~/ytp.sh
#!/bin/bash
# Direkt abspielen ohne Suche

if [ -z "$1" ]; then
    echo "Usage: ytp.sh 'URL'"
    exit 1
fi

mpv --ytdl-format=bestaudio --cache=yes "$1"
chmod +x ~/ytp.sh
alias ytp='~/ytp.sh'

Audio-Test Script

nano ~/audio-test.sh
#!/bin/bash

echo "═══════════════════════════════════════"
echo "  Audio-Test Script"
echo "═══════════════════════════════════════"
echo ""

echo "1. ALSA-Geräte:"
aplay -l
echo ""

echo "2. Lautstärke:"
amixer get Master | grep -E "Playback.*\["
echo ""

echo "3. Speaker-Test (2 Sekunden)..."
speaker-test -t wav -c 2 -l 1
echo ""

echo "4. Test-MP3 erstellen und abspielen..."
ffmpeg -f lavfi -i "sine=frequency=1000:duration=3" -y /tmp/test.mp3 2>/dev/null
mpv /tmp/test.mp3
rm /tmp/test.mp3

echo ""
echo "Audio-Test abgeschlossen!"
chmod +x ~/audio-test.sh

Zusammenfassung

Installation (Kurzversion)

# 1. Pakete installieren
sudo apt install -y mpv ffmpeg alsa-utils
sudo wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp
sudo chmod +x /usr/local/bin/yt-dlp

# 2. Audio konfigurieren
amixer sset Master unmute
amixer sset Master 100%
speaker-test -t wav -c 2 -l 1

# 3. mpv Config
mkdir -p ~/.config/mpv
cat > ~/.config/mpv/mpv.conf << 'EOF'
script-opts=ytdl_hook-ytdl_path=/usr/local/bin/yt-dlp
audio-device=alsa
volume=80
ytdl-format=bestaudio
no-video
cache=yes
EOF

# 4. Script erstellen (siehe oben)
nano ~/yt-search.sh
# [Script-Inhalt einfügen]
chmod +x ~/yt-search.sh

# 5. Alias erstellen
echo "alias yt='~/yt-search.sh'" >> ~/.bashrc
source ~/.bashrc

# 6. Fertig!
yt "test"

Jetzt kannst du YouTube im Terminal genießen! 🎵🎬