Mister Download Manager 各部分如何协同工作。
Crates
| 路径 | Crate | 作用 |
|---|---|---|
crates/engine |
mdm-engine |
通过 HTTP(S) 或 FTP(S) 下载单个文件:探测、分段规划器、连接工作器、恢复状态、每主机限制、速度限制器、校验和、代理脚本 |
crates/app |
mdm-app |
桌面应用(misterdownloadmanager.exe,egui):列表、类别、队列、调度器、对话框、托盘、设置 |
crates/cli |
mdm-cli |
无界面下载,带进度(get,resume) |
crates/mcp |
mdm-mcp |
MCP 服务器(misterdownloadmanager-mcp):AI 助手通过自动化 API 列出、添加和控制正在运行的应用的下载 |
crates/nmhost |
mdm-nmhost |
浏览器的原生消息主机:从扩展程序获取捕获的下载并将其交给应用 |
crates/ipc |
mdm-ipc |
应用和主机共享的单实例通道(受令牌保护的本地套接字)、数据文件夹和捕获规则 |
crates/tools |
mdm-tools |
通过 yt-dlp 和 ffmpeg 处理视频页面(作为单独程序运行) |
crates/crash |
mdm-crash |
崩溃和冻结报告:监视进程、进程外 minidumps、符号化堆栈、报告文本和发布日志(crash-reports.md) |
crates/torrent |
mdm-torrent |
通过 librqbit 处理 BitTorrent 和磁力链接 |
crates/labserver |
mdm-labserver |
一个带请求日志和故障注入的 HTTP Range 服务器,以及一个带自身故障的 FTP/FTPS 服务器,用于测试和基准测试 |
extension/ |
— | Chromium (MV3) 和 Firefox 扩展程序 |
docs/ |
— | 用户指南和教程(“帮助”打开它们)、此文件、基准数据 |
website/ |
— | 未来网站的页面(尚未发布) |
依赖关系指向内部:app、cli、mcp 和 nmhost 使用 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
当所有分段完成后,部分文件会根据预期大小进行检查并重命名到位;文件的日期可以跟随服务器的日期。
FTP 和 FTPS(ftp.rs)通过相同的规划器、工作器和状态:一个分段是控制会话上的 REST + RETR,而不是范围 GET,SIZE 和 MDTM 代表头部,会话按下载进行池化并在分段之间重用。
应用
一个绘制到固定像素坐标的 egui 窗口,加上每个对话框一个即时视口。app.rs 保存状态(下载、队列、设置、列表选择)并将菜单、工具栏、按键和 IPC 命令转换为操作。每个对话框都是自己的模块,并返回一个 Outcome(打开、关闭、带值完成)。仅限 Windows 的调用限制在 win32.rs 中,其 Linux 和 macOS 对应项限制在 unix.rs 中(从会话、浏览器主机、声音、在文件夹中显示、崩溃处理程序开始);所有其他文件都是安全的、可移植的 Rust。字体来自系统:Windows 的 Fonts 文件夹、macOS 的系统字体、Linux 上的 fontconfig(theme.rs)。
下载列表和设置以原子方式保存到 %APPDATA%\misterdownloadmanager\(downloads.json)。浏览器主机读取相同的文件以获取捕获规则,因此“选项”中的更改适用于下一个捕获的下载。
浏览器集成
page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app
扩展程序询问主机要捕获哪些文件类型,对照它们检查每个下载,并且只有在应用接受后才取消浏览器的下载;否则浏览器会保留它。
翻译
UI 显示的每个文本都通过 crate::i18n(craft-i18n 目录,i18n/<locale>.tsv)。tools/i18n/extract.py 从源代码重建 i18n/en.tsv,并在每个文本上为翻译人员提供注释(它是什么,在哪里显示,其占位符)。
测试和基准
cargo test针对注入故障(慢速、丢弃和拒绝连接、无范围服务器、文件更改)的 mdm-labserver 运行单元测试和端到端下载。tools/bench 运行已发布的速度比较;其原始数据在 docs/bench/ 中。
免费、开源、无广告、无试用。
下载 Mister Download Manager