it-swarm.com.de

Sehen Sie sich YouTube-Videos im Terminal an

Ich suche nach einer Möglichkeit, YouTube-Videos im Terminal anzusehen (nicht in einem Browser oder einem anderen Fenster, sondern genau dort, in einer 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 mit mplayer abspielt:

$ 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 tmux Sitzungen kompatibel sein.


Ich habe eine andere Frage gestellt für wie man das Öffnen eines neuen Fensters verhindert .


Für diejenigen, die sich fragen, wo ich eine solche Funktionalität benötige, habe ich ein experimentelles Projekt namens TmuxOS - mit dem Konzept gestartet, dass Alles sollte innerhalb einer tmux Sitzung laufen .

In der Tat brauche ich einen Video-Player für lokale und Remote-Videos. :-)

109
Ionică Bizău

Sie können Videos und/oder nur Audio herunterladen und sie dann mit youtube-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 von 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 dann vlc oder mplayer verwenden, um diese lokal anzusehen:

$ 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 sehen, während sie gestreamt und in ASCII sind

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 mit youtube-dl als "Backend", das den YouTube-Stream herunterladen und dann zu einer anderen App umleiten könnte.

Dieser Artikel zeigt, wie es mit mplayer gemacht wird:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa -monitorpixelaspect 0.5 - 

Das Video wird heruntergeladen von youtube-dl wird über STDOUT oben umgeleitet, -o -. Es gibt ein Demo des Effekts hier .

ss#1

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

ss#2

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

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

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

ss#3

Also dachte ich mir, warum nicht die Erdnussbutter und die Schokolade so zusammenfügen:

$ 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 mir nicht sicher, warum das Video nicht im Fenster abgespielt werden kann, aber es scheint, als ob es in der Lage sein sollte. Das Fenster öffnet sich und beginnt zu spielen, schließt sich dann aber. Ich sehe Video für ein paar Sekunden und dann nichts.

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

Zusätzliche Bibliotheken

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

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

ss#4

Terminals

Es scheint, dass die Wahl des Terminals eine große Rolle spielen kann, ob mplayer direkt im Terminal abgespielt werden kann oder ob ein separates Fenster geöffnet wird. Auch das Caching auf mplayer machte einen dramatischen Unterschied darin, direkt in einem Terminal spielen zu können.

Mit diesem Befehl konnte ich in terminator abspielen, zumindest für das erste Viertel des Videos, bevor es herausgeschnitten wurde:

$ 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 in gnome-terminal & xterm auch.

ss montage

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

133
slm

Also, mit Terminologie (wahrscheinlich das Beste, was jemals einem Terminalemulator passiert ist)Zur 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 "[email protected]" || 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 Zeile printf \033}.... terminology akzeptiert erweiterte Terminal-Escape-Zeichen zum Drucken von Medien auf den Bildschirm - ähnlich wie Prompt-Farben, aber auch HD-Videos und im Grunde alles, was Sie sonst noch wollen.

Der Rest ist ein kleines Skript von curl | sed, Das:

  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 ...
    • mache curl "$yturl" | grep url_encoded_fmt_stream_map, um den ganzen Block zu sehen.
  3. Innerhalb dieses Blocks wird der erste angebotene alternative Stream ausgewählt.
    • viele werden angeboten - wenn Sie grep oben ausgeführt haben, finden Sie die Liste im Feld " mit Anführungszeichen ...stream_map: ".
    • während ich zuerst dachte, ich würde immer mehr mp4s bekommen, bekomme ich auch webms. Also habe ich es für den Flow bearbeitet und die Dateierweiterung nach MIME-Typ zugewiesen.
    • bisher - ob webm oder mp4 - der erste alternative Stream ist die höchste Qualität, die pro Video angeboten wird - normalerweise 720p .mp4 - was ich suche für sowieso und so gibt es hier keine Logik für die Auswahl anderer. Meine letzte Bearbeitung hat jedoch einige Modularitäts-/explizite Tests hinzugefügt, um dies zu ermöglichen. Siehe this 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 this für meine Arbeitsreferenz.
  5. Versucht, die Datei bis zu 5 Mal mit einem kleinen Backoff herunterzuladen.
    • Standardmäßig lautet die Datei /tmp/vid.${mime-type}. Wenn jedoch ytplay mit einem zweiten Argument aufgerufen wird, wird dies als gezielter Download-Dateiname interpretiert, wobei die Erweiterung weiterhin nach MIME-Typ angehängt wird.
  6. Wenn das Download-Ziel nach einem seiner Versuche eine Größe größer als Null hat, kann der Download im Hintergrund fortgesetzt werden und druckt terminology 's Medien jetzt im Hintergrund platzieren Terminal-Escape, sonst gibt es einfach auf und hinterlässt eine Fehlermeldung in Großbuchstaben.
    • \033}bt[LINK/FILE]\0 Für die Wiedergabe unter Vollfenstern. pn würde es in einem neuen Fenster öffnen. Es gibt andere, um den Spielbereich geometrisch zu begrenzen - beispielsweise nur für einen Teil des Fensters.

Dies wurde nur ein wenig mehr als sehr minimal getestet, hat aber bisher für jeden Link ohne Fehler funktioniert - und weil ich eigentlich nicht daran interessiert war, den zu sehen, der dies nicht tat Ich habe nicht versucht herauszufinden warum.

Während es für alle funktionierte, musste es nicht unbedingt spielen - und das liegt daran, dass ich zuerst blind die Erweiterung .mp4 An die Zieldatei angehängt habe, ohne zu überprüfen, ob dies der Fall ist war richtig. Es ist möglich, dass derjenige, den ich vorher nicht untersucht habe, auch nur dieser war. Auf jeden Fall habe ich es geändert, um damit umzugehen.

Wie ich bereits erwähnt habe, befindet sich das einzige terminology -spezifische Bit in der allerletzten Funktion - play() - und Sie können dies leicht ändern, um mit der heruntergeladenen/heruntergeladenen Videodatei alles zu tun, was Sie wollen - B. wenn Sie es mit den CACA-Bibliotheken von mplayer in einem anderen Terminal verwenden oder es in ein vlc -Fenster oder was auch immer einfügen. Aber wenn Sie sich mögen, sehen Sie es in HD in terminology.

Oh, und zuletzt ist dies normalerweise sehr schnell - meine Geschwindigkeiten haben meine Bandbreite für die bisherige Dauer bei jedem Versuch maximiert, aber terminology benötigt nicht die gesamte Datei dazu fang trotzdem an zu spielen.

Hier funktioniert es:

terminology rocks

15
mikeserv

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")
}
6
jimmij

Von https://github.com/mps-youtube/mps-youtube

Sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt
1
J0hnG4lt