6 ポイント 投稿者 GN⁺ 2024-10-28 | 1件のコメント | WhatsAppで共有
  • You-Getは、Webから動画、音声、画像などのメディアコンテンツをダウンロードする小さなコマンドラインユーティリティで、ほかに簡単な方法がないときに使うツール
  • YouTube、Youku、niconico、Tumblr、SoundCloud、Instagram、bilibili、TikTokなど複数のサイトから動画・画像・音声をダウンロードしたり、メディアプレイヤーでオンライン動画をストリーミングしたりできる
  • --infoで利用可能な品質とフォーマットを確認し、--itagで選択できるが、フォーマット選択は対応サイトの大半では一般的には実装されておらず、デフォルトは最高品質
  • インストールはpip、GitHubからのダウンロード・クローン、Homebrew、FreeBSD pkg、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ユーザーはAntigenantigen 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
  • 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動画に字幕がある場合は、動画ファイルとともに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は、ダウンロードの代わりにmpvvlcなどのメディアプレイヤーへ動画を渡す
    • ブラウザをプレイヤーとして指定すると、広告やコメント欄なしでブラウザ上で視聴できる
    • 別のダウンロードマネージャーを起動する用途にも使えるが、うまく合わない場合がある

認証、抽出データ、対応サイト

  • 非公開動画のようにアカウントログインが必要なコンテンツは、--cookiesまたは-cでブラウザCookieを渡す必要がある
    • 現在対応しているCookie形式はMozilla cookies.sqliteとNetscape cookies.txt
  • --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件のコメント

 
GN⁺ 2024-10-28
Hacker News のコメント
  • しばらくの間、インターネットは高価で帯域幅も低かったが、YouTube で音楽や講義を聴くのが好きだった。ある時点で、音声ストリームだけを取得すれば帯域幅コストを90%削減できることに気づいた
    youtube-dlyt-dlp には、要求した形式/品質の URL を出力する -G フラグがあり、PC ではコマンドラインで URL を取得して VLC に入れて使っていた
    携帯電話では最初、SSH で VPS に先にファイルを取得してから、さらにスマホへダウンロードするという複雑な回避策を使っていたが、後でスマホのブラウザが URL を直接再生できると分かり、youtube-dl -G -f bestaudio {url} 用の PHP フロントエンドを作った
    今はオンラインになく、コードも失くしてしまったが、実質的には1行だけのものだった。you-get--url / -u で同じ用途をサポートしているようなので、この機能がどれほど有用かを知らせたかった
    画面を消して再生すれば、バッテリーも80%節約できる。YouTube もそれを分かっているので、音声ストリームだけを取得するバックグラウンド再生を有料機能にしたのだと思う

    • Brave Mobile ブラウザはバックグラウンドで動画の音声再生を有効にできるので、YouTube Premium のようなサブスクリプションが不要になる
    • youtube-dl はもううまく動かないようで、私はフォークである yt-dlp を使わなければならなかった。こうしてプロジェクトを乗り換えるのはいつも不安だが、少なくとも広く使われているようではある
    • 母がオーディオブックを本当に気に入っているので、YouTube リンクを共有すると処理する Telegram ボットnode-red で作ってあげた
      リンクは FIFO に送られ、小さなデーモンが順番にダウンロードして専用の incoming フォルダに保存する。ボットは音声だけを取得することも、動画全体を取得することもできるが、母の Telegram ID では音声だけを取得するようにしている
      このフォルダは Jellyfin が監視しているので、母はダウンロードしたり、そのまま聴いたりできる。2年間でオーディオブックを1TB以上取得していて、とても気に入っている
      デーモンのコード: https://gist.github.com/entropie/d265e94136b9777cc6b3190189b...
    • 低帯域幅の状況では、よく 144p を選ぶ。容量は高品質の音声専用ストリームとほぼ同じだが、45分に一度でも話者を見られる利点がある。バッテリーも同じように節約できる
      144p の映像は、不思議と穏やかで心地よい。きらびやかな色や複雑なディテールに気を散らされず、ただ聴くことに集中できる
    • iOS Safari では、Safari アプリを離れたあと、「再生中」インターフェースで動画の再生ボタンを素早く押すと、YouTube 動画の音声をバックグラウンド再生するように挙動をこじらせることができる
      主に、YouTube Premium があってもバックグラウンド再生されないメンバーシップ限定動画を再生するときに使っている。iOS がアップデートされるたびに、この「グリッチ」を塞がないでくれと祈っている
  • このプロジェクトは、修正 PR なしで Issue だけ報告されることを望んでいないように見える
    「you-get の使用中に見つけた問題を報告するには Pull Request を開く必要があり…」という感じで、こういう方式は以前見たことがない

    • 他の人が言っているように、修正そのものではなく失敗するテストを求めているという意味に見える
      要件は、問題の詳しい説明と、その問題をユニットテストとして扱う少なくとも1つのコミットだ。ここでの “addressing” という語はあまりよくなく、“demonstrating” のほうがよかったと思う
    • 中国語版には、「GitHub Issues の濫用を防ぐため、通常の Issue は受け付けない」と訳せる追加のヘッダーがある。以前の英語文言にはこう書かれていた
      you-get は現在、Issue 処理に対して攻撃的なアプローチを実験中であり、バグ報告は pull request を通じてコードで扱われるべきだ、という内容だ
      https://github.com/soimort/you-get/commit/75b44b83826b3c2d9a...
      おそらくスパムが多すぎたのだと思う。ちなみに tests/test.py は複数のウェブサイトに対して抽出器を直接実行しているように見え、ネットワークリクエストとレスポンスをどこでモックしているのかは見つけられなかった。PR を作る人にとって手順を簡単にしようという意図なのかもしれない
    • 問題が解決したかどうかを示せるテスト付きの PRを提出せよ、という意味に見える
    • 人々にテストや完全な修正まで試みるよう促す発想は興味深いが、それだけを受け付けるというのは少しやりすぎに見える。ただし私が you-get をメンテナンスしているわけではないので、彼らがどんな目に遭っているのかは分からない
      コマンドラインプログラムをまともに実行できない人たちが繰り返し投稿する Issue の洪水をフィルタする効果的な方法なのかもしれない
    • 失敗するテストを書くのは比較的簡単で、Issue のトリアージにかかる作業を大きく減らしてくれる。GitHub Issues がサポートフォーラムに変わってしまうリスクも下がる
      これによってプロジェクトのメンテナンスが楽になり、より長く維持されるなら、よいことだと思う
  • タイトルと説明の冒頭だけを見て、ページから何でも拾い出そうとするヒューリスティックベースのツールだと思った。特定サイト対応ツールがないとき、つまり多くの場合は「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 が出た
    年齢制限を回避できるか見ようとしたのだが、年齢制限のない動画でも同じエラーが出た

    • Python のバージョンを確認してみるとよい
      Pyenv のようなツールで最新の Python に切り替えるか、docker run -it -v $(pwd):/mnt python:3.13 bash のように Docker イメージを起動して、その中でユーティリティを試せばよい
  • これが yt-dlp より優れている理由を説明してもらえる?

    • 興味深い質問だ。依存関係はライブラリ1つだけだが、実際にどれだけのコードが自前で書かれているのかは気になる
      たとえば専用の mp4 結合ツールがあるのが不思議だった。すでに ffmpeg があるなら、自前でそれ以上にうまく作る方法はほとんどないはずなのに
      https://github.com/soimort/you-get/blob/develop/src/you_get/...
    • yt-dlp より優れているとどう推論したのか気になる。Google が常に妨害しようとしてくる領域では、選択肢は多いほどよいと思う
  • サイト別の抽出器と変換器ライブラリを備えた ytdl スタイルのメディアダウンローダーを、正確に「間抜けな」ツールと呼ぶのは難しいが、ytdl のようなプロジェクトがさらに増えるのはやはり良いことだ

  • 対応サイト一覧に Bandcamp がある理由がよく分からない。Bandcamp はアーティストに先にお金を払えば、ファイルをそのままダウンロードできるようにしてくれる
    このツールで取得できるのは、アーティストが購入前に無料で試聴できるよう許可しているからだ。このツールでダウンロードするのはまったく不要で、少し失礼な行為に見える。Bandcamp には主に小規模なインディーアーティストやレーベルがいる

    • 対応サイト一覧は、道徳的な理由でこのツールをどこに使うべきかを宣言しているものではない。単にこのツールが動作する人気サイト一覧にすぎない
    • 購読したり購入したりした後でも、このツールは使えると思う。人々はすでにお金を払ったコンテンツでも、それぞれ異なる閉鎖的エコシステムのアプリ5つにログインする手間を減らすために、こうした自動化ツールでダウンロードする
    • 誰もが 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 だけでなく他のプラットフォームにも適用できる