Дивіться відео YouTube у терміналі


107

Я шукаю спосіб перегляду відео YouTube у терміналі (не в браузері чи іншому вікні, а прямо там, у будь-який баш-сеанс).

Чи є простий спосіб це зробити?

Я уявляю щось подібне:

$ youtube <video-url>     

Я вже знаю, як відтворювати відео, використовуючи mplayer:

$ mplayer -vo caca local-file.avi

Однак це відкриває нове вікно. Класно було б грати в термінал.

Крім того, він повинен бути сумісний з tmuxсеансами.


Я задав ще одне питання, як не допустити відкриття нового вікна .


Для тих, хто цікавиться, де мені потрібен такий функціонал, я розпочав експериментальний проект під назвою TmuxOS - з концепцією, що все має працювати протягом tmuxсеансу .

Тож справді мені потрібен відеоплеєр для локальних та віддалених відео. :-)


2
Ви маєте на увазі так? google.com/…
хаос

1
@chaos Рівно. :-) Я шукаю це місяцями, але поки нічого не знайдено. Вирішив попросити тут ...
Ionică Bizău

VLC може відтворювати відео з Youtube, але не впевнений, чи має він термінальні можливості виводу.

З mpv можна зробити mpv <youtube url>. Він також працює для багатьох інших веб-сайтів. Але це відкриває нове вікно.
Джерардо Марсет

1
Це захоплююче питання, і я багато чого навчився з відповідей. Але з цікавості - чому на землі вам потрібно це робити? ;-)
Цифрова травма

Відповіді:


132

Ви можете завантажити відео та / або просто аудіо, а потім переглядати / слухати їх за допомогою youtube-dl. Сценарій написаний на Python і він використовує, ffmpegя вважаю.

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

Щоб завантажити відео, просто надайте йому URL-адресу зі сторінки, на якій потрібно це відео, а сценарій - це все інше:

$ 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

Потім ви можете використовувати vlcабо 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"

Гаразд, але я хочу переглянути ці відео, як вони передаються в ASCII

Я знайшов цю статтю в блозі під назвою: Про ascii, youtube та відпускання, що демонструє метод, про який я обговорював у чаті, в основному використовуючи youtube-dlяк "бекенд", який міг зробити завантаження потоку YouTube, а потім перенаправити його на якусь іншу програму.

Ця стаття показує, що це робиться з mplayer:

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

Відео завантажується на youtube-dlперенаправляється через STDOUT вище -o -. Тут демонстрація ефекту .

          ss №1

За допомогою встановлення додаткових бібліотек відео ASCII може бути додатково покращено.

               ss №2

Гаразд, але я хочу, щоб це відео було фактично?

Я знайшов цей трюк, який дозволяє відтворювати відео xtermв приміщенні O'Reilly під назвою: Перегляд відео в ASCII Art .

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

Вищезазначене призводить до відкриття xtermвікна, де відтворюється відео.

   ss №3

Тож я подумав, чому б не покласти арахісове масло та шоколад разом так:

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

Це майже працює! Я не впевнений, чому відео не може відтворюватися у вікні, але, здавалося б, воно могло б мати можливість. Вікно піднімається і починає грати, але потім закривається. Я бачу відео на кілька секунд, а потім нічого.

Можливо, вищесказане наблизить вас до вашого остаточного рішення, або, можливо, його просто потрібно трохи підправити на варіанти.

Додаткові бібліотеки

Якщо ви libcacaвстановили (розфарбовану версію aalib) і зменшите розмір шрифту у вашому gnome-terminalдо чогось дійсно невеликого, наприклад, 3, наступна команда відобразить набагато краще виглядає відео ASCII безпосередньо в терміналі:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   ss №4

Термінали

Здавалося б, вибір терміналу може зробити велику справу щодо того, чи mplayerможна грати безпосередньо всередині терміналу чи відкриває це окреме вікно. Тренування теж mplayerзробило кардинальну зміну в можливості грати безпосередньо в тих терміналах.

Використовуючи цю команду, я зміг відтворити terminatorпринаймні першу 1/4 відео, перш ніж її вирізати:

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

Кольорова версія використовувала цю команду:

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

Ці самі команди можуть грати і в gnome-terminal& xterm.

    ss монтаж

    Примітка: Це (зліва направо) xterm, terminator, gnome-terminalі terminology.


2
Ви можете грати в нього, terminologyа не тільки в / в кака. Ви можете використовувати термінальні втечі, щоб вказати відображену частину термінального вікна і відтворити її прямо у високій деф. Ви навіть можете встановити відео на свій фон і працювати над ним. terminologyтакож розуміє URI - отримайте посилання на веб-сайт до вашого відео на YouTube та просто printfна екран, як підказка терміналу.
mikeserv

@mikeserv - це здорово, ніколи не чули про цей термінальний емулятор. Я спробував це, і це здорово, що ви можете відтворювати відео у фоновому режимі, tybg my.aviце робить.
slm

Так - я віддаю перевагу printfметоду. Зробіть , tybg somefile | sed -n lщоб побачити , як це працює - він просто використовує розширені кінцеві пагони. Вони задокументовані на manсторінці. Ви можете зробити те ж саме і з ty{ls,cat}. Але ці маленькі додатки - це лише старі демонстраційні пакети справжньої речі і, можливо, не такі здатні. У будь-якому випадку, якщо ваша версія була побудована за останні кілька місяців, вам може сподобатися міні-перегляд так само, як і я - робіть ctrl + shift + h. Все просвітління майже так само добре - саме тому я запропонував вам спробувати це нещодавно. Це також божевільно швидко.
mikeserv

3
Які вказані додаткові лінзи ASCII?
PythonNut

1
@slm занадто погано, я думаю, що лише дебют-мультимедійні збірки увімкнули його. Цікаво, чому інші цього не роблять, здогадуються, що вони, мабуть, вважають Лібкаку жартом і роздутою.
дероберт

14

Отже, з термінологією (мабуть, найкращою справою, що коли-небудь траплялася з емулятором терміналу, до речі) під час написання наступних робіт:

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
)

terminologyКонкретний біт є thenблок в play()- по printf \033}...лінії. terminologyприймає розширені термінали для друку носіїв на екрані - начебто кольори підказок, але також відео з високим доступом та в основному все, що ви хочете.

Решта - це трохи curl | sedсценарій, який:

  1. Приймає звичайне посилання на YouTube як перший аргумент ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' і так далі...
  2. Витягує HTML і знаходить відповідний код javascript для альтернативних потоків завантаження ...
    • зробити, curl "$yturl" | grep url_encoded_fmt_stream_mapщоб побачити весь блок.
  3. Зсередини цього блоку він вибирає перший запропонований альтернативний потік.
    • пропонується багато - якщо ви зробили grepвище, ви знайдете список у полі, "обмеженому цитатами ...stream_map: ".
    • в той час як спочатку я думав, що буду отримувати тільки mp4s все більше і більше, я також отримую веб-сторінки. Тому я відредагував його для потоку та призначив розширення файлу за типом mime.
    • Поки що - веб-сайт чи mp4 - перший альтернативний потік - це найвища якість, що пропонується на відео - зазвичай це 720p .mp4 - що я шукаю в будь-якому випадку, тому тут немає логіки для вибору інших. Моя остання редакція додала деяку модульність / явні тести, щоб зробити це можливим. Дивіться це на сценарій perl, на який я посилався, коли писав функцію.
  4. Розбирає %[[:hexdigit:]]\{2\}кодування на робочі посилання.
    • Дивіться це для моєї робочої довідки.
  5. Намагається завантажувати файл до 5 разів, домігшись спаду.
    • За замовчуванням файл є, /tmp/vid.${mime-type}але якщо ytplayйого викликають з другим аргументом, він буде тлумачити це як цільове ім'я файлу завантаження - при цьому додаючи розширення відповідно до типу mime.
  6. Якщо мета завантаження на розмірі більше нуля , після будь-якої зі своїх спроб вона дозволяє завантажити продовжувати в фоновому режимі і друкує terminology«и места ЗМІ в фоновому режимі в даний час терміналу втечі, інакше він просто відмовляється і залишає вас з повідомленням про помилку всіх в шапках.
    • \033}bt[LINK/FILE]\0для гри в повний вікон. pnвискочив би це до нового вікна. Є й інші, які геометрично обмежують ігрову зону, наприклад, наприклад, лише для частини вікна.

Це пройшло лише трохи більше, ніж дуже мінімальне тестування, але до цих пір працювало для кожного посилання безвідмовно, але одне - і тому, що мені насправді не цікаво було дивитися те, що не грало, я не намагався дізнатися чому.

Хоча він працював для всіх, він не обов'язково відтворював кожного - і це тому, що спочатку я сліпо додав .mp4розширення до цільового файлу, не перевіряючи, чи воно правильне. Можливо, те, що я не заглядав раніше, було лише цим. У будь-якому випадку я змінив це, щоб впоратися з цим.

Як я вже згадував раніше, єдиний terminologyспецифічний біт полягає в останній функції - play()- і ви можете легко змінити це, щоб робити все, що завгодно, з завантажуваним / завантаженим відеофайлом - наприклад, використовувати його з mplayerCACA libs в іншому терміналі, або ж вискочити його у vlcвікно чи що завгодно. Але якщо вам подобається, ви будете дивитись це в режимі hi-def terminology.

О, і останнє, це, як правило, дуже швидко - мої швидкості додавали мою пропускну здатність протягом тривалості до кожної спроби, але terminologyне потрібен весь файл, щоб почати відтворювати його.

Ось це працює:

термінологія порід


1
Замість, /tmp/vid.mp4можливо, вам слід скористатися mktemp --suffix=.mp4, ні?
Брайам

@Braiam - це дуже гарна ідея, але тоді, мабуть, мені доведеться додати логіку, щоб очистити. Таким чином, принаймні, вона завжди переписує себе. Файл ніколи не читається нічим, що намагається його виконати, тому я не вважаю його вектором - хіба terminologyщо gstreamerbackend може випадково запустити виконуваний код у відеофайлі ... Можливо. Я сумніваюся в цьому, але мені недостатньо, щоб сказати точно. У будь-якому випадку, я вважаю за краще завжди писати один і той же файл, якщо не скажу інше, але якщо мені вдасться зробити його кращим - як вибір розміру і таке - я обов'язково виправлю це.
mikeserv

@Braiam - переробив це - подивіться. Можливо, наступний виділений tmp dir / mktemp.
mikeserv

@Ramesh - подивися ще раз. Якщо ви використовували останню версію, це краще.
mikeserv

1
@DmitriDB - проблема в тому , що ви не друкує ці пагони , щоб terminologyу всіх - ті , які збираються tmux«s , ptyтому що tmuxволодіє майстер боку осіб , які виступають ptyз і terminologyволодіє майстер боку tmux» з pty. Для того, щоб впоратися з цим ви можете зробити , як ... PTTY=$(tty) tmux ...то в tmuxсесії , як ... tybg >"$PTTY". Я насправді відповів на ту саму проблему, яку ви мали тут лише вчора. Сценарій, описаний вище, повинен просто працювати як ytplay ... >"$PTTY"мультиплексор таким чином.
mikeserv

6

Для цього на YouTube є підручник:

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

Відповідно до цього відео має працювати наступне:

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

Для цього можна створити просту функцію:

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

Це те, що я отримую на своїй машині: paste.ubuntu.com/8527219
Ionică Bizău

1
@ IonicăBizău спробуйте:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Мартін фон Віттіх

@MartinvonWittich Це працює, але це не відео ASCII, в терміналі, а в іншому вікні ...: - /
Ionică Bizău

2
Комусь потрібно загорнути це в програму, яка дозволяє шукати відео в YouTube в терміналі та маркувати їх для пакетного завантаження. а потім оберніть його ще раз, щоб зняти mp3 та видалити mp4. Я можу зробити це в якийсь момент, якщо ніхто інший цього не зробить, але це не буде в найближчі кілька днів.
Міллі Сміт

@ IonicăBizău mplayerавтоматично вибирає найкращий вихідний драйвер, і якщо у вас працює Xorg, він, ймовірно, вибере xvдрайвер. Спробуйте додати наступну опцію , mplayerщоб вибрати драйвер консолі ASCII арт: -vo caca.
Мартін фон Віттіч

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.