Musik im Terminal

  Ralf Hersel   Lesezeit: 8 Minuten  🗪 8 Kommentare

Einen Song suchen und abspielen auf der Kommandozeile.

musik im terminal

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:

  1. 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.

  2. awk 'NR==2' extrahiert die zweite Zeile der Ausgaben von yt-dlp, also die zweite URL, wobei NR ein Zeilenzähler ist.

  3. 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 192.168.1.0/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.

Tags

Musik, Terminal, YouTube, Kommandozeile, Suchen

Martin
Geschrieben von Martin am 7. Juli 2022 um 09:44

Nett, ich habe mir vor ner Weile mal ein script gebastelt um YouTube Videos oder Playlisten mit mpd abzuspielen: https://salsa.debian.org/mdosch/mpdpipe Vielleicht bau ich da auch mal eine Suche ein.

Peter
Geschrieben von Peter am 7. Juli 2022 um 18:04

Hmm.

-f 'bestaudio[abr<150kbr]' koennte die Rueckgabe passend einschraenken (Audiophile verzichten bitte auf den Klammernausdruck) .

//

In der Tat sehe ich in der Url itag=242 and itag=251, was mir erstmal verdaechtig bekannt vorkommt fuer Youtube.

Wenn ich via Browser suche, sehe ich als erstes Ergebnis ein Video mit der ID Mb3iPP-tdA, und yt-dlp -F Mb3iPP-tHdA gibt fuer obige Nummern die Formate vp9 320x200 (nur Video) und opus (nur Audio) an.

Da neuere Videos bei Youtube nurmehr in Teilformaten in vernuenftiger Groesse vorliegen, duerfte fuer Videos -g nurmehr eingeschraenkt brauchbar sein. (Und die Youtube VideoID selbst sehe ich nicht mehr in den von -g gezeigten URLs - kennt jemand hier 'ne Rueckwaertssuche?).

Noch ein Goodie vom Archwiki (mpv), das gerade fand: function yta() { mpv --ytdl-format=bestaudio ytdl://ytsearch:"$*"; }

cu Peter

Ralf Hersel
Geschrieben von Ralf Hersel am 7. Juli 2022 um 21:28

Genial. Danke Peter. Ich habe einen Nachtrag zum Artikel geschrieben.

Herr_Dyyhl
Geschrieben von Herr_Dyyhl am 12. Juli 2022 um 06:30

Lichtjahre von komfortabel entfernt. 😉 Mit den Kurzbefehlen ist es zwar etwas besser, aber dann mache ich mir lieber einen Musikdienst an oder meine Musiksammlung auf und habe auch gleich eine Auswahl für noch mehr Musik.

kamome
Geschrieben von kamome am 12. Juli 2022 um 14:27

Da gehörst Du wohl einfach nicht zur Zielgruppe ;) Auswahl ist doch was Feines :) Außerdem finde ich hier nicht nur die Benutzbarkeit, sonder auch die Geekyness beachtlich ;)

kamome
Geschrieben von kamome am 12. Juli 2022 um 14:33

Danke, sehr cool!

Ich würde allerdings einen anderen Namen vorschlagen, da „play“ auch Bestandteil von sox ist.

Aber wofür eigentlich ein Alias – geht doch gleich mit einer Funktion (z. B. „play youtube audio“):

pyta() { mpv --ytdl-format=bestaudio ytdl://ytsearch:"$*"; }

Und er Aufruf geht sogar noch etwas praktischer (wenn auch unschöner) ohne Quotes: pyta final fantasy liberatio

Ralf Hersel
Geschrieben von Ralf Hersel am 1. Oktober 2022 um 23:21

Ist doch schnurzwurscht, ob Alias oder Funktion. Aus Benutzersicht macht das im Terminal keinen Unterschied. Und den Alias-Namen kann sich jede:r selbst aussuchen.

klausb
Geschrieben von klausb am 24. November 2022 um 11:01

Super Sache, vielen Dank. Genau solche "Basteleien" machen doch das Leben mit Linux so spannend. Leider komme ich jetzt aus dem Musikhören gar nicht mehr raus, weil mir immer neue Songs aus meiner Jugend einfallen ;) Macht weiter so mit solchen Tricks.