You-get: Webをスクレイピングするシンプルなダウンローダー
(github.com/soimort)- You-Getは、Webから動画、音声、画像などのメディアコンテンツをダウンロードする小さなコマンドラインユーティリティで、ほかに簡単な方法がないときに使うツール
- YouTube、Youku、niconico、Tumblr、SoundCloud、Instagram、bilibili、TikTokなど複数のサイトから動画・画像・音声をダウンロードしたり、メディアプレイヤーでオンライン動画をストリーミングしたりできる
--infoで利用可能な品質とフォーマットを確認し、--itagで選択できるが、フォーマット選択は対応サイトの大半では一般的には実装されておらず、デフォルトは最高品質- インストールは
pip、GitHubからのダウンロード・クローン、Homebrew、FreeBSDpkg、Floxなどで可能で、推奨依存関係はPython 3.7.4以上、FFmpeg 1.0以上、任意でRTMPDump - 直接URLダウンロード、Webページのスクレイピング、Google Videos検索ベースのダウンロード、一時停止・再開、プロキシ、Cookieの読み込み、抽出URL・JSON出力まで提供するが、一部機能は実験的または安定化されていない
You-Getができること
- You-Getは、Webからメディアコンテンツをダウンロードする小さなコマンドラインユーティリティ
- 対象コンテンツは動画、音声、画像
- Web上でほかに簡単なダウンロード方法がないときに使う用途
- 利用理由として、個人的に楽しむためのダウンロード、保存が制限されたオンライン動画の制御、クローズドな技術や独占的なJavaScript・Flashの回避、ハッカー文化と自由ソフトウェア志向が挙げられている
- 主な機能は次のとおり
- YouTube、Youku、Niconicoなど人気サイトの動画・音声ダウンロード
- Webブラウザなしでメディアプレイヤーからオンライン動画をストリーミング
- Webページをスクレイピングして関心のある画像をダウンロード
- バイナリファイルなど任意の非HTMLコンテンツのダウンロード
インストールと実行環境
- 推奨依存関係はPython 3.7.4以上、FFmpeg 1.0以上、任意でRTMPDump
- 2022年5月30日の告知によると、Python 3.5、3.6、3.7のサポートはいずれ終了予定
- インストール方法は複数ある
- PyPIから
pip install you-get - ZshユーザーはAntigenで
antigen bundle soimort/you-get - GitHubの
master安定ブランチまたはdevelopブランチをダウンロード - 開発者に推奨される
git clone git://github.com/soimort/you-get.git - macOSは
brew install you-get - FreeBSDは
pkg install you-get - Mac、Linux、Windows WSLは
flox install you-get
- PyPIから
- Bash、Fish、Zsh向けのシェル補完定義は
contrib/completionにある - アップグレードはインストール方法に応じて、
pip install --upgrade you-get、最新リリースのダウンロード、またはdevelopブランチの強制再インストールで可能
基本的なダウンロードの流れ
- 動画を取得するときは、
you-get -i URLまたは--infoで利用可能な品質とフォーマットを先に確認できる- 出力にはサイト、タイトル、ストリーム、コンテナ、品質、サイズ、ダウンロードに使う
--itagの例が含まれる - デフォルトのダウンロードは一覧の最上位項目を使用する
- 出力にはサイト、タイトル、ストリーム、コンテナ、品質、サイズ、ダウンロードに使う
- 別のフォーマットを希望する場合は、出力に表示された
--itag値を使う- 例として、YouTubeの
Me at the zoo動画では--itag=18でmp4を選択できる
- 例として、YouTubeの
- YouTube動画に字幕がある場合は、動画ファイルとともにSubRip字幕形式でダウンロードする
- フォーマット選択は、まだ対応サイトの大半で一般機能として実装されていない
- この場合、デフォルトのダウンロードフォーマットは最高品質
- FFmpegは、複数の断片としてストリーミングされる動画のダウンロード・結合と、YouTubeの1080p以上の高解像度動画に必要
- ダウンロード後に断片を結合したくない場合は、
--no-mergeまたは-nを使う
- ダウンロード後に断片を結合したくない場合は、
URL、Webページ、検索ベースのダウンロード
- 正確なリソースURLがある場合は、
you-get URLで直接ダウンロードできる- 例としてJPEG画像URLを入力すると、サイト、タイトル、タイプ、サイズを表示してファイルを保存する
- 正確なリソースURLではなくWebページURLを渡すと、ページをスクレイピングして関心のある項目を探そうとする
- この機能は実験的であり、完全ではない
- Tumblr、Bloggerのような人気サイトで大きな画像をスクレイピングする場合に最もよく動作する
- インターネット上のすべてのサイトに適用できる普遍的なパターンはない
- URLではない文字列を渡すと、Google Videosで検索し、最も関連性の高い動画をダウンロードする
- 望んだものと正確に同じではない可能性はあるが、かなりそれらしい結果である可能性が高いとされている
ダウンロード制御と実行オプション
- ダウンロード中に
Ctrl+Cで中断でき、出力ディレクトリに一時.downloadファイルが残る- 同じ引数で再実行すると、最後のセッションから再開する
- 一時拡張子が消えた完全なファイルがある場合は、ダウンロードをスキップする
--forceまたは-fは強制的に再ダウンロードし、同名の既存ファイルや一時ファイルを上書きする
--output-dirまたは-oで保存先を指定し、--output-filenameまたは-Oでファイル名を指定できる- デフォルトの動画タイトルに、現在のシェル、OS、ファイルシステムと相性の悪い特殊文字が含まれる場合に有用
- バッチダウンロードスクリプトで指定フォルダと指定名に保存するときにも有用
--http-proxyまたは-xでHTTPプロキシを指定できる- デフォルトではシステムのプロキシ設定である
http_proxy環境変数が適用される - プロキシを無効にするには
--no-proxyを使う - Youkuのような一部サイトで、中国本土からのみアクセス可能な動画情報を抽出するときは
--extractor-proxyまたは-yを使える
- デフォルトではシステムのプロキシ設定である
--playerまたは-pは、ダウンロードの代わりにmpv、vlcなどのメディアプレイヤーへ動画を渡す- ブラウザをプレイヤーとして指定すると、広告やコメント欄なしでブラウザ上で視聴できる
- 別のダウンロードマネージャーを起動する用途にも使えるが、うまく合わない場合がある
認証、抽出データ、対応サイト
- 非公開動画のようにアカウントログインが必要なコンテンツは、
--cookiesまたは-cでブラウザCookieを渡す必要がある- 現在対応しているCookie形式はMozilla
cookies.sqliteとNetscapecookies.txt
- 現在対応しているCookie形式はMozilla
--urlまたは-uは、ページから抽出したダウンロード可能なリソースURLの一覧を出力する--jsonは抽出データの要約をJSON形式で出力する- この機能はまだ安定化されておらず、JSONスキーマは将来的に破壊的変更が入る可能性がある
- 対応サイト一覧には、YouTube、X(Twitter)、VK、Vimeo、Tumblr、SoundCloud、Pinterest、Internet Archive、Instagram、Facebook、Dailymotion、Bandcamp、niconico、bilibili、Youku、Naver、TikTok、Zhihuなどが含まれる
- サイトごとに動画、画像、音声の対応状況が異なる
- 一覧にないサイトは汎用抽出器がページから関心のあるリソースを探してダウンロードする
問題報告とライセンス
- 目的のコンテンツを取得できないときは、まずKnown Bugsを確認する
- 新しい問題報告やコントリビューションの前には、コントリビューションガイドラインを読む必要がある
- 簡単な質問はGitterチャンネル#soimort/you-getでできる
- ソフトウェアはMIT licenseで配布される
- ソフトウェアは保証なしで「現状のまま」提供される
- 著作権侵害やその他の違法目的での利用について、作者は責任を負わない
- リポジトリはコードのみを提供し、使い方はユーザーの裁量に委ねられる
1件のコメント
Hacker News のコメント
しばらくの間、インターネットは高価で帯域幅も低かったが、YouTube で音楽や講義を聴くのが好きだった。ある時点で、音声ストリームだけを取得すれば帯域幅コストを90%削減できることに気づいた
youtube-dlとyt-dlpには、要求した形式/品質の URL を出力する-Gフラグがあり、PC ではコマンドラインで URL を取得して VLC に入れて使っていた携帯電話では最初、SSH で VPS に先にファイルを取得してから、さらにスマホへダウンロードするという複雑な回避策を使っていたが、後でスマホのブラウザが URL を直接再生できると分かり、
youtube-dl -G -f bestaudio {url}用の PHP フロントエンドを作った今はオンラインになく、コードも失くしてしまったが、実質的には1行だけのものだった。
you-getも--url/-uで同じ用途をサポートしているようなので、この機能がどれほど有用かを知らせたかった画面を消して再生すれば、バッテリーも80%節約できる。YouTube もそれを分かっているので、音声ストリームだけを取得するバックグラウンド再生を有料機能にしたのだと思う
youtube-dlはもううまく動かないようで、私はフォークである yt-dlp を使わなければならなかった。こうしてプロジェクトを乗り換えるのはいつも不安だが、少なくとも広く使われているようではあるnode-redで作ってあげたリンクは FIFO に送られ、小さなデーモンが順番にダウンロードして専用の incoming フォルダに保存する。ボットは音声だけを取得することも、動画全体を取得することもできるが、母の Telegram ID では音声だけを取得するようにしている
このフォルダは Jellyfin が監視しているので、母はダウンロードしたり、そのまま聴いたりできる。2年間でオーディオブックを1TB以上取得していて、とても気に入っている
デーモンのコード: https://gist.github.com/entropie/d265e94136b9777cc6b3190189b...
144p の映像は、不思議と穏やかで心地よい。きらびやかな色や複雑なディテールに気を散らされず、ただ聴くことに集中できる
主に、YouTube Premium があってもバックグラウンド再生されないメンバーシップ限定動画を再生するときに使っている。iOS がアップデートされるたびに、この「グリッチ」を塞がないでくれと祈っている
このプロジェクトは、修正 PR なしで Issue だけ報告されることを望んでいないように見える
「you-get の使用中に見つけた問題を報告するには Pull Request を開く必要があり…」という感じで、こういう方式は以前見たことがない
要件は、問題の詳しい説明と、その問題をユニットテストとして扱う少なくとも1つのコミットだ。ここでの “addressing” という語はあまりよくなく、“demonstrating” のほうがよかったと思う
you-getは現在、Issue 処理に対して攻撃的なアプローチを実験中であり、バグ報告は pull request を通じてコードで扱われるべきだ、という内容だhttps://github.com/soimort/you-get/commit/75b44b83826b3c2d9a...
おそらくスパムが多すぎたのだと思う。ちなみに
tests/test.pyは複数のウェブサイトに対して抽出器を直接実行しているように見え、ネットワークリクエストとレスポンスをどこでモックしているのかは見つけられなかった。PR を作る人にとって手順を簡単にしようという意図なのかもしれないyou-getをメンテナンスしているわけではないので、彼らがどんな目に遭っているのかは分からないコマンドラインプログラムをまともに実行できない人たちが繰り返し投稿する Issue の洪水をフィルタする効果的な方法なのかもしれない
これによってプロジェクトのメンテナンスが楽になり、より長く維持されるなら、よいことだと思う
タイトルと説明の冒頭だけを見て、ページから何でも拾い出そうとするヒューリスティックベースのツールだと思った。特定サイト対応ツールがないとき、つまり多くの場合は「yt-dlp が対応していないとき」に役立つ、そういうツールのことだ
ところが実際には、ある程度人気のあるソースごとに別個の抽出器がある、抽出器ベースの構造だった。結局、より単純な yt-dlp のクローンに近いのではないかと思う
このエラーが出続ける人がいるのか気になる
you-get: [error] oops, something went wrong.で始まり、ネットワーク問題の確認、最新版の確認、既知のバグの確認、--debugオプションの実行を案内してくるデバッグフラグを使ってもあまり役に立たず、
pattern = str(pattern, 'latin1')でTypeError: decoding to str: need a bytes-like object, NoneType foundが出た年齢制限を回避できるか見ようとしたのだが、年齢制限のない動画でも同じエラーが出た
Pyenv のようなツールで最新の Python に切り替えるか、
docker run -it -v $(pwd):/mnt python:3.13 bashのように Docker イメージを起動して、その中でユーティリティを試せばよいこれが yt-dlp より優れている理由を説明してもらえる?
たとえば専用の mp4 結合ツールがあるのが不思議だった。すでに ffmpeg があるなら、自前でそれ以上にうまく作る方法はほとんどないはずなのに
https://github.com/soimort/you-get/blob/develop/src/you_get/...
サイト別の抽出器と変換器ライブラリを備えた ytdl スタイルのメディアダウンローダーを、正確に「間抜けな」ツールと呼ぶのは難しいが、ytdl のようなプロジェクトがさらに増えるのはやはり良いことだ
対応サイト一覧に Bandcamp がある理由がよく分からない。Bandcamp はアーティストに先にお金を払えば、ファイルをそのままダウンロードできるようにしてくれる
このツールで取得できるのは、アーティストが購入前に無料で試聴できるよう許可しているからだ。このツールでダウンロードするのはまったく不要で、少し失礼な行為に見える。Bandcamp には主に小規模なインディーアーティストやレーベルがいる
個人的にも、不安定または遅いネットワークや高額な通信会社のせいで、メディアをオフラインで消費したい、あるいはそうせざるを得ないことがある。だからといって、気に入ったら後でお金を払わないという意味ではない
よくできていると思う。ただ消費者の立場では、yt-dlp の代わりに
you-getを使うべき理由が何なのか気になる膨大なサイトでかなりうまく動作する yt-dlp と比べて、どんな強みがあるのか?
[1] https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites....
ドキュメントに「Google Videos で検索してダウンロード:
$ you-get "Richard Stallman eats"」と書かれているドキュメントはあまり頻繁には読まないのだが、今回は読んでみたら、ちょっと気持ち悪いイースターエッグを見つけてしまった
気に入った。Chrome/Firefox 用の連携拡張があって、
you-getをバックエンドとして使い、スムーズに実装されていたらいいのにと想像するさらに進めると、YouTube にアクセスしたときに YouTube プレイヤーを迂回し、広告なしでコンテンツを直接再生する
you-get拡張も考えられる。YouTube だけでなく他のプラットフォームにも適用できるhttps://addons.mozilla.org/en-US/firefox/addon/faststream/?u...