Sehen Sie sich YouTube-Videos im Terminal an

107

Ich suche nach einer Möglichkeit, YouTube-Videos im Terminal anzusehen (nicht in einem Browser oder einem anderen Fenster, sondern genau dort, in einer beliebigen Bash-Sitzung).

Gibt es eine einfache Möglichkeit, dies zu tun?

Ich stelle mir so etwas vor:

$ youtube <video-url>     

Ich kann bereits ein Video abspielen mit mplayer:

$ mplayer -vo caca local-file.avi

Dies öffnet jedoch ein neues Fenster. Es wäre cool, es im Terminal zu spielen.

Außerdem sollte es mit tmuxSitzungen kompatibel sein .


Ich habe eine andere Frage gestellt, um zu verhindern, dass ein neues Fenster geöffnet wird .


Für diejenigen, die sich fragen, wo ich eine solche Funktionalität benötige, habe ich ein experimentelles Projekt namens TmuxOS gestartet - mit dem Konzept, dass alles innerhalb einer tmuxSitzung ablaufen soll .

Also, in der Tat brauche ich einen Videoplayer für lokale und entfernte Videos. :-)

Ionică Bizău
quelle
2
Meinst du so? google.com/…
Chaos
1
@chaos Genau. :-) Ich suche das seit Monaten, aber noch nichts gefunden. Beschlossen, hier zu fragen ...
Ionică Bizău
VLC kann YouTube-Videos wiedergeben, ist sich aber nicht sicher, ob es über Terminal-Ausgabefunktionen verfügt.
Mit mpv kannst du das machen mpv <youtube url>. Es funktioniert auch für eine Reihe anderer Video-Sites. Dies öffnet aber ein neues Fenster.
Gerardo Marset
1
Das ist eine faszinierende Frage, und aus den Antworten habe ich viel gelernt. Aber aus Neugier - warum um alles in der Welt müssen Sie das tun? ;-)
Digitales Trauma

Antworten:

132

Sie können Videos und / oder nur die Audiodateien herunterladen und diese dann mit ansehen / anhören youtube-dl. Das Skript ist in Python geschrieben und bedient sich ffmpegmeines Erachtens.

$ 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 Sie das Video haben möchten, 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 lokal mit vlcoder mplayeransehen:

$ 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 als Stream & in ASCII ansehen

Ich fand diesen Blog-Artikel mit dem Titel: Auf ASCII, Youtube und Loslassen , der die Methode demonstriert, die ich im Chatroom besprochen habe, hauptsächlich youtube-dlals "Backend", das das Herunterladen des YouTube-Streams und die Weiterleitung zu einer anderen App ermöglicht.

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 von heruntergeladene Video youtube-dlwird über STDOUT weitergeleitet -o -. Hier gibt es eine Demo des Effekts .

          ss # 1

Durch die Installation zusätzlicher Bibliotheken kann das ASCII-Video weiter verbessert werden.

               ss # 2

OK, aber ich möchte das Video in meinem aktuellen Terminal?

Ich habe diesen Trick gefunden, mit dem Videos in einem xtermder folgenden O'Reilly- Artikel abgespielt werden können : Videos in ASCII Art ansehen .

$ xterm -fn 5x7 -geometry 250x80 -e "mplayer -vo aa:driver=curses j.mp4

Das obige führt dazu, dass ein xtermFenster geöffnet wird, in dem das Video abgespielt wird.

   ss # 3

Also dachte ich mir, warum man die Erdnussbutter und die Schokolade nicht so zusammensetzt:

$ 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 scheint, als ob dies möglich wäre. Das Fenster öffnet sich und beginnt zu spielen, schließt sich aber wieder. Ich sehe Video für ein paar Sekunden und dann nichts.

Vielleicht bringt Sie das Obige näher an Ihre endgültige Lösung, oder vielleicht müssen Sie die Optionen nur ein wenig anpassen.

Zusätzliche Bibliotheken

Wenn Sie libcaca(die kolorierte Version von aalib) installiert haben und die Schriftgröße in Ihrer gnome-terminalauf etwas wirklich Kleines reduzieren , wie z. B. 3, zeigt der folgende Befehl ein viel besser aussehendes ASCII-Video direkt im Terminal an:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   ss # 4

Terminals

Es scheint, dass die Wahl des Terminals eine große Rolle spielt, ob mplayeres direkt im Terminal abgespielt werden kann oder ob es ein separates Fenster öffnet. Auch das Cachen auf mplayermachte einen dramatischen Unterschied, wenn es darum ging, direkt in einem Terminal zu spielen.

Mit diesem Befehl konnte ich terminatorzumindest das erste Viertel des Videos vor dem Ausschneiden abspielen :

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -cache 32767 -vo aa:driver=curses -

Die farbige Version verwendete diesen Befehl:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    CACA_DRIVER=ncurses mplayer -cache 64000 -vo caca -

Dieselben Befehle könnten auch in gnome-terminal& xtermabgespielt werden.

    ss montage

    HINWEIS: Das ist (von links nach rechts) xterm, terminator, gnome-terminal, und terminology.

slm
quelle
2
Sie können es in spielen terminology- und nicht nur mit den Caca-Bibliotheken. Sie können Terminal-Escape-Zeichen verwenden, um einen zugeordneten Teil des Terninal-Fensters anzugeben und dort in High-Def abzuspielen. Sie können das Video sogar auf Ihren Hintergrund einstellen und darüber arbeiten. terminologyVerstehe auch URIs - erhalte einen Weblink zu deinem YouTube-Video und rufe printfes einfach wie eine Terminal-Eingabeaufforderung auf dem Bildschirm auf.
mikeserv
@mikeserv - das ist cool, noch nie von diesem Terminalemulator gehört. Ich habe es ausprobiert und es ist cool, dass man Videos im Hintergrund abspielen kann, tybg my.avitut es.
slm
Ja, ich bevorzuge die printfMethode. Tun , tybg somefile | sed -n lum zu sehen , wie es funktioniert - es nutzt nur erweiterte Terminal entweicht. Sie sind auf der manSeite dokumentiert . Das können Sie auch mit tun ty{ls,cat}. Aber diese kleinen Apps sind nur alte Demo-Wrapper der realen Sache und vielleicht nicht so fähig. Wie auch immer, wenn deine Version in den letzten paar Monaten erstellt wurde, magst du die Miniview vielleicht genauso wie ich - mache Strg + Shift + H. Alle Erleuchtung ist ziemlich gut - deshalb habe ich vorgeschlagen, dass Sie es vor kurzem versuchen. Es ist auch verrückt schnell.
mikeserv
3
Was sind die genannten zusätzlichen ASCII-Bibliotheken?
PythonNut
1
@slm schade, ich denke nur die deb-multimedia builds haben es aktiviert. Ich frage mich, warum die anderen das nicht tun. Ich schätze, sie halten Libcaca für einen Witz.
Derobert
14

Mit der Terminologie (übrigens das Beste, was einem Terminal-Emulator jemals passiert ist) zum Zeitpunkt dieses Schreibens funktioniert Folgendes:

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 terminologyspezifische Bit ist der thenBlock in play()der printf \033}...Zeile. terminologyAkzeptiert erweiterte Terminal-Escapes für Druckmedien auf dem Bildschirm - ein bisschen wie sofortige Farben, aber auch HD-Videos und im Grunde alles, was Sie wollen.

Der Rest ist ein bisschen curl | sedSkript , dass:

  1. Akzeptiert einen regulären YouTube-Link als erstes Argument ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' und so weiter...
  2. Ruft den HTML-Code ab 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.
  3. Aus diesem Block wird der erste angebotene alternative Stream ausgewählt.
    • Viele werden angeboten - wenn Sie dies getan haben, grepfinden Sie die Liste im durch "Anführungszeichen getrennten ...stream_map: "Feld.
    • während ich anfangs dachte, ich würde immer mehr nur mp4s bekommen, bekomme ich auch webms. Also habe ich es für den Fluss bearbeitet und die Dateierweiterung nach MIME-Typ zugewiesen.
    • Bisher ist der erste alternative Stream - ob Webm oder MP4 - die höchste Qualität, die pro Video angeboten wird - normalerweise 720p .MP4 -, was ich sowieso suche, und daher gibt es hier keine Logik für die Auswahl anderer. Meine letzte Bearbeitung hat jedoch einige Modularitätstests / explizite Tests hinzugefügt, um dies zu ermöglichen. Siehe dies für das Perl-Skript, auf das ich beim ursprünglichen Schreiben der Funktion verwiesen habe.
  4. Analysiert die %[[:hexdigit:]]\{2\}Codierung in funktionierende Links.
    • Siehe dies für meine Arbeitsreferenz.
  5. Versucht, die Datei bis zu fünf Mal mit einem kleinen Backoff herunterzuladen.
    • Standardmäßig lautet die Datei, /tmp/vid.${mime-type}aber wenn ytplaysie mit einem zweiten Argument aufgerufen wird, interpretiert sie dies als den Dateinamen des gezielten Downloads - während die Erweiterung weiterhin nach MIME-Typ angehängt wird.
  6. Wenn der Download Ziel in einer Größe größer als Null ist folgenden jeder seiner Versuche ist erlaubt es der Download im Hintergrund und druckt weiterhin terminology‚s Platz Medien im Hintergrund jetzt Terminal Escape, sonst nur es gibt auf und läßt Dich mit einer Fehlermeldung all in Kappen.
    • \033}bt[LINK/FILE]\0für Full-Window-Spiel. pnwürde es in einem neuen Fenster öffnen. Es gibt andere Möglichkeiten, um den Spielbereich geometrisch zu begrenzen - beispielsweise nur für einen Teil des Fensters.

Dies hat nur ein wenig mehr als nur minimale Tests durchgemacht , hat aber bisher für jeden Link ohne Fehler funktioniert - und weil ich nicht wirklich daran interessiert war, denjenigen zu sehen, der nicht gespielt hat, habe ich nicht versucht, es herauszufinden Warum.

Während es für alle von ihnen arbeitet, dauert es nicht unbedingt spielt jeder - und das ist , weil zunächst blind ich die beigefügte .mp4Erweiterung der Zieldatei , ohne zu überprüfen , ob es richtig war. Es ist möglich, dass derjenige, den ich vorher nicht untersucht habe, auch nur dieser war. In jedem Fall habe ich es geändert, um damit umzugehen.

Wie ich bereits erwähnte, ist das einzige terminologyspezifische Bit in der allerletzten Funktion - play()- und so können Sie es leicht ändern, um mit der heruntergeladenen / heruntergeladenen Videodatei alles zu tun, was Sie wollen - wie sie mit mplayerCACA-Bibliotheken in einem anderen Terminal zu verwenden oder knallen Sie es in ein vlcFenster oder was auch immer. Aber wenn du dich magst, siehst du es dir in High Definition an terminology.

Oh, und zu guter Letzt ist dies normalerweise sehr schnell - meine Geschwindigkeit hat meine Bandbreite für die bisherige Dauer bei jedem Versuch maximiert, es ist terminologyjedoch nicht erforderlich, dass die gesamte Datei abgespielt wird.

Hier funktioniert es:

Terminologie rockt

mikeserv
quelle
1
Statt /tmp/vid.mp4vielleicht solltest du verwenden mktemp --suffix=.mp4, nein?
Braiam
@Braiam - das ist eine sehr gute Idee, aber dann müsste ich wahrscheinlich Logik hinzufügen, um aufzuräumen. Zumindest überschreibt es sich so immer von selbst. Die Datei wird nie von irgendetwas gelesen, das versucht, sie auszuführen, und daher halte ich sie nicht für einen Vektor - es sei denn terminology, das gstreamerBackend kann versehentlich ausführbaren Code in einer Videodatei ausführen ... Vielleicht. Ich bezweifle es, aber ich kann nicht genug sagen. Wie auch immer, ich bevorzuge es, immer über dieselbe Datei zu schreiben, sofern ich nichts anderes sage, aber wenn ich es besser machen will - wie z. B. die Größenauswahl und so weiter - werde ich das definitiv auch beheben.
mikeserv
@Braiam - überarbeitet - mal schauen. Wahrscheinlich kommt als nächstes ein dediziertes tmp dir / mktemp.
MikeServ
@Ramesh - schau nochmal. Wenn Sie die letzte Version verwendet haben, ist dies besser.
MikeServ
1
@DmitriDB - das Problem ist , dass Sie drucken nicht , diese Fluchten terminologyüberhaupt - jene zu gehen , tmuxist , ptyweil tmuxder Seite derer dazwischen Master besitzt ptys und terminologybesitzt die Master - Seite von tmux's pty. Zu behandeln , die Sie tun können , wie ... PTTY=$(tty) tmux ...dann in der tmuxSitzung wie ... tybg >"$PTTY". Ich antwortete eigentlich nur das gleiche Problem , das Sie haben hier erst gestern. Das obige Skript sollte ytplay ... >"$PTTY"auf diese Weise wie in einem Multiplexer funktionieren .
mikeserv
6

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")

Zu diesem Zweck können Sie eine einfache Funktion erstellen:

playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}
jimmij
quelle
Das bekomme ich auf meiner Maschine: paste.ubuntu.com/8527219
Ionică Bizău
1
@ IonicăBizău versuchen:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Martin von Wittich
@MartinvonWittich Es funktioniert, aber es ist kein ASCII-Video im Terminal, sondern in einem anderen Fenster ...: - /
Ionică Bizău
2
Jemand muss dies in ein Programm packen, mit dem im Terminal nach YouTube-Videos gesucht und diese für den Batch-Download markiert werden können. und wickle es dann noch einmal ein, um die mp3 zu entfernen und die mp4 zu löschen. Ich könnte es irgendwann tun, wenn es niemand anderes tut, aber es wird nicht in den nächsten Tagen sein.
Millie Smith
@IonicăBizău mplayerwählt automatisch den besten Ausgabetreiber aus. Wenn Xorg ausgeführt wird, wird wahrscheinlich der xvTreiber ausgewählt. Versuchen Sie, die folgende Option hinzugefügt , um mplayerdie Konsole ASCII - Art - Treiber auszuwählen: -vo caca.
Martin von Wittich