Regarder des vidéos YouTube dans un terminal

107

Je cherche un moyen de regarder des vidéos YouTube dans un terminal (pas dans un navigateur ni dans une autre fenêtre, mais juste là, lors d'une session bash).

Y a-t-il un moyen simple de faire cela?

J'imagine quelque chose comme ça:

$ youtube <video-url>     

Je sais déjà comment lire une vidéo en utilisant mplayer:

$ mplayer -vo caca local-file.avi

Cependant, cela ouvre une nouvelle fenêtre. Ce serait cool de le jouer en terminal.

En outre, il devrait être compatible avec les tmuxsessions.


J'ai posé une autre question pour savoir comment empêcher l'ouverture d'une nouvelle fenêtre .


Pour ceux qui se demandent où j'ai besoin d'une telle fonctionnalité, j'ai démarré un projet expérimental nommé TmuxOS - avec le concept selon lequel tout devrait s'exécuter dans une tmuxsession .

Donc, en effet, j'ai besoin d'un lecteur vidéo pour les vidéos locales et à distance. :-)

Ionică Bizău
la source
2
Voulez-vous dire comme ça? google.com/…
chaos
1
@chaos Exactement. :-) Je cherche ça depuis des mois, mais rien n'a encore été trouvé. Décidé de demander ici ...
Ionică Bizău
VLC peut lire des vidéos sur Youtube, mais il n’est pas certain qu’il dispose de capacités de sortie de terminal.
Avec MPV, vous pouvez le faire mpv <youtube url>. Cela fonctionne également pour un tas d'autres sites vidéo. Mais cela ouvre une nouvelle fenêtre.
Gerardo Marset
1
C'est une question fascinante, et j'ai beaucoup appris des réponses. Mais par curiosité, pourquoi avez-vous besoin de faire cela? ;-)
Digital Trauma

Réponses:

132

Vous pouvez télécharger des vidéos et / ou simplement l'audio, puis les regarder / les écouter avec youtube-dl. Le script est écrit en Python et utilise ffmpegje crois.

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

Pour télécharger des vidéos, vous devez simplement lui donner l'URL de la page sur laquelle vous souhaitez afficher la vidéo et le script se charge du reste:

$ 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

Vous pouvez ensuite utiliser vlcou mplayerregarder ces sites localement:

$ 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 mais je veux regarder ces vidéos en streaming et en ASCII

J'ai trouvé cet article de blog intitulé: sur ascii, youtube et lâcher prise qui illustre la méthode dont j'ai parlé dans le chatroom, utilisant principalement youtube-dlle "backend" permettant de télécharger le flux YouTube, puis de le rediriger vers une autre application.

Cet article montre que cela se fait avec mplayer:

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

La vidéo en cours de téléchargement par youtube-dlest redirigé via STDOUT ci - dessus, -o -. Il y a une démonstration de l'effet ici .

          SS n ° 1

Avec l'installation de bibliothèques supplémentaires, la vidéo ASCII peut encore être améliorée.

               SS n ° 2

OK mais je veux la vidéo dans mon terminal actuel?

J'ai trouvé cette astuce qui permet de jouer une vidéo dans un article xtermdu O'Reilly intitulé: Watch Videos in ASCII Art .

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

Ce qui précède xtermouvre une fenêtre dans laquelle la vidéo est lue.

   SS n ° 3

Alors j'ai pensé, pourquoi ne pas associer le beurre de cacahuète et le chocolat comme suit:

$ xterm -fn 5x7 -geometry 250x80 -e \
    "youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa:driver=curses -"

Cela fonctionne presque! Je ne suis pas sûr de savoir pourquoi la vidéo ne peut pas être lue dans la fenêtre, mais il semblerait qu'elle devrait pouvoir le faire. La fenêtre se lève et commence à jouer, puis se ferme. Je vois la vidéo pendant quelques secondes, puis rien.

Peut-être que ce qui précède vous rapprochera de votre solution ultime, ou peut-être qu’il faut simplement modifier un peu les options.

Bibliothèques supplémentaires

Si vous avez libcacainstallé (la version colorisée de aalib) et que vous réduisez la taille de la police gnome-terminalà quelque chose de vraiment petit, comme par exemple 3, la commande suivante affichera une vidéo ASCII bien plus esthétique directement dans le terminal:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   SS # 4

Terminaux

Il semblerait que le choix du terminal puisse avoir un impact important sur la mplayerpossibilité de jouer directement à l'intérieur du terminal ou d'ouvrir une fenêtre séparée. La mise en cache a également mplayerfait toute la différence pour pouvoir jouer directement dans les terminaux.

En utilisant cette commande, je pouvais jouer terminator, au moins pour le premier quart de la vidéo avant de la couper:

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

La version colorée utilisait cette commande:

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

Ces mêmes commandes pourraient jouer dans gnome-terminalet xtermaussi.

    ss montage

    NOTE: C'est (de gauche à droite) xterm, terminator, gnome-terminalet terminology.

slm
la source
2
Vous pouvez y jouer terminology- et pas seulement avec les libs caca. Vous pouvez utiliser des échappements de terminal pour spécifier une partie mappée de la fenêtre terninale et la lire directement en haute définition. Vous pouvez même définir la vidéo sur votre arrière-plan et travailler dessus. terminologycomprend également les URI - obtenez un lien WebM vers votre vidéo youtube et affichez- printfle à l'écran comme une invite de terminal.
mikeserv
@mikeserv - c'est cool, je n'ai jamais entendu parler de cet émulateur de terminal. Je l'ai essayé et c'est cool que vous puissiez lire des vidéos en arrière-plan, tybg my.avin'est-ce pas?
slm
Oui, je préfère la printfméthode. Allez tybg somefile | sed -n lvoir comment cela fonctionne - il utilise simplement des échappées de terminal étendues. Ils sont documentés dans la manpage. Vous pouvez faire la même chose avec ty{ls,cat}. Mais ces petites applications ne sont que de vieilles pages de démonstration et ne sont peut-être pas aussi performantes. Quoi qu'il en soit, si votre version a été construite au cours des deux derniers mois, vous aimerez peut-être autant le mini-affichage que moi - faites ctrl + shift + h. Toute l'illumination est à peu près aussi bonne - c'est pourquoi j'ai suggéré de l'essayer récemment. C'est aussi fou rapide.
mikeserv
3
Quelles sont lesdites bibliothèques additionnelles ASCII?
PythonNut
1
@slm tant pis, je suppose que seules les versions de deb-multimedia l’ont activé. Je me demande pourquoi les autres ne le font pas. Ils considèrent probablement que libcaca est une blague et une honte.
derobert
14

Donc, avec Terminology (probablement la meilleure chose qui soit jamais arrivée à un émulateur de terminal, en passant) au moment de l'écriture de cet ouvrage, les travaux suivants:

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
)

Le terminologybit spécifique est le thenbloc dans play()la printf \033}...ligne. terminologyaccepte les échappées de terminal étendues pour l'impression de supports sur l'écran - un peu comme les couleurs rapides, mais aussi la vidéo haute définition et tout ce que vous voulez.

Le reste est un peu de curl | sedscript qui:

  1. Accepte un lien youtube normal comme premier argument ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' etc...
  2. Extrait le code HTML et trouve le code javascript approprié pour les flux de téléchargement alternatifs ...
    • faire curl "$yturl" | grep url_encoded_fmt_stream_mappour voir le bloc entier.
  3. À partir de ce bloc, il sélectionne le premier flux alternatif proposé.
    • beaucoup sont offerts - si vous avez fait ce qui grepprécède, vous trouverez la liste dans le champ "délimité par des devis ...stream_map: ".
    • alors qu'au début, je pensais que je n'obtiendrais que des mp4, de plus en plus, j'ai aussi des webms. Donc, je l'ai édité pour le flux et d'attribuer l'extension de fichier par type mime.
    • Jusqu'à présent - que ce soit WebM ou MP4 - le premier flux alternatif est la plus haute qualité offerte par vidéo - généralement 720p. Mp4 - ce que je recherche de toute façon et il n'y a donc pas de logique ici pour sélectionner les autres. Ma dernière édition a ajouté quelques tests de modularité / explicites pour rendre cela possible, cependant. Voir ceci pour le script Perl que j'ai référencé lors de l'écriture initiale de la fonction.
  4. Analyse le %[[:hexdigit:]]\{2\}codage en liens de travail.
    • Voir ceci pour ma référence de travail.
  5. Essaie de télécharger le fichier jusqu'à 5 fois avec un léger recul.
    • Par défaut, le fichier est, /tmp/vid.${mime-type}mais si ytplayest appelé avec un deuxième argument, il sera interprété comme le nom de fichier à télécharger ciblé - tout en ajoutant l'extension en fonction du type mime.
  6. Si la cible de téléchargement est à une taille supérieure à zéro après l' une de ses essais , il permet le téléchargement de continuer en arrière - plan et imprime terminologyl » endroit des médias en arrière - plan maintenant d'échappement terminal, sinon il donne juste et vous laisse avec un message d'erreur tout en majuscules.
    • \033}bt[LINK/FILE]\0pour jouer en pleine fenêtre. pnapparaîtrait dans une nouvelle fenêtre. Il en existe d’autres pour limiter géométriquement l’aire de jeu, par exemple pour une partie seulement de la fenêtre.

Cela n’a subi qu’un peu plus que des tests très minimes , mais a jusqu’à présent fonctionné sans faute pour tous les liens - et comme je n’étais pas intéressé par regarder celui qui n’a pas joué, je n’ai pas essayé de le savoir. Pourquoi.

Alors qu'il a travaillé pour tous, il n'a pas nécessairement jouer chacun - et cela est parce que d'abord je aveuglément apposé l' .mp4extension du fichier cible sans vérifier si elle était correcte. Il est possible que celui que je n'ai pas examiné auparavant ne soit que cela aussi. En tout cas, je l'ai changé pour gérer ça.

Comme je l'ai déjà mentionné, le seul élément terminologyspécifique est dans la toute dernière fonction - play()et vous pouvez donc le modifier pour qu'il veuille faire tout ce que vous voulez avec le fichier vidéo à télécharger / téléchargé - comme l'utiliser avec mplayerles bibliothèques CACA dans un autre terminal, ou bien le sortir dans une vlcfenêtre ou autre chose. Mais si vous vous aimez, vous le regarderez en haute définition terminology.

Oh, et enfin, c'est généralement très rapide - à chaque tentative, ma vitesse de bande passante a été maximale pour ma bande passante, mais je n'ai terminologypas besoin de tout le fichier pour commencer à le lire.

Ici ça marche:

la terminologie des roches

Mikeserv
la source
1
Au lieu de /tmp/vid.mp4peut - être que vous devriez utiliser mktemp --suffix=.mp4, non?
Braiam
@Braiam - c'est une très bonne idée, mais je devrais alors probablement ajouter une logique pour nettoyer. De cette façon, au moins, il s’écrase toujours. Le fichier n'est jamais lu par quiconque tente de l'exécuter et je ne le considère donc pas comme un vecteur - à moins que terminologyle gstreamermoteur ne puisse exécuter accidentellement du code exécutable dans un fichier vidéo ... Peut-être. J'en doute, mais je n'en ai pas assez pour en être sûr. Quoi qu'il en soit, je préfère toujours écrire par-dessus le même fichier, sauf si je dis le contraire, mais si je peux améliorer le contenu - comme le choix de la taille et autres - je vais certainement régler ce problème également.
mikeserv
@Braiam - le retravaillé - regardez. Probablement un répertoire tmp dédié / mktemp est le suivant.
mikeserv
@Ramesh - regardez encore. Si vous avez utilisé la dernière version, c'est mieux.
mikeserv
1
@DmitriDB - la question est que vous n'êtes pas l' impression de ces évasions à terminologytout - ceux qui vont tmux« s ptyparce que tmuxpropriétaire du côté maître de ceux qui interviennent ptys et est terminologypropriétaire du côté maître de tmux» s pty. Pour gérer que vous pouvez faire comme ... PTTY=$(tty) tmux ...puis à la tmuxséance comme ... tybg >"$PTTY". En fait , je viens de répondre le même problème que vous rencontrez ici hier. Le script ci-dessus devrait juste fonctionner comme ytplay ... >"$PTTY"dans un multiplexeur de cette manière.
mikeserv
6

Il existe un tutoriel pour cela sur youtube:

https://www.youtube.com/watch?v=QCuq0_nY3Xk

Selon cette vidéo, les éléments suivants devraient fonctionner:

mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "https://www.youtube.com/watch?v=QCuq0_nY3Xk")

Vous pouvez créer une fonction simple à cet effet:

playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}
Jimmij
la source
C’est ce que j’ai sur ma machine: paste.ubuntu.com/8527219
Ionică Bizău
1
@ IonicăBizău essayer:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Martin von Wittich
@MartinvonWittich Cela fonctionne, mais ce n'est pas une vidéo ASCII, en terminal mais dans une autre fenêtre ...: - /
Ionică Bizău
2
Quelqu'un doit insérer cela dans un programme qui permet de rechercher des vidéos youtube dans le terminal et de les marquer pour le téléchargement par lots. et ensuite envelopper une fois de plus pour dépouiller le mp3 et supprimer le MP4. Je pourrais le faire à un moment donné si personne d'autre ne le fait, mais ce ne sera pas dans les prochains jours.
Millie Smith
@ IonicăBizău mplayerchoisit automatiquement le meilleur pilote de sortie, et si vous utilisez Xorg, il choisira probablement le xvpilote. Essayez d' ajouter l'option suivante à mplayerchoisir le pilote ASCII art de la console: -vo caca.
Martin von Wittich