Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DM-Lite

一个 IDM 式的下载管理器:多线程分段、断点续传、分片进度条、限速、右键定位文件。 不含自研下载引擎 —— 引擎是 aria2,前端只是它的一张脸。

stack ui

一键部署

新机器上把仓库拉下来(或解压发布包),跑一次:

.\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 双击启动的壳

为什么需要 serve.py

浏览器碰不到文件系统,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 没接)。

About

IDM 式下载管理器:aria2 引擎,界面为单个 HTML 文件,无构建、无依赖。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages