How GolinksPRO Download Manager's pieces fit together.
クレート
| パス | クレート | 役割 |
|---|---|---|
crates/engine |
mdm-engine |
HTTP(S)またはFTP(S)経由で1つのファイルをダウンロード: プローブ、セグメントプランナー、接続ワーカー、レジューム状態、ホストごとの制限、速度制限、チェックサム、プロキシスクリプト |
crates/app |
mdm-app |
デスクトップアプリ (misterdownloadmanager.exe、egui): リスト、カテゴリ、キュー、スケジューラ、ダイアログ、トレイ、設定 |
crates/cli |
mdm-cli |
進捗状況 (get、resume) を表示するヘッドレスダウンロード、動画、トレント、自動化 API のコマンド: アプリのプログラムが実行するライブラリ (misterdownloadmanager --cli …) と、同じ引数、ターミナル、終了コードでそのプログラムを起動する小さなランチャー (misterdownloadmanager-cli) |
crates/mcp |
mdm-mcp |
MCP サーバー (misterdownloadmanager-mcp): AI アシスタントが自動化 API を通じて、実行中のアプリのダウンロードを一覧表示、追加、操作します |
crates/remote |
mdm-remote |
リモート コントロール (#141): ローカル ネットワーク上のペアリングされた電話またはコンピューターが使用するHTTPSサーバー(そのページ、ペアリング コード、デバイス トークン、自己署名証明書)。すべてのリクエストは、アプリが応答する自動化APIコマンドになります。 |
crates/nmhost |
mdm-nmhost |
ブラウザのネイティブメッセージングホスト: 拡張機能からキャプチャされたダウンロードを受け取り、アプリに渡す |
crates/ipc |
mdm-ipc |
シングルインスタンスチャネル (トークンで保護されたローカルソケット)、データフォルダ、アプリとホストで共有されるキャプチャルール |
crates/debrid |
mdm-debrid |
デブリッド アカウント (#44): サービス (Real-Debrid、AllDebrid、Premiumize) の公式 API が、ファイル ホストのリンクをエンジンがダウンロードする直接リンクに変換します。 |
crates/extract |
mdm-extract |
アーカイブの展開 (#37): zip、tar、gz、xz は処理中。7z と RAR はインストール済みの 7-Zip を別のプログラムとして実行して処理します。 |
crates/geo |
mdm-geo |
ダウンロード サーバーの場所 (#140): DB-IP の Lite データ (tools/geo/build.py) から構築された IP-国範囲テーブルをこのコンピューターでのみ検索し、国の旗を表示します。 |
crates/tools |
mdm-tools |
Video pages through yt-dlp and ffmpeg, image galleries through gallery-dl (run as separate programs); while a network adapter is chosen, their connections go through a proxy of GDM's on 127.0.0.1 that binds them to it (relay.rs) |
crates/crash |
mdm-crash |
クラッシュおよびフリーズレポート: モニタープロセス、プロセス外ミニダンプ、シンボル化されたスタック、レポートテキスト、リリースログ (crash-reports.md) |
crates/torrent |
mdm-torrent |
librqbitによるBitTorrentおよびマグネットリンク |
crates/labserver |
mdm-labserver |
リクエストログと障害注入機能を備えたHTTP Rangeサーバー、および独自の障害を備えたFTP/FTPSサーバー (テストおよびベンチマーク用) |
extension/ |
— | Chromium (MV3) およびFirefox拡張機能 |
docs/ |
— | ユーザーガイドとチュートリアル、このファイル、ベンチマークデータ。ウェブサイトはガイドをヘルプページとしており、ヘルプで開きます |
website/ |
— | misterdownloadmanager.com のページ (ホーム、ダウンロード、機能、テーマ、FAQ)。tools/website/build.py が docs/ のヘルプと CHANGELOG のニュースを 22 言語で追加し、GitHub Pages が公開します。 |
依存関係は内側を指します。app、cli、mcp、nmhost、remote は engine と ipc を使用します。エンジンはUIについて何も知りません。アプリは、イベント(進行状況、セグメント テーブルのスナップショット、完了、失敗)を通じてのみエンジンを認識します。
エンジン
Download
├─ probe() size, resumable?, validators (ETag / Last-Modified), file name
├─ Planner (pure) segment table: when a connection is free, the largest remaining
│ part is split in half (planner.rs, tested by random simulation)
├─ Worker × N one HTTP/1.1 connection each, reused across segments; slow ones
│ are dropped and their part re-split
│ └─ writes at its offset into <name>.mdm.part (created sparse)
├─ HostLimits learns how many connections each server accepts
├─ Limiter (shared) per-download and global token buckets
├─ State segment table saved atomically (craft-atomic) for crash-safe resume
└─ events → channel Progress, Done, Failed
すべてのセグメントが完了すると、部分ファイルは期待されるサイズと照合され、所定の場所に名前が変更されます。ファイルの作成日はサーバーの作成日に従うことができます。
ダウンロードの最初のリクエスト (get) は、リダイレクトや、ファイルに直接つながるページ (待機ページの更新) に従います。リンクがファイルの直接のアドレスではないサイトには、sites/ にモジュールがあります (Google Drive: sites/gdrive.rs)。これはリンクをファイルのアドレスに変換し、サイト自身のページ (確認フォーム、エラーページ) を読み取り、拒否理由に名前を付けます (Error::Refused)。これらはネットワークなしでテストされた純粋な関数です。ラボサーバーは、エンドツーエンドテスト (labserver/src/drive.rs) のために、実際のホスト名でそのようなサイトをシミュレートします。
FTP と FTPS (ftp.rs) は、同じプランナー、ワーカー、状態管理を使用します。セグメントは、範囲指定した GET の代わりに制御セッション上で REST + RETR を使用し、SIZE と MDTM がヘッダーの役割を果たします。セッションはダウンロードごとにプールされ、セグメント間で再利用されます。
アプリ
egui ウィンドウは固定ピクセル座標に描画され、ダイアログごとに即時ビューポートが 1 つあります。app.rs は状態 (ダウンロード、キュー、設定、リストの選択) を保持し、メニュー、ツールバー、キー、IPC コマンドをアクションに変換します。各ダイアログは独自のモジュールであり、Outcome (開いている、閉じている、値で完了) を返します。Windows 専用の呼び出しは win32.rs に限定され、Linux および macOS の対応する呼び出しは unix.rs に限定されます (セッションの開始、ブラウザのホスト、サウンド、フォルダーで表示、クラッシュ ハンドラー)。その他のファイルはすべて安全でポータブルな Rust です。フォントはシステムから取得されます: Windows の Fonts フォルダー、macOS のシステム フォント、Linux の fontconfig (theme.rs)。Windows では、ラテン文字、ギリシャ文字、キリル文字は GDI-classic モードの DirectWrite (win32.rs、egui のグリフ ラスタライザー フック経由) で描画されるため、各文字のヒント付き形状と全ピクセル幅が結合されます。その他のスクリプトは egui によって整形および描画されます。
テーマ
コントロールの描画に使用されるすべての色とサイズは、アクティブなテーマ (#45) から取得されます。テーマは、ライトとダークのパレット、メトリック、コントロール スタイル、アイコン スタイル (palette.rs) で構成されます。
- パレットの役割。
palette.rsは、安定したキー ("button.hot"、"list.row"、"caption"…)、説明、クラシックな外観のライトとダークの値を明示的に記述して、各役割を宣言します (クラシックな外観は派生しません)。共有ペインター (winui.rs、chrome.rs、list.rs、scrollbar.rs) はtheme::colors()とtheme::metrics()を介してそれらを読み取り、各コントロールの状態を決定します。描画コードは独自の色を保持しません。 - 派生パレット。
derive.rsは、いくつかのシード (背景、表面、テキスト、アクセントなど) から完全なパレットを作成し、OKLab で他のすべての役割を混合し、WCAG コントラスト (テキストは 4.5:1、エッジは 3:1) を維持します。ハイ コントラストは、すべてのエッジをさらに強調します。native.rsは、システムのアクセントとコントラスト (Windows の設定、Linux の freedesktop ポータル、macOS のアクセント) からネイティブ テーマをシードします。 - Control styles.
palette::Controlsnames each control's shape (text boxes, check boxes, buttons, progress bars, scroll bars, the focus mark, the title bar); the style themes (Metro, Adwaita, Breeze, Luna, Aero, Aqua) pick theirs, and on Windows GDM then draws the title bar itself (thecaption.*roles). - テーマ ファイル。
themefile.rsは、データ フォルダーのthemesから TOML または JSON を読み取ります (1 つのファイル、またはアイコンが隣接する<id>/theme.toml)。ファイルは変更する内容のみに名前を付けます。残りはinheritsするテーマ (組み込みの ID または別のファイル、デフォルトではクラシックな外観) から取得され、サイクルが拒否されるチェーンをたどります。不明なキーはエラーではなく警告です。組み込みのスタイル テーマも、プログラムに含まれるそのようなファイルです (crates/app/assets/themes)。 - アイコン セット。
themeicons.rsは、クラシックな外観が独自のアイコンを描画する場所に、テーマのアイコン (用途別に名前が付けられています:tb-add-url、cat-music…、16、24、32、48 px の SVG または PNG、テキストの色でインク付けされた-symbolic) を描画します。セットに不足している要件はクラシック アイコンを保持します。
ウィンドウがコントロールを配置する場所はレイアウトのままです。ファイル名の前のアイコン (fileicons.rs) も同様です。Windows シェルのシステム イメージ リスト、macOS Finder (NSWorkspace)、Linux デスクトップのアイコン テーマ (xdgicons.rs、shared-mime-info、Icon Theme Specification)。各タイプは、ピクセル サイズごとに 1 回、バックグラウンド スレッドで検索されます。Tango のアイコン (バンドルされています) は、システムのアイコンが準備できるまで、またシステムにアイコンがない場所では常に表示されます。
描画
The windows are drawn with OpenGL (eframe's glow) or with the system's own graphics API through
eframe's wgpu, with that one backend only: Direct3D 12 on Windows (the default there), Vulkan on
Linux, Metal on macOS (choices there; OpenGL stays their default until real graphics cards have
tried them, #206). View → Draw with picks one, from the next start. One code path does it on
every system (crates/app/src/renderer.rs): when the chosen one can't start, the other one is
tried, so the windows always open. A watched start with the system's API leaves a marker until
its first frame is drawn: a start that ends before it (a crash inside the driver), one whose
first frame doesn't come within 10 seconds (GDM then starts again with OpenGL), or a graphics
card lost twice in 10 minutes is remembered with its reason, which the menu shows.
表示 → インターフェイスのサイズ (scale.rs、#262) は、ディスプレイ自体のスケールに対する egui のズーム係数です。すべてのウィンドウはポイントでレイアウトされるため、その分だけ大きく開きます。画面より大きい場合はスクロールします。
データ
ダウンロード リストと設定は、データ フォルダー (downloads.json) にアトミックに保存されます。Windows では %APPDATA%\misterdownloadmanager\、Linux では ~/.local/share/misterdownloadmanager、macOS では ~/Library/Application Support/misterdownloadmanager、ポータブル コピーの横にある data フォルダー、または MDM_DATA_DIR (mdm_ipc::data_dir) です。ブラウザー ホストはキャプチャ ルールに同じファイルを読み取るため、オプションでの変更は次回のキャプチャされたダウンロードに適用されます。
Sign-in secrets (debrid accounts, Sites Logins' and the proxy's passwords) live in the system's
keychain (secrets.rs, #44): Windows Credential Manager (win32.rs), the Secret Service on Linux
or the macOS keychain (unix.rs). The settings keep a keychain:<service>/<scope>/<key>
reference in their place, written only once the keychain has confirmed the secret; without a
keychain (or with a locked one, never unlocked for GDM) the secret stays in the settings as
before.
ダウンロードのサーバーの場所 (#140) は、接続したアドレスの国であり、このコンピューターの mdm-geo のテーブルで検索されます (インターフェイス言語では countries.rs と表示されます)。リリース ジョブは、その月のデータからテーブルを再構築します (tools/geo/build.py --release)。
ブラウザ連携
page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app
拡張機能は、ホストにどのファイル タイプを受け入れるかを尋ね、それらに対して各ダウンロードをチェックし、アプリがそれを受け入れた後にのみブラウザーのダウンロードをキャンセルします。そうでない場合、ブラウザーはそれを保持し、拡張機能はその理由を伝えます。
The host serves only GDM's own extension. Its IDs are in one place, mdm_ipc::extension
(crates/ipc/src/extension.rs): the unpacked copy's (UNPACKED_ID, from the manifest's public
key), the Chrome Web Store's (STORE_ID, signed with the store's own key: pack.ps1 leaves the
manifest's key out of the store's copy), the Firefox add-on's (FIREFOX_ID) and its
addons.mozilla.org page; the Edge and Opera stores' are placeholders, never served, until the
extension is listed there. The host writes each browser's manifest with those IDs, and the app
offers the store's copy (Add to Chrome, Add to Firefox) before the unpacked one.
リモート コントロール
phone ──HTTPS (paired token)──► mdm-remote ──ipc::Sink──► app (answer, remote_add)
--headless(headless.rs、#157) は、eframe なしで同じ App を実行します。ループは、コマンド チャネルによって起動されるベア egui::Context でその tick (すべてのフレームで logic が実行するもの) を呼び出し、その ui は呼び出しません。コマンドはリモート コントロールが追加するのと同じように追加されます (ウィンドウなし)。Dockerfile と docker/ (Compose、Unraid のテンプレート) は、サーバー (server.md) でそれを実行します。
サーバーはアプリのTokioランタイム上で実行され、ローカル ネットワーク アドレスごとに1つのリスナーがあります。各リクエストはチェックされ(Host、Origin、トークン)、remote とマークされた mdm_ipc::Command(リクエスト行で設定できないフィールド)に変換され、コマンド ラインと同じチャネルを通じてアプリに渡されます。アプリは、自動化APIに回答するのと同じように、次のフレームでそれに回答します。そのページは crates/remote/web で構築され、そのテキストはアプリのカタログ(remote.rs)から取得されます。
翻訳
UI が表示するすべてのテキストは crate::i18n (craft-i18n カタログ、i18n/<locale>.tsv) を通過します。tools/i18n/extract.py は、ソースから i18n/en.tsv を再構築し、各テキストに翻訳者向けのメモ (内容、表示場所、プレースホルダー) を付けます。tools/i18n/translate.py は、各言語のスタイル ガイド (i18n/style/) と用語集に従って、他のカタログに不足しているもの (行は #, machine とマークされています) を埋めます。人がレビューした行は決して置き換えられず、CI (reviewed_guard.py) は、その行を削除する変更を失敗させます。ウェブサイトには独自のカタログがあります (i18n/site/、tools/website/translate_site.py)。
画像
The help pages' pictures (docs/images/help/) come from one list, tools/shots/shots.toml:
tools/shots/make.py opens each window through GDM's own /show <window> command line in a test
instance off the screen, crops and annotates it from the window's accessibility tree, and writes
lossless WebP; make.py check (CI) keeps the list, the pages and the files in step. The
published ones are taken on GitHub's Windows runner (docs-shots.yml).
協力者
tools/contributors.pyGitHub の公開 API から、プルリクエストやイシューをオープンしたユーザー、コメントしたユーザーを読み込みます (メンテナー、Claude、ボットは除外)。これは、ウェブサイトのホーム ページ、/contributors.html、ニュース ページの各リリース (build.py、すべてのビルド)、各リリースのノート (release.yml、前回のリリース以降に活動したユーザー)、および README (python tools/contributors.py readme、各リリースの準備時。GitHub では README 内の画像を丸くできないため、丸い写真は art/contributors/ にコミットされています) など、貢献者に感謝するすべての場所で使用されます。
テストとベンチマーク
cargo testmdm-labserverを対象に、接続が遅い場合や、切断・拒否される場合、範囲リクエストに対応していないサーバー、変更されるファイルなどの障害を注入して、単体テストとエンドツーエンドのダウンロードテストを実行します。tools/benchは公開されている速度比較を実行します。生データはdocs/bench/にあります。
無料、オープンソース、広告なし、試用期間なし。
Download GolinksPRO Download Manager