端末で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-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のブロックです。拡張端末エスケープにより、メディアを画面に印刷できます。これはプロンプトの色に似ているだけでなく、HDビデオと基本的に欲しいものです。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だけがもらえると思いましたが、ますますウェブメールも受けられるようになりました。そのため、フローを実装し、MIMEタイプごとにファイル拡張子を割り当てるように編集しました。
    • これまで- webmでもmp4でも - 最初の代替ストリームは、各ビデオで提供される最高品質です。 -通常720p .mp4 - これが私が探しているものなので、ここで他を選択するロジックはありません。しかし、最近の編集では、これを可能にするためにいくつかのモジュラー/明示的なテストを追加しました。バラよりこれ私がこの関数を最初に書いたときに参照したPerlスクリプトの場合。
  4. %[[:hexdigit:]]\{2\}エンコードを作業リンクに解析します。
    • バラよりこれ私の仕事は参考用です。
  5. ファイルを最大5回ダウンロードしてからしばらく中止してください。
    • デフォルトでは、ファイルは次のようになりますが、/tmp/vid.${mime-type}2番目の引数ytplayで呼び出すと、ターゲットのダウンロードファイル名として解釈され、MIMEタイプに応じて拡張子が追加されます。
  6. 試行後にダウンロード先のサイズが0より大きい場合は、ダウンロードがバックグラウンドで続行できるようにしてterminology印刷します。ここでメディアを背景に設定します。ターミナルエスケープを使用しない場合は、放棄し、すべて大文字のエラーメッセージが表示されます。
    • \033}bt[LINK/FILE]\0フルウィンドウ再生用です。pnこれで新しいウィンドウに表示されます。ウィンドウの一部に対してのみゲーム領域を幾何学的に制限する別の方法があります。

これはもう少し非常に小さいテスト中ですが、これまで1つを除くすべてのリンクが機能し、実際に再生されていないリンクを見ることに興味がないため、理由を特定しようとしました。

すべての人に効果がありますが、必ずしもそうではありません。遊ぶ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

関連情報