Ich suche nach einer Möglichkeit, YouTube-Videos im Terminal anzusehen (nicht in einem Browser oder einem anderen Fenster, sondern direkt dort, in jeder Bash-Sitzung).
Gibt es eine einfache Möglichkeit, dies zu tun?
Ich stelle mir so etwas vor:
$ youtube <video-url>
Ich weiß bereits, wie man ein Video abspielt mit mplayer
:
$ mplayer -vo caca local-file.avi
Allerdings öffnet sich dadurch ein neues Fenster. Es wäre cool, es im Terminal abzuspielen.
Außerdem sollte es mit tmux
Sitzungen kompatibel sein.
Ich habe eine andere Frage gestellt fürSo verhindern Sie das Öffnen eines neuen Fensters.
Für diejenigen, die sich fragen, wo ich eine solche Funktionalität brauche, habe ich ein experimentelles Projekt namensTmuxOS-- mit dem Konzept, dassalles sollte innerhalb einer tmux
Sitzung laufen.
Ich brauche also tatsächlich einen Videoplayer für lokale und Remote-Videos. :-)
Antwort1
Sie können Videos und/oder nur den Ton herunterladen und diese dann ansehen/anhören mityoutube-dl
. Das Skript ist in Python geschrieben und verwendet, ffmpeg
glaube ich.
$ youtube-dl --help
Usage: youtube-dl [options] url [url...]
Options:
General Options:
-h, --help print this help text and exit
--version print program version and exit
-U, --update update this program to latest version.
Make sure that you have sufficient
permissions (run with sudo if needed)
...
...
Um Videos herunterzuladen, geben Sie einfach die URL der Seite ein, auf der das Video angezeigt werden soll, und das Skript erledigt den Rest:
$ youtube-dl https://www.youtube.com/watch?v=OwvZemXJhF4
[youtube] Setting language
[youtube] OwvZemXJhF4: Downloading webpage
[youtube] OwvZemXJhF4: Downloading video info webpage
[youtube] OwvZemXJhF4: Extracting video information
[youtube] OwvZemXJhF4: Encrypted signatures detected.
[youtube] OwvZemXJhF4: Downloading js player 7N
[youtube] OwvZemXJhF4: Downloading js player 7N
[download] Destination: Joe Nichols - Yeah (Audio)-OwvZemXJhF4.mp4
[download] 100% of 21.74MiB in 00:16
Sie können diese dann verwenden vlc
oder mplayer
lokal ansehen:
$ vlc "Joe Nichols - Yeah (Audio)-OwvZemXJhF4.mp4"
VLC media player 2.1.5 Rincewind (revision 2.1.4-49-gdab6cb5)
[0x1cd1118] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"
OK, aber ich möchte diese Videos so sehen, wie sie gestreamt werden und in ASCII
Ich habe diesen Blog-Artikel mit dem Titel gefunden:Über ASCII, YouTube und Loslassen (Wayback Machine)das demonstriert die Methode, die ich im Chatroom besprochen habe, wobei es hauptsächlich youtube-dl
als „Backend“ verwendet wird, das den YouTube-Stream herunterladen und dann an eine andere App weiterleiten kann.
Dieser Artikel zeigt, wie es gemacht wird mit mplayer
:
$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
mplayer -vo aa -monitorpixelaspect 0.5 -
Das heruntergeladene Video youtube-dl
wird über STDOUT umgeleitet -o -
. Es gibt eineDemo des Effekts hier.
Durch die Installation zusätzlicher Bibliotheken kann das ASCII-Video weiter verbessert werden.
OK, aber ich möchte das Video in meinem aktuellen Terminal?
xterm
Ich habe diesen Trick gefunden, mit dem sich Videos in einem Artikel von O'Reilly mit dem Titel abspielen lassen :Sehen Sie sich Videos in ASCII-Art an.
$ xterm -fn 5x7 -geometry 250x80 -e "mplayer -vo aa:driver=curses j.mp4
Das Obige führt dazu, dass ein xterm
Fenster geöffnet wird, in dem das Video abgespielt wird.
Also dachte ich, warum nicht die Erdnussbutter und die Schokolade so kombinieren:
$ xterm -fn 5x7 -geometry 250x80 -e \
"youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
mplayer -vo aa:driver=curses -"
Das funktioniert fast! Ich bin nicht sicher, warum das Video nicht im Fenster abgespielt werden kann, aber es sieht so aus, als ob es möglich wäre. Das Fenster öffnet sich und beginnt mit der Wiedergabe, schließt sich dann aber. Ich sehe ein paar Sekunden lang das Video und dann nichts mehr.
Vielleicht bringt Sie das oben Gesagte Ihrer endgültigen Lösung näher, oder vielleicht müssen die Optionen nur ein wenig angepasst werden.
Zusätzliche Bibliotheken
Wenn Sie libcaca
(die farbige Version von aalib
) installiert haben und die Schriftgröße in Ihrem gnome-terminal
auf einen sehr kleinen Wert, beispielsweise 3, reduzieren, wird mit dem folgenden Befehl direkt im Terminal ein viel besser aussehendes ASCII-Video angezeigt:
$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4
Klemmen
Es scheint, dass die Wahl des Terminals einen großen Unterschied machen kann, ob man mplayer
direkt im Terminal spielen kann oder ob ein separates Fenster geöffnet wird. Auch das Caching mplayer
machte einen dramatischen Unterschied bei der Möglichkeit, direkt im Terminal zu spielen.
Mit diesem Befehl konnte ich zumindest das erste Viertel des Videos abspielen terminator
, bevor es abbrach:
$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
mplayer -cache 32767 -vo aa:driver=curses -
Die farbige Version verwendet diesen Befehl:
$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
CACA_DRIVER=ncurses mplayer -cache 64000 -vo caca -
Diese gleichen Befehle könnten auch in gnome-terminal
& abgespielt werden xterm
.
NOTIZ:Das sind (von links nach rechts) xterm
, terminator
, gnome-terminal
, und terminology
.
Antwort2
Also, mitTerminologie (übrigens wahrscheinlich das Beste, was einem Terminalemulator je passiert ist) zum Zeitpunkt des Schreibens dieses Artikelsfolgende Werke:
ytplay() (
init() if [ "${#1}" -gt 0 ] && i=$? du= f=
then durl \! \" \# \$ \% \& \' \( \) \* \
\+ \, \/ \: \; \= \? \@ \[ \]
: >"${f:=${2:-/tmp/vid}.$(
durl "$1" 's/.*mime=[^/]*.\([^&]*\).*/\1/'
)}"
init() { loop; }
else ! echo 'NO LINK SPECIFIED!' >&3
fi
durl() if [ "${#du}" -eq 0 ]
then du=$(for c do printf 's/%%%X/\\%s/g;' "'$c" "$c"; done)
else curl -s "$1" | { shift
sed '/.*url_encoded_fmt_stream_map[^,]*url=/!d
s///;s/,.*//;s/\\u0026/\&/g;'"$du$*"; }
fi
loop() if [ "$((i=$i+1))" -le 5 ] &&
sleep "$(($i*2))"
then play || kill "$pid" || :
else ! echo 'ERROR RETRIEVING VIDEO!' >&3
fi
play() if [ -s "$f" ]
then printf '\033}bt%s\0' "$f"; exit
fi
while init "$@" || exit
do curl -s "$(durl "$1")" >"$f" & pid=$!
done 3>&2 2>/dev/null
)
Das terminology
spezifische Bit ist der then
Block in play()
– der printf \033}...
Zeile. terminology
Akzeptiert erweiterte Terminal-Escapes zum Drucken von Medien auf dem Bildschirm – ähnlich wie Eingabeaufforderungsfarben, aber auch hochauflösendes Video und im Grunde alles andere, was Sie möchten.
Der Rest ist ein kleines curl | sed
Skript, das:
- Akzeptiert einen normalen YouTube-Link als erstes Argument ...
ytplay 'https://www.youtube.com/watch?v=${id}'
und so weiter...
- Zieht das HTML und findet den relevanten JavaScript-Code für alternative Download-Streams ...
- tun
curl "$yturl" | grep url_encoded_fmt_stream_map
, um den ganzen Block zu sehen.
- tun
- Aus diesem Block wählt es den ersten angebotenen alternativen Stream aus.
- Es werden viele angeboten. Wenn Sie das
grep
oben genannte getan haben, finden Sie die Liste im"
durch Anführungszeichen getrennten...stream_map: "
Feld. - während ich zuerst dachte, ich würde nur MP4s bekommen, bekomme ich immer mehr auch WebMS. Also habe ich es für den Fluss bearbeitet und die Dateierweiterung nach MIME-Typ zugewiesen.
- bis jetzt- ob webm oder mp4 - der erste alternative Stream ist die höchste angebotene Qualität pro Video -normalerweise720p .mp4 – das ist es, was ich sowieso suche, und daher gibt es hier keine Logik, andere auszuwählen. Meine letzte Bearbeitung hat jedoch einige Modularitäts-/explizite Tests hinzugefügt, um dies zu ermöglichen. SieheDasfür das Perl-Skript, auf das ich beim ursprünglichen Schreiben der Funktion verwiesen habe.
- Es werden viele angeboten. Wenn Sie das
- Analysiert die
%[[:hexdigit:]]\{2\}
Kodierung in funktionierende Links.- SehenDasals meine Arbeitsreferenz.
- Versucht mit einer kleinen Verzögerung bis zu fünfmal, die Datei herunterzuladen.
- Standardmäßig ist dies die Datei,
/tmp/vid.${mime-type}
aber wennytplay
sie mit einem zweiten Argument aufgerufen wird, wird dieses als der gewünschte Download-Dateiname interpretiert – während weiterhin die Erweiterung entsprechend dem MIME-Typ angehängt wird.
- Standardmäßig ist dies die Datei,
- Wenn das Downloadziel nach einem der Versuche größer als Null ist, wird der Download im Hintergrund fortgesetzt und es wird die Meldung
terminology
's ausgegeben.Medien jetzt in den Hintergrund legenTerminal-Escape, sonst gibt es einfach auf und hinterlässt eine Fehlermeldung komplett in Großbuchstaben.\033}bt[LINK/FILE]\0
für die Wiedergabe im Vollbildmodus.pn
würde es in einem neuen Fenster öffnen. Es gibt andere, um den Wiedergabebereich geometrisch einzuschränken – beispielsweise nur für einen Teil des Fensters.
Dies hat nur etwas mehr alssehr geringEs wurde getestet, aber es hat bisher für alle Links bis auf einen fehlerfrei funktioniert - und da ich den Link, der nicht abgespielt wurde, eigentlich nicht ansehen wollte, habe ich nicht versucht, den Grund dafür herauszufinden.
Obwohl es bei allen funktionierte, war es nicht unbedingtspieleneach - und das liegt daran, dass ich die Erweiterung zunächst blind .mp4
an die Zieldatei angehängt habe, ohne zu prüfen, ob sie korrekt ist. Es ist möglich, dass die Datei, die ich vorher nicht überprüft habe, auch nur diese war. Auf jeden Fall habe ich sie geändert, um das zu berücksichtigen.
Wie ich bereits erwähnt habe, terminology
befindet sich das einzige spezifische Bit in der allerletzten Funktion – play()
und Sie können das also leicht ändern, um mit der heruntergeladenen Videodatei alles zu tun, was Sie möchten – z. B. sie mit mplayer
den CACA-Bibliotheken von in einem anderen Terminal verwenden oder sie in ein Fenster öffnen vlc
oder was auch immer. Aber wenn Sie möchten, können Sie es in HD ansehen terminology
.
Oh, und zuletzt, das ist normalerweisesehr schnell– meine Geschwindigkeiten haben meine Bandbreite bisher bei jedem Versuch für die Dauer maximal ausgeschöpft, aber terminology
zum Starten der Wiedergabe ist ohnehin nicht die gesamte Datei erforderlich.
Hier funktioniert es:
Antwort3
Auf Youtube gibt es dazu ein Tutorial:
https://www.youtube.com/watch?v=QCuq0_nY3Xk
Laut diesem Video sollte Folgendes funktionieren:
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Sie können zu diesem Zweck eine einfache Funktion erstellen:
playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}
Antwort4
Aushttps://github.com/mps-youtube/mps-youtube
sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt