ターミナルでYouTube動画を視聴する

ターミナルでYouTube動画を視聴する

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

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

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

$ 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、そして手放すこと(ウェイバックマシン)これは、チャットルームで説明した方法を示しており、主に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) をインストールしていて、 のフォント サイズを 3 などの非常に小さいサイズに縮小した場合gnome-terminal、次のコマンドを実行すると、はるかに見栄えの良い 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-terminalterminology

答え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画面にメディアを印刷するための拡張ターミナル エスケープを受け入れます。プロンプトの色のようなものですが、高解像度のビデオや、基本的に必要なものはすべて受け入れます。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: "
    • 最初は mp4 しか取得できないと思っていましたが、だんだんと webms も取得するようになりました。そこで、フローに合わせて編集し、MIME タイプごとにファイル拡張子を割り当てるようにしました。
    • これまでのところ- webm または mp4 のどちらでも - 最初の代替ストリームはビデオごとに提供される最高品質です -いつもの720p .mp4 - いずれにせよ私が探しているのはこれなので、他のものを選択するロジックはありません。ただし、最新の編集では、これを可能にするためにいくつかのモジュール性/明示的なテストを追加しました。これ最初に関数を記述したときに参照した Perl スクリプト用です。
  4. %[[:hexdigit:]]\{2\}エンコーディングを解析して動作するリンクに 変換します。
    • 見るこれ作業の参考として。
  5. 少し間隔を空けて最大 5 回までファイルのダウンロードを試行します。
    • デフォルトではファイルは です/tmp/vid.${mime-type}が、ytplay2 番目の引数で呼び出された場合は、それを対象のダウンロード ファイル名として解釈し、MIME タイプに応じて拡張子を追加します。
  6. ダウンロードターゲットのサイズが、いずれかの試行後に0より大きい場合は、ダウンロードをバックグラウンドで続行し、terminology'sを出力します。メディアをバックグラウンドに配置するターミナル エスケープを実行しないと、処理を中止し、すべて大文字のエラー メッセージが表示されます。
    • \033}bt[LINK/FILE]\0ウィンドウ全体で再生する場合、pn新しいウィンドウにポップアップ表示されます。再生領域を幾何学的に制限する (たとえば、ウィンドウの一部のみなど) 方法もあります。

これは、非常に最小限テストしましたが、これまでのところ 1 つのリンクを除いてすべてのリンクで問題なく動作しています。再生されなかったリンクを見ることに実際には興味がなかったので、その理由を調べようとはしませんでした。

全員に効果があったが、必ずしも遊ぶそれぞれ - これは、最初、.mp4正しいかどうかを確認せずに、盲目的に対象ファイルの拡張子を追加したためです。以前に調べなかったものも、これだけだった可能性があります。いずれにせよ、それを処理できるように変更しました。

前に述べたように、唯一のterminology特別な部分は一番最後の関数にあります - play()- そのため、ダウンロード中またはダウンロードされたビデオ ファイルで必要な操作を簡単に実行できます -mplayer別の端末で の CACA ライブラリで使用したり、ウィンドウにポップアウトしたりできvlcます。ただし、お好みであれば、 で高解像度で視聴できます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

から出典: github.com

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

関連情報