Oglądaj filmy z YouTube'a w terminalu

107

Szukam sposobu na oglądanie filmów z YouTube'a w terminalu (nie w przeglądarce lub innym oknie, ale właśnie tam, w dowolnej sesji bash).

Czy istnieje prosty sposób to zrobić?

Wyobrażam sobie coś takiego:

$ youtube <video-url>     

Wiem już, jak odtwarzać wideo, używając mplayer:

$ mplayer -vo caca local-file.avi

Otwiera to jednak nowe okno. Byłoby fajnie zagrać w terminal.

Ponadto powinien być kompatybilny z tmuxsesjami.


Zadałem kolejne pytanie, jak zapobiec otwieraniu nowego okna .


Dla tych, którzy zastanawiają się, gdzie potrzebuję takiej funkcjonalności, rozpocząłem eksperymentalny projekt o nazwie TmuxOS - z założeniem, że wszystko powinno działać w ramach tmuxsesji .

Potrzebuję więc odtwarzacza wideo do lokalnych i zdalnych filmów. :-)

Ionică Bizău
źródło
2
Masz na myśli coś takiego? google.com/…
chaos
1
@chaos Dokładnie. :-) Szukam tego od miesięcy, ale jeszcze nic nie znaleziono. Postanowiłem zapytać tutaj ...
Ionică Bizău
VLC może odtwarzać filmy z Youtube, nie jestem jednak pewien, czy ma możliwości wyjścia na terminal.
Z mpv możesz to zrobić mpv <youtube url>. Działa również w przypadku wielu innych witryn wideo. Ale to otwiera nowe okno.
Gerardo Marset,
1
To fascynujące pytanie i wiele się nauczyłem z odpowiedzi. Ale z ciekawości - dlaczego, u licha, musisz to robić? ;-)
Cyfrowa trauma

Odpowiedzi:

132

Możesz pobierać filmy i / lub tylko dźwięk, a następnie oglądać / słuchać ich za pomocą youtube-dl. Skrypt jest napisany w Pythonie i używa ffmpegwierzę.

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

Aby pobrać filmy, po prostu podaj adres URL strony, na której chcesz wideo, a skrypt zajmie się resztą:

$ 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

Następnie możesz użyć vlclub, mplayeraby obejrzeć je lokalnie:

$ 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, ale chcę oglądać te filmy, gdy są przesyłane strumieniowo i w ASCII

Znalazłem ten artykuł na blogu zatytułowany: Na ascii, youtube i puszczaniu, który demonstruje metodę, którą omawiałem na czacie, głównie youtube-dljako „backend”, który mógłby pobierać strumień YouTube, a następnie przekierowywać go do innej aplikacji.

W tym artykule pokazano, jak to zrobić mplayer:

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

Wideo są pobierane przez youtube-dlzostaje przekierowany poprzez standardowe wyjście powyżej -o -. Tutaj jest demonstracja efektu .

          ss # 1

Po zainstalowaniu dodatkowych bibliotek wideo ASCII można jeszcze bardziej ulepszyć.

               ss # 2

OK, ale chcę wideo w moim terminalu?

Znalazłem tę sztuczkę, która pozwala na odtwarzanie wideo xtermw artykule O'Reilly zatytułowanym: Oglądaj wideo w sztuce ASCII .

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

Powyższe powoduje xtermotwarcie okna, w którym odtwarzany jest film.

   ss # 3

Pomyślałem więc, dlaczego nie poskładać razem masła orzechowego i czekolady w ten sposób:

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

To prawie działa! Nie jestem pewien, dlaczego wideo nie może być odtwarzane w oknie, ale wydaje się, że powinno. Okno pojawia się i zaczyna grać, ale potem się zamyka. Przez kilka sekund widzę wideo, a potem nic.

Być może powyższe zbliży Cię do ostatecznego rozwiązania, a może po prostu trzeba nieco poprawić opcje.

Dodatkowe biblioteki

Jeśli libcacazainstalowałeś (w wersji kolorowej aalib) i zmniejszysz rozmiar czcionki gnome-terminaldo czegoś naprawdę małego, na przykład powiedzmy 3, następujące polecenie wyświetli znacznie lepiej wyglądające wideo ASCII bezpośrednio w terminalu:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   ss # 4

Zaciski

Wydaje się, że wybór terminala może mieć duży wpływ na to, czy mplayermożna grać bezpośrednio w terminalu, czy też otwiera osobne okno. Również buforowanie mplayermiało ogromną różnicę w możliwości grania bezpośrednio w terminalach.

Korzystając z tego polecenia, byłem w stanie zagrać terminator, przynajmniej dla pierwszej 1/4 wideo przed jego wycięciem:

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

Wersja kolorowa używała tego polecenia:

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

Te same polecenia mogą być odtwarzane w gnome-terminal& xtermteż.

    montaż ss

    UWAGA: To (od lewej do prawej) xterm, terminator, gnome-terminal, i terminology.

slm
źródło
2
Możesz grać w nią terminology- i nie tylko w / lib caca. Możesz użyć klawiszy ucieczki terminala, aby określić odwzorowaną część okna rybitwy i odtworzyć ją właśnie w wysokiej rozdzielczości. Możesz nawet ustawić wideo jako tło i pracować nad nim. terminologyrozumie również identyfikatory URI - uzyskaj link webm do swojego filmu na youtube i po prostu printfdo ekranu jak monit terminalu.
mikeserv
@mikeserv - to fajne, nigdy nie słyszałem o emulatorze terminali. Wypróbowałem to i fajnie, że możesz odtwarzać filmy w tle, tybg my.avirobi to.
slm
Tak - wolę printfmetodę. Zrobić tybg somefile | sed -n l, aby zobaczyć jak to działa - po prostu używa rozszerzeń ucieczek zacisków. Są udokumentowane na manstronie. Możesz zrobić to samo z ty{ls,cat}. Ale te małe aplikacje są tylko starymi opakowaniami demonstracyjnymi prawdziwych rzeczy i być może nie są tak skuteczne. W każdym razie, jeśli twoja wersja została zbudowana w ciągu ostatnich kilku miesięcy, możesz polubić mini-widok tak samo jak ja - ctrl + shift + h. Całe oświecenie jest prawie tak samo dobre - dlatego zasugerowałem, abyście spróbowali go niedawno. To także szalone szybkie.
mikeserv
3
Jakie są wspomniane dodatkowe biblioteki ASCII?
PythonNut,
1
@slm szkoda, myślę, że tylko kompilacje deb-multimedia mają to włączone. Zastanawiam się, dlaczego inni tego nie robią, chyba uważają libcaca za żart i wzdęcie.
derobert
14

Tak więc, używając terminologii (przy okazji, prawdopodobnie najlepszej rzeczy, jaka kiedykolwiek przydarzyła się emulatorowi terminala) w czasie pisania tego tekstu, działa:

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
)

terminologySpecyficzny bit jest thenblok w play()- na printf \033}...linii. terminologyakceptuje wydłużone ucieczki terminala dla mediów drukarskich na ekranie - coś w rodzaju szybkich kolorów, ale także wideo w wysokiej rozdzielczości i zasadniczo cokolwiek innego.

Reszta to trochę curl | sedskryptu, który:

  1. Akceptuje zwykły link do youtube jako pierwszy argument ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' i tak dalej...
  2. Pobiera HTML i znajduje odpowiedni kod javascript dla alternatywnych strumieni pobierania ...
    • zrobić, curl "$yturl" | grep url_encoded_fmt_stream_mapaby zobaczyć cały blok.
  3. Z tego bloku wybiera pierwszy oferowany alternatywny strumień.
    • wiele jest oferowanych - jeśli zrobiłeś greppowyższe, znajdziesz listę w polu "rozdzielanym cytatami ...stream_map: ".
    • podczas gdy na początku myślałem, że będę dostawał coraz więcej mp4s, a więcej - także webms. Zredagowałem go dla przepływu i przypisałem rozszerzenie pliku według typu MIME.
    • jak dotąd - czy to webm, czy mp4 - pierwszym alternatywnym strumieniem jest najwyższa jakość oferowana na wideo - zwykle 720p .mp4 - czego i tak szukam, więc nie ma logiki dla wybierania innych. Moja najnowsza edycja dodała jednak testy modułowości / jawności, aby to umożliwić. Zobacz to dla skryptu perl, do którego odwoływałem się podczas pisania funkcji.
  4. Analizuje %[[:hexdigit:]]\{2\} kodowanie na działające łącza.
    • Zobacz to dla mojej referencji roboczej.
  5. Próbuje pobrać plik do 5 razy z odrobiną wycofania.
    • Domyślnie plik jest wywoływany, /tmp/vid.${mime-type}ale jeśli ytplayzostanie wywołany z drugim argumentem, zinterpretuje to jako docelową nazwę pliku do pobrania - jednocześnie dodając rozszerzenie zgodnie z typem mime.
  6. Jeśli cel pobierania jest w rozmiarze większym niż zero następującym któregokolwiek z jego prób umożliwia pobieranie nadal w tle i drukuje terminology„s place mediów w tle teraz Terminal ucieczki, inni po prostu rezygnuje i zostawia cię z komunikatem o błędzie wszystkich w czapkach.
    • \033}bt[LINK/FILE]\0do gry w pełnym oknie. pnwyskoczyłoby to do nowego okna. Istnieją inne geometryczne ograniczenia obszaru gry - na przykład tylko dla części okna.

To przeszło tylko niewiele więcej niż bardzo minimalne testy, ale jak dotąd działało bez problemu dla każdego linku, ale jedno - a ponieważ tak naprawdę nie byłem zainteresowany oglądaniem tego, który nie grał, nie próbowałem się dowiedzieć dlaczego.

Chociaż zadziałało dla nich wszystkich, niekoniecznie grało dla każdego z nich - a to dlatego, że początkowo na ślepo dołączyłem.mp4 rozszerzenie do pliku docelowego, nie sprawdzając, czy jest poprawne. Możliwe, że ten, na który wcześniej nie patrzyłem, był tylko tym. W każdym razie zmieniłem to, aby sobie z tym poradzić.

Jak wspomniałem wcześniej, jedynym terminologykonkretnym bitem jest ostatnia funkcja - play()- więc możesz łatwo to zmienić, aby zrobić wszystko, co chcesz z pobranym / pobranym plikiem wideo - na przykład używając go z mplayerbibliotekami CACA w innym terminalu, albo wyskocz to do vlcokna lub cokolwiek innego. Ale jeśli lubisz siebie, obejrzysz to w wysokiej rozdzielczości terminology.

Aha, i na koniec, jest to zwykle bardzo szybkie - moje prędkości maksymalizowały moją przepustowość do tej pory przy każdej próbie, ale i terminologytak nie potrzebuje całego pliku, aby rozpocząć odtwarzanie.

Tutaj działa:

skały terminologiczne

mikeserv
źródło
1
Zamiast /tmp/vid.mp4może powinieneś użyć mktemp --suffix=.mp4, nie?
Braiam
@Braiam - to bardzo dobry pomysł, ale prawdopodobnie musiałbym dodać logikę, aby posprzątać. W ten sposób przynajmniej zawsze się nadpisuje. Plik nigdy nie jest odczytywany przez nic, co próbuje go wykonać, więc nie uważam go za wektor - chyba terminologyże gstreamerbackend może przypadkowo uruchomić kod wykonywalny w pliku wideo ... Może. Wątpię, ale nie jestem tego pewien. W każdym razie wolę, aby zawsze zapisywał ten sam plik, chyba że powiem inaczej, ale jeśli uda mi się ulepszyć - na przykład wybieranie rozmiaru i tym podobne - na pewno to naprawię.
mikeserv
@Braiam - przerobiony - spójrz. Prawdopodobnie następny jest dedykowany tmp dir / mktemp.
mikeserv
@Ramesh - spójrz ponownie. Jeśli korzystałeś z ostatniej wersji, jest to lepsze.
mikeserv
1
@DmitriDB - kwestia jest taka, że jesteś nie do drukowania tych ucieczek terminologyw ogóle - to będzie tmux„s ptyponieważ tmuxjest właścicielem strony pan owych interwencyjnym ptys oraz terminologyposiada stronę wzorcową tmux” s pty. Aby poradzić sobie, że można zrobić jak ... PTTY=$(tty) tmux ...następnie w tmuxsesji jak ... tybg >"$PTTY". Właśnie odpowiedziałem na ten sam problem, który masz tutaj wczoraj. Powyższy skrypt powinien działać ytplay ... >"$PTTY"w taki sposób jak w multiplekserze.
mikeserv
6

Na YouTube znajduje się samouczek:

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

Zgodnie z tym filmem powinny działać następujące elementy:

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

W tym celu możesz utworzyć prostą funkcję:

playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}
jimmij
źródło
Oto, co dostaję na mojej maszynie: paste.ubuntu.com/8527219
Ionică Bizău,
1
@ IonicăBizău try:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Martin von Wittich
@MartinvonWittich Działa, ale to nie wideo ASCII, w terminalu, ale w innym oknie ...: - /
Ionică Bizău
2
Ktoś musi to zawinąć w program, który pozwala wyszukiwać filmy z youtube w terminalu i oznaczać je do pobrania wsadowego. a następnie owiń go jeszcze raz, aby usunąć mp3 i usunąć MP4. Mogę to zrobić w pewnym momencie, jeśli nikt inny tego nie zrobi, ale nie nastąpi to w ciągu kilku najbliższych dni.
Millie Smith,
@ IonicăBizău mplayerautomatycznie wybiera najlepszy sterownik wyjściowy, a jeśli masz uruchomiony Xorg, prawdopodobnie wybierze xvsterownik. Spróbuj dodać następujące opcje do mplayerwyboru sterownik konsoli sztuki ASCII: -vo caca.
Martin von Wittich