Tonton video YouTube di terminal

107

Saya mencari cara untuk menonton video YouTube di terminal (bukan di browser atau jendela lain, tapi di sana, dalam sesi bash apa pun).

Apakah ada cara sederhana untuk melakukan hal ini?

Saya membayangkan sesuatu seperti ini:

$ youtube <video-url>     

Saya sudah tahu cara memutar video menggunakan mplayer:

$ mplayer -vo caca local-file.avi

Namun, ini membuka jendela baru. Akan lebih asyik memainkannya di terminal.

Juga, itu harus kompatibel dengan tmuxsesi.


Saya bertanya pertanyaan lain bagaimana mencegah membuka jendela baru .


Bagi mereka yang bertanya-tanya di mana saya membutuhkan fungsi seperti itu, saya memulai proyek eksperimental bernama TmuxOS - dengan konsep bahwa semuanya harus berjalan di dalam tmuxsesi .

Jadi, memang saya membutuhkan pemutar video untuk video lokal dan jarak jauh. :-)

Ionică Bizău
sumber
2
Maksud Anda seperti ini? google.com/…
chaos
1
@chaos Persis. :-) Saya mencari ini selama berbulan-bulan, tetapi belum ada yang ditemukan. Memutuskan untuk bertanya di sini ...
Ionică Bizău
VLC dapat memutar video Youtube, tidak yakin apakah ia memiliki kemampuan keluaran terminal.
Dengan mpv bisa Anda lakukan mpv <youtube url>. Ini juga berfungsi untuk banyak situs video lainnya. Tapi ini membuka jendela baru.
Gerardo Marset
1
Ini adalah pertanyaan yang menarik, dan saya telah belajar banyak dari jawabannya. Tetapi karena penasaran - mengapa Anda perlu melakukan ini? ;-)
Digital Trauma

Jawaban:

132

Anda dapat mengunduh video dan / atau hanya audio lalu menonton / mendengarkannya menggunakan youtube-dl. Script ditulis dalam Python dan memanfaatkan ffmpegsaya percaya.

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

Untuk mengunduh video, Anda cukup memberikan URL dari halaman yang Anda inginkan video dan skrip melakukan sisanya:

$ 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

Anda kemudian dapat menggunakan vlcatau mplayermenonton ini secara lokal:

$ 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 tapi saya ingin menonton video ini saat mereka streaming & di ASCII

Saya menemukan artikel blog ini berjudul: Pada ascii, youtube dan melepaskan yang menunjukkan metode yang saya diskusikan di ruang obrolan, terutama menggunakan youtube-dlsebagai "backend" yang dapat melakukan pengunduhan aliran YouTube dan kemudian mengarahkannya ke beberapa aplikasi lain.

Artikel ini menunjukkan sedang dilakukan dengan mplayer:

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

Video yang diunduh oleh youtube-dldialihkan melalui STDOUT di atas -o -,. Ada demo efeknya di sini .

          ss # 1

Dengan pemasangan perpustakaan tambahan, video ASCII dapat ditingkatkan lebih lanjut.

               ss # 2

OK tapi saya ingin video di terminal saya yang sebenarnya?

Saya menemukan trik ini yang memungkinkan video untuk diputar di xtermdalam O'Reilly diartikulasikan berjudul: Tonton Video dalam ASCII Art .

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

Hasil di atas dalam xtermjendela yang dibuka di mana video diputar.

   ss # 3

Jadi saya pikir, mengapa tidak menyatukan selai kacang dan cokelat seperti ini:

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

Ini hampir berhasil! Saya tidak yakin mengapa video tidak dapat diputar di jendela, tetapi sepertinya harus bisa. Jendela muncul dan mulai bermain tetapi kemudian ditutup. Saya melihat video selama beberapa detik dan kemudian tidak ada.

Mungkin hal di atas akan membuat Anda lebih dekat dengan solusi utama Anda, atau mungkin hanya perlu sedikit penyesuaian pada opsi.

Perpustakaan tambahan

Jika Anda telah libcacamenginstal (versi berwarna aalib) dan Anda mengurangi ukuran font gnome-terminalmenjadi sesuatu yang sangat kecil, seperti say 3, perintah berikut akan menampilkan video ASCII yang jauh lebih baik secara langsung di dalam terminal:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   ss # 4

Terminal

Tampaknya pilihan terminal dapat membuat masalah besar apakah mplayerdapat bermain langsung di dalam terminal atau apakah itu membuka jendela terpisah. Caching juga mplayermembuat perbedaan dramatis karena bisa bermain langsung di terminal tersebut.

Dengan menggunakan perintah ini saya bisa bermain terminator, setidaknya untuk 1/4 video pertama sebelum terpotong:

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

Versi berwarna menggunakan perintah ini:

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

Perintah yang sama ini juga bisa dimainkan di gnome-terminal& xterm.

    ss montage

    CATATAN: Itu (dari Kiri ke Kanan) xterm, terminator, gnome-terminal, dan terminology.

slm
sumber
2
Anda dapat memainkannya terminology- dan bukan hanya dengan caca libs. Anda dapat menggunakan pelarian terminal untuk menentukan bagian yang dipetakan dari jendela terninal dan memutarnya di sana dengan def tinggi. Anda bahkan dapat mengatur video ke latar belakang Anda dan mengerjakannya. terminologymemahami URI juga - dapatkan tautan webm ke video youtube Anda dan hanya printfke layar seperti terminal prompt.
mikeserv
@ mikeserv - itu keren, tidak pernah mendengar emulator terminal itu. Saya mencobanya dan itu keren bahwa Anda dapat memutar video di latar belakang, tybg my.avibukan.
slm
Ya - Saya lebih suka printfmetodenya. Lakukan tybg somefile | sed -n luntuk melihat cara kerjanya - itu hanya menggunakan lolos terminal diperpanjang. Mereka didokumentasikan di manhalaman. Anda dapat melakukan hal yang sama dengannya ty{ls,cat}. Tetapi aplikasi-aplikasi kecil itu hanyalah pembungkus demo lama dari yang asli dan mungkin tidak mampu. Lagi pula, jika versi Anda telah dibangun dalam beberapa bulan terakhir Anda mungkin ingin miniview sebanyak yang saya lakukan - lakukan ctrl + shift + h. Semua pencerahan hampir sama baiknya - itu sebabnya saya menyarankan Anda mencobanya baru-baru ini. Ini juga cepat gila.
mikeserv
3
Apa saja lib ASCII tambahan yang dikatakan?
PythonNut
1
@lm terlalu buruk, saya kira hanya membangun deb-multimedia telah diaktifkan. Bertanya-tanya mengapa yang lain tidak, kira mereka mungkin menganggap libcaca sebuah lelucon dan kembung.
derobert
14

Jadi, dengan Terminology (mungkin hal terbaik yang pernah terjadi pada emulator terminal, by the way) pada saat penulisan ini , karya-karya berikut:

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
)

The terminologybit tertentu adalah thenblok play()- yang printf \033}...line. terminologymenerima terminal tambahan lolos untuk mencetak media ke layar - agak seperti warna cepat tetapi juga video hi-def dan pada dasarnya apa pun yang Anda inginkan.

Sisanya adalah sedikit curl | sednaskah yang:

  1. Menerima tautan youtube reguler sebagai argumen pertama ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' dan seterusnya...
  2. Tarik HTML dan temukan kode javascript yang relevan untuk aliran unduhan alternatif ...
    • lakukan curl "$yturl" | grep url_encoded_fmt_stream_mapuntuk melihat seluruh blok.
  3. Dari dalam blok itu ia memilih aliran alternatif yang ditawarkan pertama.
    • banyak yang ditawarkan - jika Anda melakukan hal di grepatas, Anda akan menemukan daftar di bidang batas "-kutipan ...stream_map: ".
    • sementara pada awalnya saya pikir saya hanya akan mendapatkan mp4s semakin banyak saya mendapatkan webms juga. Jadi saya sudah mengeditnya untuk aliran dan untuk menetapkan ekstensi file berdasarkan tipe mime.
    • sejauh ini - apakah webm atau mp4 - aliran alternatif pertama adalah kualitas tertinggi yang ditawarkan per video - biasanya 720p .mp4 - yang memang saya cari dan tidak ada logika di sini untuk memilih yang lain. Suntingan terakhir saya menambahkan beberapa tes modularitas / eksplisit untuk memungkinkan hal ini. Lihat ini untuk skrip perl yang saya referensikan ketika awalnya menulis fungsi.
  4. Parsing %[[:hexdigit:]]\{2\}pengodean ke dalam tautan yang berfungsi.
    • Lihat ini untuk referensi kerja saya.
  5. Mencoba mengunduh file hingga 5 kali dengan sedikit backoff.
    • Secara default file tersebut adalah /tmp/vid.${mime-type}tetapi jika ytplaydipanggil dengan argumen kedua itu akan menafsirkannya sebagai nama file unduhan yang ditargetkan - sementara masih menambahkan ekstensi sesuai dengan tipe mime.
  6. Jika target download pada ukuran lebih besar dari nol mengikuti salah mencoba itu memungkinkan download untuk melanjutkan di latar belakang dan mencetak terminology's tempat media dalam latar belakang sekarang terminal melarikan diri, yang lain itu hanya menyerah dan meninggalkan Anda dengan pesan kesalahan semua dalam topi.
    • \033}bt[LINK/FILE]\0untuk bermain jendela penuh. pnakan muncul ke jendela baru. Ada yang lain untuk membatasi area bermain secara geometris - misalnya hanya untuk sebagian jendela, misalnya.

Ini hanya mengalami sedikit lebih dari pengujian yang sangat minimal , tetapi sejauh ini berhasil untuk setiap tautan tanpa gagal kecuali satu - dan karena saya tidak benar-benar tertarik menonton yang tidak bermain saya tidak mencoba mencari tahu Mengapa.

Walaupun ini bekerja untuk mereka semua, itu tidak serta-merta memainkan masing-masing - dan ini karena pada awalnya saya secara membuta menambahkan .mp4ekstensi ke file target tanpa memeriksa apakah itu benar. Mungkin saja yang saya tidak lihat sebelumnya hanya ini juga. Bagaimanapun, saya mengubahnya untuk mengatasinya.

Seperti yang saya sebutkan sebelumnya, satu-satunya terminologybit spesifik ada di fungsi yang paling terakhir - play()- dan jadi Anda dapat dengan mudah mengubahnya untuk melakukan apa pun yang Anda inginkan dengan file video unduhan / unduh - seperti menggunakannya dengan mplayerlib CACA di terminal lain, atau pop keluar ke vlcjendela atau apa pun. Tetapi jika Anda menyukai diri sendiri, Anda akan menontonnya di hi-def terminology.

Oh, dan terakhir, ini biasanya sangat cepat - kecepatan saya telah memaksimalkan bandwidth saya untuk durasi sejauh ini pada setiap upaya, tetapi terminologytidak perlu seluruh file untuk mulai memutarnya.

Ini dia bekerja:

batu terminologi

mikeserv
sumber
1
Alih-alih /tmp/vid.mp4mungkin Anda harus menggunakan mktemp --suffix=.mp4, bukan?
Braiam
@Braiam - itu ide yang sangat bagus, tapi kemudian saya mungkin harus menambahkan logika untuk membersihkan. Dengan cara ini setidaknya itu selalu menimpa dirinya sendiri. File tersebut tidak pernah dibaca oleh apa pun yang mencoba untuk melaksanakannya dan jadi saya tidak menganggap itu vektor - kecuali terminology's gstreamerbackend sengaja dapat menjalankan kode dieksekusi dalam file video ... Mungkin. Saya meragukannya, tetapi saya tidak cukup mengatakannya dengan pasti. Lagi pula, saya lebih suka selalu menulis di atas file yang sama kecuali saya katakan sebaliknya, tetapi jika saya berusaha membuatnya lebih baik - seperti memilih ukuran dan semacamnya - saya pasti akan memperbaikinya juga.
mikeserv
@Braiam - mengolahnya kembali - lihatlah. Mungkin tmp dir / mktemp khusus adalah yang berikutnya.
mikeserv
@ Ramesh - lihat lagi. Jika Anda menggunakan versi terakhir, ini lebih baik.
mikeserv
1
@DmitriDB - masalah ini adalah bahwa Anda tidak mencetak mereka lolos ke terminologysama sekali - mereka akan tmux's ptykarena tmuxmemiliki sisi master mereka intervensi ptydan terminologymemiliki sisi master tmux' s pty. Untuk mengatasinya Anda bisa melakukan seperti ... PTTY=$(tty) tmux ...maka di tmuxsesi seperti ... tybg >"$PTTY". Sebenarnya saya baru saja menjawab masalah yang sama yang Anda alami di sini kemarin. Script di atas seharusnya hanya berfungsi seperti ytplay ... >"$PTTY"dalam multiplexer dengan cara itu.
mikeserv
6

Ada tutorial untuk ini di youtube:

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

Menurut video itu yang berikut ini harus berfungsi:

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

Anda dapat membuat fungsi sederhana untuk tujuan ini:

playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}
jimmij
sumber
Inilah yang saya dapatkan di mesin saya: paste.ubuntu.com/8527219
Ionică Bizău
1
@ IonicăBizău coba:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Martin von Wittich
@MartinvonWittich Ini berfungsi, tapi ini bukan video ASCII, di terminal tetapi di jendela lain ...: - /
Ionică Bizău
2
Seseorang harus membungkus ini dalam program yang memungkinkan mencari video youtube di terminal dan menandainya untuk unduhan batch. dan kemudian bungkus sekali lagi untuk menghapus mp3 dan menghapus mp4. Saya mungkin melakukannya pada titik tertentu jika tidak ada orang lain yang melakukannya, tetapi itu tidak akan terjadi dalam beberapa hari ke depan.
Millie Smith
@ IonicăBizău mplayersecara otomatis memilih driver output terbaik, dan jika Anda menjalankan Xorg, itu mungkin akan memilih xvdriver. Coba tambahkan opsi berikut untuk mplayermemilih driver art konsol ASCII: -vo caca.
Martin von Wittich