Terminalde YouTube videolarını izleyin


107

YouTube videolarını terminalde izlemenin bir yolunu arıyorum (bir tarayıcıda veya başka bir pencerede değil, tam orada, herhangi bir bash oturumunda).

Bunu yapmanın kolay bir yolu var mı?

Böyle bir şey hayal ediyorum:

$ youtube <video-url>     

Bir videonun nasıl kullanılacağını zaten biliyorum mplayer:

$ mplayer -vo caca local-file.avi

Ancak, bu yeni bir pencere açar. Terminalde oynamak harika olurdu.

Ayrıca, tmuxoturumlarla uyumlu olmalıdır .


Yeni bir pencere açmanın nasıl önleneceği ile ilgili başka bir soru sordum .


Nerede böyle bir işlevselliğe ihtiyaç duyduğumu merak edenler için, TmuxOStmux adlı deneysel bir projeye başladım - her şeyin bir oturumun içinde yürütülmesi gerektiği konsepti ile .

Bu yüzden, gerçekten yerel ve uzak videolar için bir video oynatıcıya ihtiyacım var. :-)


2
Bunun gibi mi demek istedin? google.com/…
kaos

1
@chaos Tam olarak. :-) Aylarca bunu arıyorum, ama henüz bir şey bulunamadı. Burada sormaya karar
verdim

VLC, Youtube videolarını oynatabiliyor, ancak terminal çıkış yetenekleri olup olmadığından emin değil.

Mpv ile yapabilirsiniz mpv <youtube url>. Aynı zamanda başka video sitelerinde de çalışır. Ancak bu yeni bir pencere açar.
Gerardo Marset

1
Bu büyüleyici bir soru ve cevaplardan çok şey öğrendim. Ama meraktan - neden bunu dünyada yapman gerekiyor? ;-)
Dijital Travma

Yanıtlar:


132

Videoları ve / veya sadece sesleri indirebilir ve ardından onları kullanarak izleyebilir / dinleyebilirsiniz youtube-dl. Senaryo Python ile yazılmış ve ffmpeginanıyorum.

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

Videoları indirmek için videonun açılmasını istediğiniz sayfanın URL'sini vermeniz yeterlidir.

$ 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

Daha sonra bunları yerel olarak izlemek için vlcveya kullanabilirsiniz mplayer:

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

Tamam, ancak bu videoları izledikleri gibi ve ASCII’de izlemek istiyorum

Bu blog makalesini şu başlıkta buldum: ascii'de, youtube ve sohbette bıraktığım sohbeti gösteren, özellikle youtube-dlYouTube akışını indiren ve ardından başka bir uygulamaya yönlendirebilecek "arka uç" olarak kullandığım yöntemi gösteren izin .

Bu makale aşağıdakilerle yapıldığını gösteriyor mplayer:

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

İndirilen video youtube-dlyukarıdaki STDOUT aracılığıyla yönlendirilir -o -. Burada etkinin bir demosu var .

          ss 1.

Ek kütüphanelerin kurulmasıyla ASCII videosu daha da geliştirilebilir.

               ss 2.

Tamam ama videoyu gerçek terminalimde istiyorum?

Videonun xtermO'Reilly başlıklı makalesinde oynatılmasını sağlayan bu numarayı buldum : ASCII Art'da Videoları İzleyin .

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

Yukarıdakiler xterm, videonun oynatıldığı bir pencerenin açılmasına neden olur.

   ss 3.

Ben de fıstık ezmesini ve çikolatayı neden böyle bir araya koymadığımı düşündüm:

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

Bu neredeyse işe yarıyor! Videonun neden pencerede oynatamadığından emin değilim, ancak olması gerektiği gibi görünüyor. Pencere açılır ve oynamaya başlar ancak kapanır. Videoyu kısa bir süre birkaç saniye izliyorum, sonra hiçbir şey.

Belki de yukarıdakiler sizi nihai çözümünüze daha da yaklaştıracaktır, ya da belki de sadece seçenekler üzerinde biraz değişiklik yapmanız gerekiyor.

Ek kütüphaneler

Eğer libcacayüklediyseniz (renklendirilmiş versiyonu aalib) ve yazı tipi boyutunu sizin gnome-terminaliçin çok küçük bir şeye düşürürseniz, 3 dediğin gibi, aşağıdaki komut doğrudan terminal içinde çok daha iyi görünümlü bir ASCII videosu gösterecektir:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   ss 4.

Terminaller

Terminal seçiminin, mplayerdoğrudan terminalin içinde oynayıp oynamayacağı veya ayrı bir pencere açıp açamayacağı gibi önemli bir şey yapabileceği görülüyor . Önbelleğe almak da mplayerdoğrudan terminallerde oynayabilme konusunda çarpıcı bir fark yarattı.

Bu komutu kullanarak terminator, en azından kesilmeden önce videonun ilk 1 / 4'ü için oynatabildim:

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

Renkli sürüm bu komutu kullandı:

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

Aynı komutlar oynayabileceği gnome-terminal& xtermde.

    ss montaj

    NOT: Bu (Soldan Sağa) var xterm, terminator, gnome-terminalve terminology.


2
İçinde oynayabilirsin terminology- ve sadece caca kütüphanelerinde değil. Üçlü pencerenin eşlenmiş bir kısmını belirtmek için terminal kaçışlarını kullanabilir ve tam yüksek çözünürlükte oynatabilirsiniz. Hatta videoyu arkaplanınıza göre ayarlayabilir ve üzerinde çalışabilirsiniz. terminologyURI'ları da anlıyor - youtube videonuza ve sadece printfekrana bir terminal istemi gibi bir web bağlantısı verin.
mikeserv

@mikeserv - bu harika, bu terminal emülatörünü hiç duymadım. Denedim ve arka planda video izleyebilmeniz harika tybg my.avi.
slm

Evet, printfyöntemi tercih ederim . tybg somefile | sed -n lNasıl çalıştığını görmek için yapın - sadece uzatılmış terminal çıkışları kullanır. manSayfada belgelenmiştir . Aynı şeyi yapabilirsiniz ty{ls,cat}. Ancak bu küçük uygulamalar gerçek şeyin sadece eski demo sarmalayıcıları ve belki de yetenekli değiller. Her neyse, versiyonunuz son birkaç ay içerisinde oluşturulduysa mini bakışı benim de yaptığım gibi isteyebilirsiniz - ctrl + shift + h. Bütün aydınlanma oldukça iyidir - bu yüzden son zamanlarda denemenizi önerdim. Aynı zamanda hızlı deli.
mikeserv

3
Söylenen ek ASCII kütüphaneleri nelerdir?
PythonNut

1
@slm çok kötü, sanırım sadece deb-multimedia yapılarının etkinleştirmiş olması. Neden diğerlerinin olmadığını merak ediyorum, sanırım libcaca'yı şaka ve şişkinlik sanıyorlar.
derobert

14

Bu nedenle, Terminoloji ile (bu arada, bir terminal emülatörünün başına gelmiş en iyi şey) bu yazının yapıldığı sırada aşağıdaki işler:

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
)

terminologyBelirli bir bit thenblok play()- printf \033}...hattı. terminologyMedyayı ekrana yazdırmak için uzatılmış terminal çıkışlarını kabul eder - ister istemez renkler isterse yüksek çözünürlüklü videolar ve temel olarak ne istersen.

Gerisi şu curl | sedkomut dosyası biraz :

  1. Normal bir youtube bağlantısını ilk argümanı olarak kabul eder ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' ve bunun gibi...
  2. HTML'yi çeker ve alternatif indirme akışları için ilgili javascript kodunu bulur ...
    • do curl "$yturl" | grep url_encoded_fmt_stream_maptüm bloğu görmek için.
  3. Bu bloktan ilk sunulan alternatif akışı seçer.
    • birçoğu teklif edilir - grepyukarıdakileri yaptıysanız listeyi "teklif sınırlamalı ...stream_map: "alanında bulabilirsiniz.
    • ilk başta mp4'leri daha fazla alacağımı ve web kamerası alacağımı düşündüm. Bu yüzden akış için düzenledi ve dosya uzantısını mime türüne göre atadım.
    • Şimdiye kadar - webm veya mp4 - ilk alternatif akış, video başına sunulan en yüksek kalitedir - genellikle 720p .mp4 - bu yine de aradığım şeydir ve bu yüzden burada başkalarını seçmek için bir mantık yoktur. Son düzenlemem, bunu mümkün kılmak için bazı modülerlik / açık testler ekledi. Bkz bu başlangıçta fonksiyonunu yazarken ben başvurulan perl komut dosyası için.
  4. %[[:hexdigit:]]\{2\}Kodlamayı çalışma bağlantılarına ayrıştırır .
    • Bkz bu benim çalışma referans için.
  5. Bir miktar geri çekilme ile dosyayı en fazla 5 kez indirmeyi dener.
    • Varsayılan olarak dosya /tmp/vid.${mime-type}ancak ytplayikinci bir argümanla çağrılırsa, hedeflenen indirme dosya adı olarak yorumlanır - yine de uzantıyı mime türüne eklerken.
  6. İndir hedefi kendi denemeden herhangi aşağıdaki sıfırdan büyük bir boyutta ise bu indirme işlemi arka planda devam ve izin verir baskılar terminology'nin yeri medya arka planda şimdi terminali kaçış, aksi takdirde sadece vazgeçer ve bütün bir hata mesajıyla bırakır kapaklar
    • \033}bt[LINK/FILE]\0tam pencerede oynamak için. pnonu yeni bir pencereye açardı. Örneğin oyun alanını geometrik olarak sınırlandırmak için başkaları da var - örneğin pencerenin sadece bir kısmı için.

Bu, sadece çok az bir testten biraz daha fazlasını yaptı , ancak şu ana kadar her bağlantı için başarısız oldu, ancak bir kez çalıştı; neden.

Hepsi için çalışsa da, her birini mutlaka oynamıyordu - ve bunun nedeni, ilk önce .mp4doğru olup olmadığını kontrol etmeden , uzantıyı hedef dosyaya kör bir şekilde eklemiş olmamdır . Daha önce bakmadığımın da bu şekilde olması mümkün. Her durumda, bununla başa çıkmak için değiştirdim.

Daha önce de belirttiğim gibi, sadece terminologybelirli bir bit en son fonksiyonda - play()ve böylece mplayerbaşka bir terminalde CACA kütüphaneleriyle kullanmak gibi - indirme / indirilen video dosyası ile istediğiniz herhangi bir şeyi yapmayı kolayca değiştirebilirsiniz ya da bir vlcpencereye ya da her neyse dışarıya . Ama eğer kendinizi beğenirseniz, yüksek tanımlı olarak izlersiniz terminology.

Oh, ve son olarak, bu genellikle çok hızlı - hızlarım her denemede şimdiye kadarki süre boyunca bant genişliğimi arttırdı, ancak terminologyyine de oynatmaya başlamak için tüm dosyaya ihtiyaç duymuyor.

İşte çalışıyor:

terminoloji kayalar


1
Yerine /tmp/vid.mp4belki kullanmalıyım mktemp --suffix=.mp4, hayır?
Braiam

@Braiam - bu çok iyi bir fikir, ancak daha sonra temizlemek için mantık eklemek zorunda kalacağım. Bu şekilde en azından her zaman kendi üzerine yazar. Sürece - Dosya bunu gerçekleştirmenin ve bu yüzden bir vektör düşünmüyoruz girişimleri şey tarafından okunan asla terminologys' gstreamerarka uç yanlışlıkla Belki ... Bir video dosyasında yürütülebilir kod çalıştırabilir. Bundan şüpheliyim, ancak kesin olarak söyleyecek kadar da değilim. Her neyse, başka türlü söylemediğim sürece her zaman aynı dosyanın üzerine yazmayı tercih ederim, ancak daha iyi hale getirmeyi başarırsam - boyut toplama ve benzeri - kesinlikle bunu düzelteceğim.
mikeserv

@Braiam - elden geçirdi - bir göz atın. Muhtemelen daha sonra özel bir tmp dir / mktemp var.
mikeserv

@Ramesh - tekrar bakın. Son sürümü kullandıysanız, bu daha iyidir.
mikeserv

1
@DmitriDB - konudur size bu kaçar baskı değiliz terminologyhiç - o olacak tmux'ın ptyçünkü tmuxo müdahale ustası tarafını sahibi ptys ve terminologyana tarafını sahibi tmux' s pty. Eğer ... gibi yapabileceği işlemek için PTTY=$(tty) tmux ...daha sonra tmux... gibi oturumun tybg >"$PTTY". Aslında sadece dün burada yaşadığınız aynı soruyu cevapladım . Yukarıdaki betiğin ytplay ... >"$PTTY"bu şekilde çoklayıcıda olduğu gibi çalışması gerekir .
mikeserv

6

Youtube'da bunun için öğretici var:

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

Bu videoya göre aşağıdakiler çalışmalıdır:

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

Bu amaç için basit bir fonksiyon oluşturabilirsiniz:

playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}


1
@ IonicăBizău deneyin:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Martin von Wittich

@MartinvonWittich Çalışıyor, ancak terminalde fakat başka bir pencerede ASCII video değil ...: - /
Ionică Bizău

2
Birisinin bunu terminaldeki youtube videolarını aramaya ve toplu indirme için işaretlemeye izin veren bir programa sarması gerekir. ve sonra mp3'ünü çıkarmak ve mp4'ü silmek için bir kez daha sarın. Başka kimse yapmazsa, bir noktada yapabilirim, ama önümüzdeki birkaç gün içinde olmayacak.
Millie Smith

@ IonicăBizău mplayerotomatik olarak en iyi çıkış sürücüsünü seçer ve Xorg çalışıyorsa, muhtemelen xvsürücüyü seçecektir . İçin aşağıdaki seçeneği eklemeyi deneyin mplayerkonsol ASCII sanat sürücüsünü seçmek için: -vo caca.
Martin von Wittich,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.