web-dev-qa-db-ja.com

端末でYouTube動画を見る

端末で(ブラウザーや別のウィンドウではなく、bashセッションですぐに)YouTubeビデオを視聴する方法を探しています。

これを行う簡単な方法はありますか?

私はこのようなものを想像します:

$ youtube <video-url>     

mplayerを使用してビデオを再生する方法はすでに知っています。

$ mplayer -vo caca local-file.avi

ただし、これにより新しいウィンドウが開きます。ターミナルでそれを再生するのはクールです。

また、tmuxセッションと互換性がある必要があります。


新しいウィンドウが開かないようにする方法 について別の質問をしました。


私はそのような機能がどこに必要か不思議に思う人のために、私は TmuxOSという名前の実験的なプロジェクトを開始しましたすべてがtmuxセッションの内部で実行される必要があります

だから、確かに私はローカルとリモートのビデオ用のビデオプレーヤーが必要です。 :-)

109
Ionică Bizău

動画や音声のみをダウンロードして、 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でストリーミングされているので見たいです

次のタイトルのブログ記事を見つけました: On ascii、youtube and letting go チャットルームで議論した方法を示し、主にyoutube-dlを「バックエンド」として使用して、 YouTubeストリームを作成し、他のアプリにリダイレクトします。

この記事は、それがmplayerで行われていることを示しています。

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

youtube-dlによってダウンロードされる動画は、上記の-o -のSTDOUT経由でリダイレクトされます。 ここに効果のデモ があります。

ss#1

追加のライブラリをインストールすると、ASCIIビデオをさらに強化できます。

ss#2

わかりましたが、実際の端末にビデオが欲しいですか?

タイトルがO'Reillyのxtermで再生できるようにするこのトリックを発見しました: Watch Videos in 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 -"

これはほとんど機能します!ビデオがウィンドウで再生できない理由はわかりませんが、できるはずです。ウィンドウが表示され、再生が開始されますが、その後閉じられます。数秒間ビデオが表示され、その後何も表示されません。

おそらく、上記の方法で最終的なソリューションに近づくことができます。あるいは、オプションを少し調整する必要があるだけかもしれません。

追加のライブラリ

libcacaaalibのカラーバージョン)をインストールしていて、gnome-terminalのフォントサイズを3などの非常に小さいものに縮小すると、次のコマンドでターミナル内で直接よりよく見えるASCIIビデオ:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

ss#4

ターミナル

ターミナルの選択は、mplayerがターミナル内で直接再生できるのか、それとも別のウィンドウを開くのか、という点で大きな問題になる可能性があります。 mplayerのキャッシングも、1のターミナルで直接プレイできるという点で劇的な違いをもたらしました。

このコマンドを使用して、私は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-terminalxtermでも再生できます。

ss montage

注:それは(左から右へ)xtermterminatorgnome-terminalterminology

133
slm

したがって、 用語を使用します(おそらく、端末エミュレータで起こった最高のことです)これを書いている時点で次のように動作します:

_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固有のビットは、play()内のthenブロック-_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を実行した場合、_"_ quote-delimited _...stream_map: "_フィールドにリストが表示されます。
    • 最初は、mp4だけを取得するつもりだと思っていましたが、webmsも取得します。そこで、フロー用に編集し、MIMEタイプごとにファイル拡張子を割り当てるようにしました。
    • so far-webmかmp4か-最初の代替ストリームはビデオごとに提供される最高品質です-通常720p .mp4-これとにかく私が探しているので、他のものを選択するためのロジックはありません。私の最新の編集は、これを可能にするためにいくつかのモジュール性/明示的なテストを追加しました。最初に関数を作成するときに参照したPerlスクリプトについては、 this を参照してください。
  4. _%[[:hexdigit:]]\{2\}_エンコーディングを作業リンクに解析します。
    • 私の実際のリファレンスについては this を参照してください。
  5. 少しバックオフして、ファイルを5回までダウンロードしようとします。
    • デフォルトでは、ファイルは_/tmp/vid.${mime-type}_ですが、2番目の引数を指定してytplayが呼び出されると、それはターゲットのダウンロードファイル名として解釈され、MIMEタイプに従って拡張子が追加されます。
  6. ダウンロードターゲットのサイズがゼロよりも大きい場合は、ダウンロードがバックグラウンドで続行され、terminologyのメディアがバックグラウンドで印刷されますターミナルエスケープ、それ以外の場合はあきらめて、すべて大文字のエラーメッセージが表示されます。
    • フルウィンドウ再生の場合は_\033}bt[LINK/FILE]\0_。 pnは、それを新しいウィンドウにポップします。たとえば、ウィンドウの一部のみなど、プレイエリアを幾何学的に制限するための他のものがあります。

これはほんのわずかのテストを受けただけですが、これまでのところすべてのリンクで確実に機能しています。プレイしなかった理由を調べようとしませんでした。

それらのすべてで機能しましたが、必ずしもplayであるとは限りませんでした。これは、最初にチェックせずに_.mp4_拡張子を目的のファイルに盲目的に追加したためですそれが正しかった場合。以前調べなかったのもこれだけだったのかもしれません。いずれにしても、それを処理するように変更しました。

先に述べたように、terminology固有のビットは最後の関数-play()にあります。そのため、ダウンロード/ダウンロードしたビデオファイルを使用して、好きなように簡単に変更できます-たとえば、別の端末でmplayerのCACAライブラリを使用するか、またはvlcウィンドウなどにポップアウトします。しかし、あなたが好きなら、terminologyの高解像度でそれを見るでしょう。

ああ、そして最後に、これは通常非常に高速です-私の速度はすべての試行でこれまでの期間の帯域幅を最大にしましたが、terminologyはとにかくファイル全体を再生し始めます。

ここでそれは働いています:

terminology rocks

15
mikeserv

これに関するチュートリアルが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")
}
6
jimmij

https://github.com/mps-youtube/mps-youtube から

Sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt
1
J0hnG4lt