YouTube-Videos im Terminal ansehen

YouTube-Videos im Terminal ansehen

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 tmuxSitzungen 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 tmuxSitzung 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, ffmpegglaube 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 vlcoder mplayerlokal 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-dlals „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-dlwird über STDOUT umgeleitet -o -. Es gibt eineDemo des Effekts hier.

          ss#1

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

               SS Nr. 2

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

xtermIch 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 xtermFenster geöffnet wird, in dem das Video abgespielt wird.

   SS Nr. 3

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-terminalauf 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

   SS Nr. 4

Klemmen

Es scheint, dass die Wahl des Terminals einen großen Unterschied machen kann, ob man mplayerdirekt im Terminal spielen kann oder ob ein separates Fenster geöffnet wird. Auch das Caching mplayermachte 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.

    SS-Montage

    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 terminologyspezifische Bit ist der thenBlock in play()– der printf \033}...Zeile. terminologyAkzeptiert 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 | sedSkript, das:

  1. Akzeptiert einen normalen YouTube-Link als erstes Argument ...
    • ytplay 'https://www.youtube.com/watch?v=${id}'und so weiter...
  2. 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.
  3. Aus diesem Block wählt es den ersten angebotenen alternativen Stream aus.
    • Es werden viele angeboten. Wenn Sie das grepoben 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.
  4. Analysiert die %[[:hexdigit:]]\{2\}Kodierung in funktionierende Links.
    • SehenDasals meine Arbeitsreferenz.
  5. Versucht mit einer kleinen Verzögerung bis zu fünfmal, die Datei herunterzuladen.
    • Standardmäßig ist dies die Datei, /tmp/vid.${mime-type}aber wenn ytplaysie 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.
  6. 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]\0für die Wiedergabe im Vollbildmodus. pnwü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 .mp4an 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, terminologybefindet 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 mplayerden CACA-Bibliotheken von in einem anderen Terminal verwenden oder sie in ein Fenster öffnen vlcoder 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 terminologyzum Starten der Wiedergabe ist ohnehin nicht die gesamte Datei erforderlich.

Hier funktioniert es:

Terminologie rockt

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

verwandte Informationen