저는 터미널에서 YouTube 비디오를 볼 수 있는 방법을 찾고 있습니다(브라우저나 다른 창이 아니라 바로 거기, bash 세션에서).
이를 수행하는 간단한 방법이 있습니까?
나는 다음과 같은 것을 상상한다:
$ youtube <video-url>
다음을 사용하여 비디오를 재생하는 방법을 이미 알고 있습니다 mplayer
.
$ mplayer -vo caca local-file.avi
그러나 이렇게 하면 새 창이 열립니다. 터미널에서 플레이하는 것이 좋을 것 같습니다.
또한 세션과 호환되어야 합니다 tmux
.
제가 또 다른 질문을 했는데요새 창을 여는 것을 방지하는 방법.
그러한 기능이 어디에 필요한지 궁금해하는 사람들을 위해 저는 다음과 같은 실험 프로젝트를 시작했습니다.TmuxOS-- 라는 컨셉으로tmux
모든 것이 세션 내에서 실행되어야 합니다. .
그래서 실제로 로컬 및 원격 비디오를 위한 비디오 플레이어가 필요합니다. :-)
답변1
비디오 및/또는 오디오만 다운로드한 다음 다음을 사용하여 시청/청취할 수 있습니다.youtube-dl
. 스크립트는 Python으로 작성되었으며 ffmpeg
I believe를 활용합니다.
$ 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 -
. 거기에여기에서 효과 데모.
추가 라이브러리를 설치하면 ASCII 비디오가 더욱 향상될 수 있습니다.
좋습니다. 하지만 실제 터미널에서 비디오를 원하나요?
xterm
나는 O'Reilly 기사에서 다음과 같은 제목 으로 비디오를 재생할 수 있는 이 트릭을 발견했습니다 .ASCII 아트로 비디오 보기.
$ xterm -fn 5x7 -geometry 250x80 -e "mplayer -vo aa:driver=curses j.mp4
위의 결과 xterm
로 비디오가 재생되는 창이 열립니다.
그래서 땅콩버터와 초콜릿을 이렇게 함께 넣어보면 어떨까요?
$ 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
터미널
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
에서도 실행될 수 있습니다.
메모:(왼쪽에서 오른쪽으로) 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
스크립트입니다.
- 첫 번째 인수로 일반 YouTube 링크를 허용합니다...
ytplay 'https://www.youtube.com/watch?v=${id}'
등등...
- HTML을 가져와서 대체 다운로드 스트림에 대한 관련 자바스크립트 코드를 찾습니다...
curl "$yturl" | grep url_encoded_fmt_stream_map
블록 전체를 보려면 하세요 .
- 해당 블록 내에서 제공되는 첫 번째 대체 스트림을 선택합니다.
- 많은 항목이 제공됩니다. 위의 작업을 수행한 경우 따옴표로 구분된 필드
grep
에서 목록을 찾을 수 있습니다 ."
...stream_map: "
- 처음에는 mp4만 얻을 것이라고 생각했지만 점점 더 웹사이트도 얻게 됩니다. 그래서 흐름에 맞게 편집하고 MIME 유형별로 파일 확장자를 할당했습니다.
- 지금까지- webm 또는 mp4 여부 - 첫 번째 대체 스트림은 비디오당 제공되는 최고 품질입니다. -대개720p .mp4 - 어쨌든 내가 찾고 있는 것이므로 여기에는 다른 것을 선택할 논리가 없습니다. 하지만 최근 편집에서는 이를 가능하게 하기 위해 몇 가지 모듈성/명시적 테스트를 추가했습니다. 보다이것함수를 처음 작성할 때 참조했던 Perl 스크립트에 대한 것입니다.
- 많은 항목이 제공됩니다. 위의 작업을 수행한 경우 따옴표로 구분된 필드
%[[:hexdigit:]]\{2\}
인코딩을 작업 링크로 구문 분석합니다 .- 보다이것내 작업 참고용으로.
- 약간의 백오프를 거쳐 최대 5회까지 파일 다운로드를 시도합니다.
- 기본적으로 파일은 다음
/tmp/vid.${mime-type}
과 같지만ytplay
두 번째 인수로 호출되면 이를 대상 다운로드 파일 이름으로 해석하고 MIME 유형에 따라 확장자를 계속 추가합니다.
- 기본적으로 파일은 다음
- 시도 후 다운로드 대상의 크기가 0보다 큰 경우 다운로드가 백그라운드에서 계속되도록 허용하고
terminology
의지금 미디어를 백그라운드에 배치하세요터미널 탈출, 그렇지 않으면 포기하고 모두 대문자로 표시된 오류 메시지를 남깁니다.\033}bt[LINK/FILE]\0
전체 창 플레이용.pn
새 창으로 팝업됩니다. 예를 들어 창의 일부에 대해서만 재생 영역을 기하학적으로 제한하는 다른 방법도 있습니다.
이것은 단지 조금 더 많은 일을 겪었습니다.아주 최소한의테스트했지만 지금까지 모든 링크에 대해 하나를 제외하고는 실패 없이 작동했습니다. 실제로 재생되지 않은 링크를 보는 데 관심이 없었기 때문에 이유를 찾으려고 노력하지 않았습니다.
그것이 그들 모두에게 효과가 있었지만 반드시 그런 것은 아니었습니다.놀다각각 - 이는 처음에 .mp4
확장자가 올바른지 확인하지 않고 대상 파일에 맹목적으로 확장자를 추가했기 때문입니다. 내가 이전에 조사하지 않았던 것도 이것뿐이었을 가능성이 있다. 어쨌든 나는 그것을 처리하기 위해 그것을 변경했습니다.
앞서 언급했듯이 유일한 terminology
특정 비트는 맨 마지막 함수에 있으므로 play()
다운로드/다운로드한 비디오 파일로 원하는 작업을 수행하도록 쉽게 변경할 수 있습니다. 예를 들어 mplayer
다른 터미널에서 의 CACA 라이브러리와 함께 사용하는 경우, 아니면 창문이나 뭐든지 튀어나오게 하세요 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