터미널에서 YouTube 비디오 보기

터미널에서 YouTube 비디오 보기

저는 터미널에서(브라우저나 다른 창이 아닌 모든 bash 세션에서) YouTube 동영상을 볼 수 있는 방법을 찾고 있습니다.

이를 수행하는 쉬운 방법이 있습니까?

나는 다음과 같은 것을 상상한다:

$ youtube <video-url>     

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

$ mplayer -vo caca local-file.avi

그러나 이렇게 하면 새 창이 열립니다. 터미널에서 가지고 놀면 좋을 것 같습니다.

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


또 다른 질문을 했어요새 창이 열리지 않게 하는 방법.


그러한 기능이 어디에 필요한지 궁금해하는 사람들을 위해 저는 다음과 같은 실험 프로젝트를 시작했습니다.다중화 운영 체제——이번 컨셉은tmux모든 것이 세션 내에서 실행되어야 합니다. .

그래서 로컬 및 원격 비디오를 위한 비디오 플레이어가 꼭 필요합니다. :-)

답변1

다음을 사용하여 비디오 및/또는 오디오만 다운로드하고 시청/청취할 수 있습니다.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 및 Wayback Machine 정보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

알겠습니다. 하지만 실제 터미널에서 비디오를 재생하고 싶은데요?

xtermO'Reilly의 기사에서 비디오를 재생하는 방법을 찾았습니다.ASCII 아트 비디오 보기.

$ 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

그래서,용어 (그런데 이것은 아마도 터미널 에뮬레이터에 일어난 최고의 일일 것입니다) 글을 쓰는 시점에다음은 작동합니다:

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의 블록 입니다. 확장된 터미널 이스케이프를 통해 미디어를 화면에 인쇄할 수 있습니다. 이는 프롬프트 색상과 비슷할 뿐만 아니라 HD 비디오 및 기본적으로 원하는 모든 것입니다.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만 받을 수 있을 거라 생각했지만, 점점 웹메일도 받을 수 있게 되었습니다. 그래서 흐름을 구현하고 MIME 유형별로 파일 확장자를 할당하도록 편집했습니다.
    • 지금까지- webm이든 mp4이든 - 첫 번째 대체 스트림은 각 비디오에서 제공되는 최고 품질입니다. -대개720p .mp4 - 이것이 제가 찾고 있는 것이므로 여기서 다른 것을 선택하는 논리는 없습니다. 그러나 최근 편집에서는 이를 가능하게 하기 위해 몇 가지 모듈식/명시적 테스트를 추가했습니다. 바라보다이것내가 이 함수를 처음 작성할 때 참조한 Perl 스크립트의 경우.
  4. %[[:hexdigit:]]\{2\}인코딩을 작업 링크로 구문 분석합니다 .
    • 바라보다이것내 작업 참조용입니다.
  5. 파일을 최대 5번까지 다운로드한 후 잠시 중단하세요.
    • 기본적으로 파일은 다음과 /tmp/vid.${mime-type}같지만 두 번째 인수로 호출하면 ytplay대상 다운로드 파일 이름으로 해석되며 여전히 MIME 유형에 따라 확장명이 추가됩니다.
  6. 시도 후 다운로드 대상의 크기가 0보다 큰 경우 다운로드가 백그라운드에서 계속되도록 허용하고 terminology인쇄합니다 .이제 미디어를 배경으로 설정하세요.터미널 이스케이프를 사용하지 않으면 포기하고 모두 대문자로 된 오류 메시지가 표시됩니다.
    • \033}bt[LINK/FILE]\0전체 창 재생용입니다. pn그러면 새 창에 나타납니다. 창의 일부에 대해서만 게임 영역을 기하학적으로 제한하는 다른 방법이 있습니다.

이건 좀 더매우 작은테스트 중이지만 지금까지 하나를 제외한 모든 링크가 작동했으며 실제로 재생되지 않는 링크를 보는 데 관심이 없기 때문에 이유를 알아내려고 노력하지 않았습니다.

모든 사람에게 효과가 있지만 반드시 그런 것은 아닙니다.놀다per - 처음에는 .mp4확장자가 올바른지 확인하지 않고 대상 파일에 맹목적으로 확장자를 추가하기 때문입니다. 어쩌면 이것이 내가 이전에 공부하지 않은 유일한 것일 수도 있습니다. 어쨌든 이 문제를 처리하기 위해 변경했습니다.

앞서 언급했듯이 유일한 terminology특정 비트는 마지막 기능에 있습니다. play()따라서 다운로드/다운로드한 비디오 파일로 원하는 작업을 수행하도록 쉽게 변경할 수 있습니다. 예를 들어 mplayerCACA 라이브러리와 함께 사용하거나 vlc창 에 표시합니다. 아니면 다른 곳이라도. 하지만 마음에 들면 HD로 시청할 수 있습니다 terminology.

아 그리고 마지막으로 이건 보통매우 빠르다- 지금까지 시도할 때마다 속도가 대역폭을 최대화했지만 terminology어쨌든 재생을 시작하는 데 전체 파일이 필요하지 않습니다.

여기 작동 중입니다.

록이라는 용어

답변3

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

답변4

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

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

관련 정보