Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03102.jsonl.gz/128

Do, 7. Juli 2022, Ralf Hersel
Was macht ihr, wenn ihr nach einem Musikstück sucht, oder einen bestimmten Song hören möchtet? Die meisten werden wohl mit Spotify, Deezer, Youtube oder "eigene Musiksammlung" antworten. Die hier beschriebene Lösung streamt von Youtube auf der Kommandozeile.
Nehmen wir an, ihr sitzt am Computer und starrt in die dunklen Abgründe eures Terminals. Dann kommt euch die Idee, endlich einmal wieder den Song "A whiter shade of pale" von Procul Harum zu hören. Jetzt tippt ihr play 'a whiter shade of pale' in die Konsole und schon spielt das Lied los. Wie geht das?
Dafür sind zwei Programme nötig: yt-dlp und mpv. Ausserdem ist die Textbearbeitungssprache awk und xargs mit im Spiel. Bevor ihr mit play 'was auch immer' irgendein Lied abspielen könnt, erkläre ich die Befehlskette dahinter. Der Befehl im Terminal sieht so aus:
yt-dlp -g ytsearch1:'a whiter shade of pale' | awk 'NR==2' | xargs mpv
Voraussetzung dafür, ist die Installation von yt-dlp und mpv. Ersteres ist eine YouTube-Schnittstelle, mit der sich Videos und Audios von der Plattform herunterladen lassen, wie wir berichteten. MPV ist ein Multimedia-Player für den GNU/Linux-Desktop und das Terminal. Beide Anwendungen findet ihr im Paketmanager eurer Distribution. Falls yt-dlp dort nicht vorhanden sein sollte, könnt ihr ihn auch mit pip install yt-dlp installieren.
Das oben gezeigte Kommando macht 3 Dinge:
- yt-dlp verwendet den Parameter -g, der die Streaming-URL des gesuchten Songs zurückgibt. ytsearch1: startet eine Suche nach dem dahinter angegebenen Titel und/oder Interpreten. Die 1 bewirkt, dass nur die URLs für einen Song geliefert werden. Das Ergebnis dieses Kommandos sieht z. B. so aus:
yt-dlp -g ytsearch1:'a whiter shade of pale' https://rr4---sn-1gi7znek.googlevideo.com/videoplayback?expire=1657153799... https://rr4---sn-1gi7znek.googlevideo.com/videoplayback?expire=1657153799...
Die URLs habe ich gekürzt; tatsächlich sind diese sehr lang und unterschiedlich. Ich konnte noch nicht herausfinden, was der Unterschied zwischen ihnen ist. Tests haben gezeigt, dass die Zweite die richtige Adresse für den Stream ist.
- awk 'NR==2' extrahiert die zweite Zeile der Ausgaben von yt-dlp, also die zweite URL, wobei NR ein Zeilenzähler ist.
- xargs mpv empfängt die Ausgabe von awk und spielt die extrahierte Stream-URL als Audio-Datei ab. Man kann den Parameter (URL) nicht einfach zu mpv pipen (|), sondern muss xargs verwenden, um der Anwendung mpv den Parameter einzuflössen. Xargs nimmt über die Standardeingabe (meist über Pipes) Text entgegen. Dieser wird dem angegebenen Argument (hier mpv) als Kommandozeilenargument mitgegeben.
In Kombination liefert yt-dlp die Stream-URLs, awk ermittelt die Zweite und schickt sie zum Abspielen an mpv.
Nun ist es etwas nervig, sich diese Kommando-Kombination zu merken, bzw. sie einzutippen. Daher kommt jetzt ein Alias zum Einsatz. Einen Alias erstellt man in der Konfigurationsdatei der verwendeten Terminal-Shell, also Bash oder Z-Shell usw. Diese Dateien befinden sich im Home-Verzeichnis und heissen .bashrc oder .zshrc und können mit einem Editor bearbeitet werden.
Wer öfters im Termin arbeitet, ist gut beraten, sich darin Aliase einzurichten, um häufige oder lange Befehle einfacher aufzurufen. Hier ist ein Beispiel meiner Aliase:
alias l='ls -l --color=auto' alias ll='ls -alF --color=auto' alias la='ls -A --color=auto' alias h='cd ~' alias scanip="nmap -sn <ip-pii>/24 | awk '/for/ {print substr(\$0,22)}'" alias m='ncmpcpp' alias autoremove='sudo pacman -Rs $(pacman -Qtdq); flatpak uninstall --unused' alias play='_y(){ yt-dlp -g ytsearch1:"$1" | awk ''NR==2''| xargs mpv ; }; _y'
Der Alias h ersetzt z. B. das Kommando cd ~, um in das Home-Verzeichnis zu springen. Statt cd ~ kann man im Terminal einfach h eingeben. In der letzten Zeile seht ihr den Alias für das Play-Music Kommando. Dabei fällt auf, dass es nicht genauso aussieht wie der normale Terminal-Befehl (siehe oben). Alias-Befehle haben ein paar Einschränkungen, verglichen mit den Terminal-Befehlen. Wenn die Befehle nicht trivial sind oder Parameter verarbeiten sollen, kann der Terminal-Befehl nicht eins zu eins in den Alias übernommen werden.
Einen Ausweg bieten Shell-Script Funktionen, die auch in diesem Beispiel zum Einsatz kommen. Der Alias play definiert eine Funktion namens _y() und ruft diese auch gleich auf: _y. Innerhalb der Funktion steht wieder die volle Shell-Script Power zur Verfügung. Nun ja, die Überführung von Terminal-Befehlen in Aliase ist nicht ganz einfach. Auch für den play-Alias musste ich ein paar Mal die GNU/Linxu.ch-Community bemühen, bis er funktionierte.
Die Mühe hat sich gelohnt, denn jetzt kann man jeden x-beliebigen Titel mit play anhören.
play 'systemabsturz verdächtig' (+) Audio --aid=1 --alang=eng (*) (opus 2ch 48000Hz) AO: [pulse] 48000Hz stereo 2ch float A: 00:00:43 / 00:03:43 (19%) Cache: 179s/7MB
Nachtrag
Aufgrund des Kommentars von Peter (siehe Kommentare), habe ich mir die Sache noch einmal angesehen. Das oben genannte Kommando liefert zwei URLs: eine für den Video- und eine für den Audio-Stream. Man kann yt-dlp zu Audio zwingen, und zwar zu 'bestaudio'. Dann erhält man nur eine Stream-URL, womit awk nicht mehr nötig ist. Der Befehl sieht dann so aus:
yt-dlp -g -f bestaudio ytsearch1:'dua lipa levitating' | xargs mpv bzw. alias play='_y(){ yt-dlp -g -f bestaudio ytsearch1:"$1" | xargs mpv ;}; _y'
Ob ihr es glaubt oder nicht, es geht noch einfacher. Peter hat im Arch-Wiki diesen Befehl ausgegraben:
mpv --ytdl-format=bestaudio ytdl://ytsearch:'dua lipa levitating' bzw. alias play='_y(){ mpv --ytdl-format=bestaudio ytdl://ytsearch:"$*";}; _y'
Dabei wird nur noch MPV verwendet. Der Player ist selbst in der Lage, yt-dlp zu verwenden. Sehr cool. Vielen Dank Peter.