一个 IDM 式的下载管理器:多线程分段、断点续传、分片进度条、限速、右键定位文件。 不含自研下载引擎 —— 引擎是 aria2,前端只是它的一张脸。
新机器上把仓库拉下来(或解压发布包),跑一次:
.\setup.ps1它会:装 aria2(winget,没有 winget 就下便携版解压到 bin\,不需要管理员权限)→
检查 Python 3 → 建桌面快捷方式 → 启动。已经装过的一律跳过,重复跑没有副作用。
.\setup.ps1 -NoStart # 只装环境不启动
.\setup.ps1 -Dir E:\BT # 顺便指定下载目录依赖只有两个:aria2(引擎)和 Python 3(只用标准库,不装任何 pip 包)。 没有 Python 也能下载,只是「删文件」和「打开所在文件夹」用不了。
双击 DM-Lite.cmd 或桌面快捷方式,或者:
.\start.ps1 # 启动 aria2 + UI,并打开浏览器
.\start.ps1 -Stop # 关掉后台进程
.\start.ps1 -Dir E:\BT # 换下载目录
.\start.ps1 -Proxy http://127.0.0.1:7897 # 全局走代理(默认直连)下载目录的优先级:-Dir 参数 > DMLITE_DIR 环境变量 > D:\Downloads(有 D 盘才用)>
%USERPROFILE%\Downloads。前端的默认目录是启动时问后端要的(GET /api/config),
所以换台没有 D 盘的机器也不会填错路径。
| 文件 | 作用 |
|---|---|
start.ps1 |
启动器:找 aria2、起 RPC 引擎、起 UI 服务器 |
index.html |
整个界面,单文件,无构建、无依赖 |
setup.ps1 |
一键部署:装依赖、建快捷方式、启动 |
serve.py |
UI 服务器 + 三个后端接口(标准库,无 pip 依赖) |
DM-Lite.cmd |
双击启动的壳 |
浏览器碰不到文件系统,aria2 的 RPC 只管下载,所以这两件事只能后端做:
POST /api/delete—— 删磁盘文件和.aria2续传记录POST /api/reveal——explorer /select,定位文件GET /api/config—— 告诉前端默认下载目录(别把路径写死在 HTML 里)
两个接口共用同一个 resolve_allowed() 守卫:路径来自浏览器,一律不可信,
必须 resolve(strict=True) 之后再判断是否落在允许目录内(先判断再解析会被 .. 绕过),
目录一律拒绝,服务器只绑 127.0.0.1。别把这个守卫简化掉。
1. 伪装浏览器 UA 会被镜像站 403。 清华 tuna 对 Chrome UA 返回 403,用 aria2 自己的默认 UA 反而正常。 隔离测试:16线程+默认UA ✅ / 16线程+ChromeUA ❌403 / 1线程+ChromeUA ❌403 —— 是 UA 不是并发。 所以 UA 字段默认留空。直觉是反的。
2. aria2 会静默吃掉 HTTP_PROXY / HTTPS_PROXY 环境变量。
Windows 的 getenv 不区分大小写,大写的照样吃。命令行没传过 proxy,
aria2.getGlobalOption 里却是 http-proxy=http://127.0.0.1:7897/ —— 全程走代理节点。
实测同一链接单连接:直连 3.12 MB/s vs 走节点 1.64 MB/s。
代理一退出,报的是「目标机器积极拒绝」,看着像 CDN 挂了,其实是连不上本机代理端口。
代理软件的「系统代理」开关只改注册表,不动环境变量,关了对 aria2 无效。
现在 start.ps1 显式传空的 --all-proxy= / --http-proxy= / --https-proxy=(命令行压过环境变量),
新建下载对话框里还有一个任务级的「代理」输入框,留空 = 强制直连。
3. aria2 的 RPC 在初始化完成前就开始应答。
这个窗口里 changeGlobalOption 会返回 OK、立刻读回也是新值,一两秒后却被启动配置冲回默认值。
实测 RPC 可用后 +0s/+1s 推送必丢,+3s/+5s 才留得住 —— 「推一次再校验一次」同样会被骗过去。
所以前端是每轮轮询拿 aria2 的实际值对账,不一致就补推,而不是靠检测重启。
工具栏的「限速」框,单位 KB/s,0 或留空 = 不限速。走的是 aria2 的
max-overall-download-limit,对所有任务合计生效,即时生效不用重启。
实测能压到目标值的 85–96%,只会低不会超。
aria2 不持久化全局选项,限速值存在浏览器 localStorage 里,由前端每秒对账补推 (见坑 3),所以 aria2 重启后限速会自动恢复 —— 前提是 UI 页面开着。
- 只在 Windows 上跑过(
explorer /select,、PowerShell 启动器都是 Windows 专属)。 - 没有 BT/磁力的种子管理界面,虽然 aria2 引擎本身支持。
- 没有浏览器扩展来接管下载链接,得手动贴 URL。
- 限速是全局的,没有做单任务限速(aria2 的
max-download-limit支持,只是 UI 没接)。