# idm-downloader **Repository Path**: sharpglasses/idm-downloader ## Basic Information - **Project Name**: idm-downloader - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-05 - **Last Updated**: 2026-10-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IDM 下载管理器 (IDM Downloader) 对标 Internet Download Manager 的**跨平台桌面下载管理器**,基于 [Tauri 2](https://tauri.app/) 构建。 - **后端**:Rust + Tauri(`src-tauri/`)——多线程分块下载、断点续传、队列与优先级调度、全局速度限制、文件类型分类与自动命名、系统托盘。 - **前端**:TypeScript + Vite + TailwindCSS(`src/`)——任务列表、实时进度、新建 / 暂停 / 恢复 / 删除、计划任务、托盘菜单。 前后端仅通过 Tauri `invoke` 命令 + 一个 `downloads` 事件通信,没有独立的 REST / WebSocket 后端服务。 ## 功能对照 IDM 核心能力 | 能力 | 实现 | | --- | --- | | 多线程分块下载 | 支持 `Range` 的链接按大小自动拆分为多块并发下载(默认最多 8 块) | | 断点续传 | 暂停时记录每块已写字节,恢复后从断点继续;应用重启后自动续传未完成任务 | | 下载队列与优先级 | 按优先级(高 / 普通 / 低)+ 创建时间调度,限制最大并发(默认 3 个) | | 速度限制 | 全局令牌桶限速(0 = 不限速) | | 文件类型分类 | 按扩展名 / MIME 归类到 Videos / Music / Images / … 子目录 | | 自动命名 | 解析 URL 末段与 `Content-Disposition`,净化、去重文件名 | | 计划任务 | 设定开始时间,到点自动进入队列 | | 系统托盘 | 显示主窗口 / 全部暂停 / 全部开始 / 退出 | ## 技术栈 - 桌面壳:Tauri 2(`@tauri-apps/api` 2.x、`@tauri-apps/cli` 2.x) - 前端:TypeScript 5、Vite 5、TailwindCSS 3 + PostCSS / Autoprefixer - 后端:Rust(tokio 异步运行时,`reqwest` 下载引擎,令牌桶限速) - 开发端口:Vite `1420`(HMR `1421`),窗口标题 “IDM 下载管理器”,尺寸 `1100×720`(最小 `800×500`) ## 运行前置条件 - [Rust](https://rustup.rs/) 工具链(stable) - [Node.js 18+](https://nodejs.org/) - **Windows 额外要求**(Tauri 2 桌面应用): - [Microsoft C++ 生成工具](https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/)(MSVC) - [WebView2 运行时](https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/)(Windows 11 通常已自带) ## 安装与运行 ```bash # 1. 安装前端依赖 npm install # 2. 开发模式(编译 Rust + Vite 热重载 + 自动拉起桌面窗口) npm run tauri dev # 3. 打包发布(生成对应平台安装包) npm run tauri build ``` > 注意:验证后端(Rust)改动请用 `npm run tauri dev`,而不是纯 `npm run dev`——后者只启动 Vite,不含 Rust 后端,下载能力不会生效。 ## 项目结构 ``` idm-downloader/ ├── index.html ├── package.json # 前端依赖与脚本(type: module) ├── vite.config.ts # Vite / Tauri 端口配置 ├── tsconfig.json / tsconfig.node.json ├── tailwind.config.js / postcss.config.js ├── AGENT.md # 面向 AI 编程助手的改动约定 ├── README.md # 本文件 ├── src/ # 前端(纯展示层) │ ├── main.ts # 入口:挂载 UI + 订阅 downloads 事件 │ ├── ui.ts # DOM 渲染与交互绑定 │ ├── api.ts # Tauri 命令封装(invoke 调用入口) │ ├── types.ts # 前端类型,需与后端数据模型对齐 │ └── style.css # Tailwind 入口 └── src-tauri/ # 后端(Rust) ├── Cargo.toml # crate idm-downloader / lib idm_downloader_lib ├── tauri.conf.json # 窗口、CSP、打包配置 ├── build.rs ├── capabilities/default.json ├── icons/icon.png └── src/ ├── main.rs # 二进制入口,调用 lib::run() ├── lib.rs # 应用装配:插件、setup、命令注册、500ms 主循环 ├── commands.rs # 所有 #[tauri::command] 入口 + HEAD 探测逻辑 ├── tray.rs # 系统托盘菜单 └── download/ ├── mod.rs ├── types.rs # 数据模型:DownloadInfo / Priority / DownloadStatus / Category ├── manager.rs # DownloadManager:队列 / 调度 / 限速 / 暂停恢复 / 持久化 ├── task.rs # 单任务下载引擎(分块、断点续传、MIN_CHUNK_BYTES) ├── ratelimit.rs # 令牌桶限速器 ├── classify.rs # 按扩展名 / MIME 归类 ├── naming.rs # 文件名解析 / 净化 / 去重 + Content-Disposition 解析 └── storage.rs # Settings 与任务 meta 的 JSON 持久化 ``` ## 命令参考(后端 `invoke` ↔ 前端封装) 所有命令在 `src-tauri/src/commands.rs` 定义并在 `lib.rs` 的 `generate_handler!` 注册,前端封装见 `src/api.ts`。 | invoke 名 | 前端封装 | 说明 | | --- | --- | --- | | `get_downloads` | `api.getDownloads()` | 返回全部任务快照 `DownloadInfo[]` | | `add_download` | `api.addDownload(url, opts)` | 新建任务,参数 `url` + `AddOptions`(folder / filename / priority / scheduled_at / category_folder) | | `pause_download` | `api.pause(id)` | 暂停单个任务 | | `resume_download` | `api.resume(id)` | 恢复单个任务 | | `delete_download` | `api.remove(id)` | 删除任务(未完成则一并删除文件) | | `set_speed_limit` | `api.setSpeedLimit(limit)` | 全局限速(bytes/s,0 = 不限) | | `get_settings` | `api.getSettings()` | 读取设置 | | `update_settings` | `api.updateSettings(settings)` | 覆盖保存设置 | | `set_priority` | `api.setPriority(id, priority)` | 设置优先级 | | `reschedule` | `api.reschedule(id, at)` | 改计划时间(`at: number \| null`,秒级时间戳) | | `pause_all` | `api.pauseAll()` | 全部暂停 | | `resume_all` | `api.resumeAll()` | 全部恢复 | 前端**不轮询**:在 `main.ts` 中 `listen("downloads", ...)` 订阅后端每 500ms 推送的全量快照(见 `lib.rs` 主循环)。 ## 调度与限速机制 - 后端在 `lib.rs` 启动一个 `tokio` 异步循环,每 **500ms** 执行: `check_schedule()`(到点把 `scheduled` → `queued`)→ `process_queue()`(按优先级降序、创建时间升序选任务填满 `max_concurrent` 个槽位)→ `sample_all()`(计算瞬时速度)→ 推送 `downloads` 快照。 - 全局限速由 `RateLimiter`(令牌桶,`src-tauri/src/download/ratelimit.rs`)实现,`set_speed_limit` / `update_settings` 会实时更新它。 - 分块:单文件大于 `MIN_CHUNK_BYTES` 且 `max_chunks > 1` 时按 `max_chunks` 拆分并发;依赖服务器 `Accept-Ranges: bytes`,不支持则退化为单连接顺序下载(仍支持续传)。 ## 数据模型要点(`src-tauri/src/download/types.rs`) - `Priority`:`low(0)` / `normal(1)` / `high(2)`,值越大越优先。 - `DownloadStatus`:`scheduled` → `queued` → `downloading` → `paused` / `completed` / `error`。 - `Category`:`video` / `audio` / `image` / `document` / `archive` / `application` / `other`。 - 所有枚举使用 `#[serde(rename_all = "snake_case")]`,前端 `types.ts` 需保持一致。 ## 持久化(`src-tauri/src/download/storage.rs`) - 位置:应用数据目录(`app_data_dir()`),首次运行时创建。 - `settings.json`:全局设置。 - `tasks/.json`:每个任务的 `DownloadInfo`(含断点),暂停 / 恢复 / 改优先级 / 删除都会即时写回。 - 启动恢复(`DownloadManager::restore`):`downloading` / `queued` 状态的任务重启后自动变 `queued` 并续传;其余状态保持。 - `Settings` 默认:`default_dir=""`(空则用系统下载目录)、`max_concurrent=3`、`max_chunks=8`、`speed_limit=0`、`use_category_folders=true`。 ## 构建与打包说明 - 打包 Windows 安装包前,可在 `src-tauri/icons/` 放入 `icon.ico` 以获得更规范的图标;当前已提供 `icon.png` 用于开发态与基本打包(`tauri.conf.json` 的 `bundle.targets` 为 `"all"`)。 - 应用标识符(identifier):`com.example.idmdownloader`,产品名:`IDM Downloader`。 - 安全策略(CSP):`tauri.conf.json` 的 `security.csp` 限制了脚本 / 连接源。前端若要引入新的外部资源(CDN 脚本、远程图片等),需同步放宽 CSP,否则会被窗口拦截。 ## 说明与限制 - 任务的元信息(进度、状态、分块断点)以 JSON 形式保存在应用数据目录的 `tasks/` 下,设置保存在 `settings.json`,重启后自动恢复。 - 分块下载依赖服务器支持 `Accept-Ranges: bytes`;不支持的链接自动退化为单连接顺序下载(同样支持断点续传)。 - 所有下载必须由后端经 `reqwest` 完成,不要在前端直接用浏览器 `fetch` 发起下载请求,否则断点续传、限速、分类等能力全部失效。 ## 常用命令速查 ```bash npm install # 安装前端依赖 npm run tauri dev # 开发模式(编译 Rust + Vite 热重载 + 拉起窗口) npm run tauri build # 打包发布 npm run build # 仅前端构建(tsc + vite build,不含 Rust) ```