作品 · 03
OmniDL · 万能ダウンローダー
汎用メディア取得エンジン —— どんなリンクを貼っても自動識別、1000 以上のサイトから画像・動画を一括ダウンロード。Android 上でローカル実行 ・ 完全オフライン ・ サーバー不要。Kotlin + Python + yt-dlp 駆動。
なぜ作ったか
きっかけはとても具体的な不満でした。画像を 1 枚保存するためにアプリを入れ、動画を保存するために別のアプリを入れ、特定サイトの透かし入りのためにさらに 3 つ目のツールを探す。ダウンロードという行為がサイトごとに細切れであるべきではない——それはエンジン 1 つとシェル 1 枚で済むはずのことです。
yt-dlp は「1 つのエンジンでウェブ全体を食べる」ことが可能だと証明していましたが、コマンドラインツールです。私がやったのは、このエンジンをポケットに入れること:Android 上でローカル実行し、いかなるサーバーも経由しない。
アーキテクチャの選択
- Kotlin のシェル + Python のエンジン:UI とタスク管理は Kotlin ネイティブで実装。解析とダウンロードのコアは yt-dlp(Python)をそのまま再利用。両者はプロセスブリッジで通信し、それぞれ得意なことを担当します。
- 完全オフライン:すべての解析はローカルで完結し、リンクはサードパーティサーバーを通りません。これはプライバシーへの約束であると同時に、運用コストゼローープロジェクトは何年も静かに生き続けられます。
- バッチキュー:ダウンロードは単発のアクションではなく流水線。ページ全体の画像一括取得、レジューム転送に対応。
難しいところ
最大の課題は Python ランタイムの Android 移植でした。機種ごとに ABI、ストレージ権限、バックグラウンド生存戦略の流儀が違う。最終的な答えは、Python 環境を自己診断できるリソースパックとして梱包し、起動時に項目ごとに健康診断を行い、足りないものを補う——主プログラムに if-else を積むのではなく。
現状
- 1000 以上のサイトの解析対応(yt-dlp アップストリームに追従)
- 画像のページ全体取得 + 動画のワンタップダウンロード、キューで一元管理
- 完全オフラインで、自分の日常のダウンロードを 2 年間支え続けている