ターミナルでYouTubeビデオを見る


107

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

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

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

$ youtube <video-url>     

私はすでにビデオを再生する方法を知っていますmplayer

$ mplayer -vo caca local-file.avi

ただし、これにより新しいウィンドウが開きます。ターミナルでプレイするのはクールでしょう。

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


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


そのような機能が必要な場所を知りたい人のtmuxために、私はTmuxOSという名前の実験プロジェクトを開始しました- セッション内ですべてを実行 するというコンセプトで

そのため、実際にはローカルおよびリモートビデオ用のビデオプレーヤーが必要です。:-)


2
こんな意味ですか?google.com/...
混沌

1
@chaosまさに。:-)私はこれを何ヶ月も探していますが、まだ何も見つかりません。...ここに頼むことにしました
IonicăBizău

VLCはYoutubeビデオを再生できますが、端末出力機能があるかどうかはわかりません。

mpvを使用すればできますmpv <youtube url>。また、他の多くのビデオサイトでも機能します。しかし、これは新しいウィンドウを開きます。
ヘラルドマーセット14年

1
これは魅力的な質問であり、その答えから多くを学びました。しかし、好奇心から-いったいなぜこれをする必要があるのですか?;-)
デジタル外傷14年

回答:


132

動画や音声だけをダウンロードして、を使用して視聴できます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)と、あなたのフォントサイズを小さく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-terminalxtermでも再生できます。

    SSモンタージュ

    注:それは(左から右へ)だxtermterminatorgnome-terminal、とterminology


2
あなたはそれをterminology-caca libsだけでなく-でプレイできます。ターミナルエスケープを使用して、ターニナルウィンドウのマッピングされた部分を指定し、高解像度でそこで再生できます。ビデオを自分の背景に設定して、それを修正することもできます。terminologyURIも理解します-あなたのyoutubeビデオへのwebmリンクを取得しprintf、ターミナルプロンプトのような画面にリンクします。
mikeserv 14年

@mikeserv-それはクールで、その端末エミュレーターについて聞いたことがない。私はそれを試しましたが、バックグラウンドでビデオを再生できるのは素晴らしいことですtybg my.avi
slm

ええ-私はこのprintf方法が好きです。tybg somefile | sed -n lそれがどのように機能するかを確認してください-拡張ターミナルエスケープを使用するだけです。それらはmanページに文書化されています。でも同じことができますty{ls,cat}。しかし、これらの小さなアプリは本物の単なる古いデモラッパーであり、おそらくそれほど機能的ではありません。とにかく、もしあなたのバージョンがここ数ヶ月でビルドされているなら、私と同じくらいミニビューが好きかもしれません-ctrl + shift + hをしてください。啓発のすべてはほぼ同じくらい良いです-それは私があなたに最近それを試してみることを提案した理由です。また、非常に高速です。
mikeserv 14年

3
前述の追加のASCIIライブラリは何ですか?
PythonNut 14年

1
@slmがひどすぎて、deb-multimediaビルドだけで有効になっていると思います。他の人がそうしないのはなぜか、おそらくlibcacaを冗談で肥大化させていると思います。
デロバート14年

14

そのため、この記事を執筆している時点での用語 (おそらく、端末エミュレーターで起こった最高の出来事) では、次のように動作します。

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回ダウンロードしようとします。
    • デフォルトでは、ファイルは2番目の引数で呼び出され/tmp/vid.${mime-type}た場合ytplay、ターゲットのダウンロードファイル名として解釈されます-MIMEタイプに応じて拡張子を追加します。
  6. ダウンロード対象はその試行、次のいずれかがゼロよりも大きいサイズである場合には、ダウンロードはバックグラウンドで継続してすることができます印刷物terminology場所メディア、バックグラウンド、今では、端末のエスケープ、他のそれだけであきらめ、すべてのエラーメッセージが残りますキャップで。
    • \033}bt[LINK/FILE]\0全画面再生用。pn新しいウィンドウにポップアウトします。プレイエリアを幾何学的に制限する他の方法があります-たとえば、ウィンドウの一部のみなど。

これは非常に最小限のテストよりも少しだけ進んでいますが、これまでのところ、すべてのリンクで確実に機能していましたが、1なぜ。

それらのすべてで機能していましたが、必ずしもそれぞれを再生しませんでした-これは、最初に.mp4拡張子が正しいかどうかを確認せずに盲目的に拡張子を追加したためです。私が前に調べなかったのはこれだけでもあった可能性があります。いずれにせよ、それを処理するように変更しました。

前に述べたように、唯一のterminology特定のビットは最後の機能にplay()あります-そして、あなたはそれを簡単に変更して、ダウンロード/ダウンロードされたビデオファイルであなたが望むことをすることができます- mplayer別の端末のCACA libsでそれを使用する、または、vlcウィンドウなどにポップアウトします。しかし、あなた自身が好きなら、あなたはそれを高解像度で見るでしょうterminology

ああ、そして最後に、これは通常非常に高速です -これまでのすべての試行でこれまでの速度で帯域幅が最大になりましたterminologyが、再生を開始するためにファイル全体を必要としません。

ここで動作しています:

用語のロック


1
/tmp/vid.mp4多分代わりに、を使用する必要mktemp --suffix=.mp4がありますか?
Braiam 14年

@Braiam-それは非常に良い考えですが、その後、おそらくクリーンアップするためにロジックを追加する必要があります。この方法では、少なくともそれ自体が常に上書きされます。ない限り-ファイルは、それを実行するので、私はそれベクトル考慮しない試み何によって読み取られることはありませんterminologySの「gstreamerバックエンドが誤ったぶん...ビデオファイルに実行可能なコードを実行することができます。私はそれを疑いますが、私は確かに言うのに十分ではありません。とにかく、特に断りのない限り、同じファイルに上書きすることを常に好みますが、サイズの選択など、それを改善することに取り組めば、間違いなくそれを修正します。
mikeserv 14年

@ブライアム-それを作り直した-見てください。おそらく専用のtmp dir / mktempが次にあります。
mikeserv 14年

@Ramesh-もう一度見てください。最後のバージョンを使用した場合、これはより優れています。
mikeserv 14年

1
@DmitriDB -問題は、あなたがこれらのエスケープを印刷していないということであるterminologyものがしようとしている-のすべてtmuxptyためにtmux、これらの介入のマスター側所有pty秒とterminologyのマスタ側所有しているtmuxのをpty。あなたは...のように行うことができます処理するにはPTTY=$(tty) tmux ...、その後でtmux...のようなセッションtybg >"$PTTY"。昨日ここにいるのと同じ問題に実際に答えました。上記のスクリプトはytplay ... >"$PTTY"、その方法でマルチプレクサ内で動作するはずです。
mikeserv 14

6

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

これは私が私のマシン上で得るものです:paste.ubuntu.com/8527219
IonicăBizău

1
@IonicăBizău試行:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
マーティン・フォン・

それは働いている@MartinvonWittichが、それは、端末ではなく、別のウィンドウでは、ASCIIビデオではありません...: - /
IonicăBizău

2
誰かがこれを端末でyoutubeビデオを検索してバッチダウンロード用にマークできるプログラムでラップする必要があります。もう一度ラップしてmp3を削除し、mp4を削除します。他の人がいなければ、いつかやるかもしれませんが、数日後にはそうなることはありません。
ミリースミス14年

@IonicăBizăuはmplayer自動的に最適な出力ドライバーを選択します。Xorgを実行している場合は、おそらくxvドライバーを選択します。次のオプションを追加してmplayer、コンソールASCIIアートドライバーを選択してください-vo caca
マーティン・フォン・ウィッティヒ14年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.