[unix] 터미널에서 YouTube 동영상 시청

터미널 (브라우저 또는 다른 창이 아니라 bash 세션에서)에서 YouTube 비디오를 볼 수있는 방법을 찾고 있습니다.

이를 수행하는 간단한 방법이 있습니까?

나는 이와 같은 것을 상상한다 :

$ youtube <video-url>

이미 mplayer다음을 사용하여 비디오를 재생하는 방법을 알고 있습니다 .

$ mplayer -vo caca local-file.avi

그러나 새 창이 열립니다. 터미널에서 재생하는 것이 좋습니다.

또한 tmux세션 과 호환되어야 합니다.


새 창을 열지 못하게하는 방법에 대해 다른 질문을했습니다 .


어디에서 이러한 기능이 필요한지 궁금해하는 사람들을 위해 모든 것이 세션 내에서 실행되어야한다는 개념으로 TmuxOStmux 라는 실험 프로젝트를 시작했습니다 .

따라서 로컬 및 원격 비디오를위한 비디오 플레이어가 필요합니다. 🙂



답변

비디오 및 / 또는 오디오 만 다운로드 한 다음을 사용하여 비디오를보고들을 수 있습니다 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"

OK. 그러나이 비디오가 ASCII로 스트리밍 될 때보 고 싶습니다.

이 블로그 기사는 ascii, youtube 및 letting 이라는 제목으로 채팅방에서 논의한 방법을 보여줍니다. 주로 youtube-dlYouTube 스트림을 다운로드 한 다음 다른 앱으로 리디렉션 할 수있는 “백엔드”로 사용 합니다.

이 기사에서는 다음을 수행합니다 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

그래도 실제 터미널에서 비디오를 원합니까?

xtermO’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-terminal3 말처럼, 다음 명령을 직접 터미널에서 훨씬 더 나은 찾고 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.


답변

따라서이 글을 쓰는 시점에서 용어 (아마도 터미널 에뮬레이터에 일어난 가장 좋은 일) 를 사용 하여 다음 작업을 수행합니다.

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을 가져 와서 대체 다운로드 스트림에 대한 관련 자바 스크립트 코드를 찾습니다.
    • 이렇게 curl "$yturl" | grep url_encoded_fmt_stream_map전체 블록을 볼 수 있습니다.
  3. 해당 블록 내에서 첫 번째 제안 된 대체 스트림을 선택합니다.
    • 많은 것들이 제공됩니다- grep위 의 작업을 수행 한 경우 "따옴표로 구분 된 ...stream_map: "필드에 목록이 있습니다.
    • 처음에는 mp4를 점점 더 많이 얻을 것이라고 생각했지만 webms도 얻었습니다. 흐름을 위해 편집하고 mime 유형별로 파일 확장자를 할당했습니다.
    • 지금까지 – WEBM 또는 MP4 여부 – 첫번째로 대체 스트림 비디오마다 제공하는 최고의 품질입니다 – 보통 720 .MP4 – 어쨌든 찾고 있어요 그래서 어떤 논리가 다른 사람을 선택 여기가 없습니다 것이다. 내 최신 편집에는 이것을 가능하게하기 위해 모듈성 / 명시 적 테스트가 추가되었습니다. 원래 함수를 작성할 때 참조한 perl 스크립트에 대해서는 내용을 참조하십시오 .
  4. %[[:hexdigit:]]\{2\}인코딩을 작업 링크로 구문 분석합니다 .
    • 내 작업 참조를 위해 이것을 참조하십시오 .
  5. 약간의 백오 프로 파일을 최대 5 회 다운로드하려고합니다.
    • 기본적으로 파일은 /tmp/vid.${mime-type}있지만 ytplay두 번째 인수와 함께 호출 되면 mime 유형에 따라 확장명을 추가하면서 대상 다운로드 파일 이름으로 해석합니다.
  6. 다운로드 목표는 시도의 다음 0보다 큰 크기 인 경우는 다운로드가 백그라운드에서 계속 할 수 있습니다 인쇄 terminology장소 미디어 배경 현재의 터미널 탈출, 그렇지 않으면 그냥 포기하고 모든 오류 메시지를 남긴다 모자에.
    • \033}bt[LINK/FILE]\0전체 창 재생. pn새 창으로 튀어 나옵니다. 재생 영역을 기하학적으로 제한하는 다른 방법도 있습니다 (예 : 창의 일부에만 해당).

이 테스트는 최소한의 테스트 를 거쳤 지만 지금까지 모든 링크에 대해 실패하지 않고 하나만 작동했습니다. 실제로 플레이하지 않은 링크를 보는 데 관심이 없었기 때문에 알아 내려고 시도하지 않았습니다. 왜.

그것이 모두 그들에게 효과가 있었지만, 반드시 각각을 연주 하지는 않았습니다. 이것은 처음에 .mp4확장자를 대상 파일에 맹목적으로 정확하게 추가했는지 확인하지 않고 추가했기 때문 입니다. 내가 전에 보지 않은 것이 이것뿐 일 수도 있습니다. 어쨌든 나는 그것을 처리하도록 변경했습니다.

앞서 언급했듯이, 유일한 terminology특정 비트는 가장 마지막 기능입니다. play()따라서 mplayer다른 터미널의 CACA 라이브러리 와 함께 사용하는 것과 같이 다운로드 / 다운로드 한 비디오 파일로 원하는 작업을 수행하도록 쉽게 변경할 수 있습니다 . 그렇지 않으면 vlc창 이나 그 밖의 것에 튀어 나옵니다 . 그러나 당신이 자신을 좋아한다면에서 고화질로 볼 수 terminology있습니다.

아, 그리고 마지막으로, 이것은 일반적으로 매우 빠릅니다 . 내 속도는 모든 시도에서 지금까지 지속 시간 동안 대역폭을 최대로 늘 렸지만 terminology파일을 재생하기 위해 전체 파일이 필요하지는 않습니다.

여기서 작동합니다.

용어 바위


답변

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")
}


답변

에서 https://github.com/mps-youtube/mps-youtube

sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt


답변