SDM 图标

IDM 在 Windows 上很好用。macOS 一直没有同等的东西。macOS 自带的那个下载器,速度控制基本没有,浏览器接管要装扩展,续传经常不灵。

我想自己写一个能同时跑在 macOS 和 Windows 上的。

SDM(Super Download Manager)现在正式版是 v2.1.3,MIT 协议。v2.0 起整个换成了 Python 重写,一个 Python 内核配一套 Web 界面,不带 Electron,不内置浏览器运行时。

更新的版本(v2.2.x)目前是预发布状态,还在测。测完确认没问题了会转成正式版,想要最新功能可以从 Releases 挑预发布标签下。

GitHub · 下载

动态分段

别的下载器在开始之前就把文件切好,段数定死,速度上不去就摆烂。

SDM 的分片布局是边下边长的。引擎先开两条连接,有实打实的进度了才逐级放开到设定上限。某一段跑到一半会被拆成两半,拆出来的那半另开一条连接继续拉。

服务器对 Range 请求返回 200 而不是 206 的时候,引擎会退化成单流下载,不会把整份文件当成分片数据写坏。

字节到达就落盘,进度条跟着动。连接卡住由空闲看门狗管,不是靠总超时。

续传

会话文件写成 <文件名>.sdm.session.json,分片布局在里面。崩溃或者被杀之后,能按原来的布局接着下。

链接过期的情况也处理了。服务器返回 403/410/451 的时候任务转成「等待新链接」,你填上新 URL 之后,SDM 会先确认新链接拿到的跟原来那个是同一个文件:确认是,就从已经下过的字节继续;不是,拒绝,已经下好的部分一个字节都不动。

这个确认靠逐字节比对。ETag 和文件大小都不靠谱,很多 CDN 每次请求都换 ETag,大小一样的文件更是到处都有。

浏览器接管

Chrome、Edge、Firefox、Safari 四个浏览器的下载可以交给它。扩展会把页面的 Cookie、User-Agent 和 Referer 一起带过来。

安装入口在「设置 → 浏览器接管」:配对 token 可以复制也可以重新生成(重新生成等于旧 token 立刻作废),每个浏览器的扩展目录能一键打开,装没装是应用自己扫出来的真实状态,不是让你猜。

扩展跟着应用打包,不用再去源码仓库里找。

Safari 那边有硬限制。项目没有 Apple 开发者签名,所以走 Apple 官方给未签名扩展留的路子:macOS 17 / Safari 17 起,设置 → 高级 → 显示网页开发者功能 → 开发者 → 允许未签名的扩展 → 添加临时扩展。不需要 Xcode,不需要开发者账号。

但 Safari 没有 Chrome 那种下载开始前的钩子,只能等下载开始后再取消,那时候文件已经在路上了。所以 Safari 只能手动派单。

界面

液态玻璃,窗口自由缩放,布局重排不裁切。浅色深色两套主题。

macOS 上有菜单栏状态行、Dock 图标上的整体进度、还有 AppleScript 词典。Windows 上是托盘图标,另外注册了 superdownloadmanager:// 这个 URL Scheme。

详情面板里有分片可视化和最近 60 秒的速度曲线。

命令行

后台有个 daemon,sdm 这个命令跟它说话。每个命令都返回 JSON,可以直接塞进脚本或者交给 AI agent 用。

sdm add <url> [--referer R] [--filename F] [--category C] [--threads N]
sdm list
sdm pause <id> | resume <id> | cancel <id>
sdm ping

其它

代理支持 HTTP 和 SOCKS,每个任务和全局都能设。校验和可以选 md5、sha1、sha256,下载完自动算。

完成后能自动打开文件、打开文件夹、跑脚本、休眠。

文件自动分类,下载完落到 ~/Downloads/Video/、~/Downloads/Archives/ 这些地方。没有扩展名的按 magic byte 认。

限速分三种:每个任务一个、全局一个、还有按时间段来的规则——夜里限速,白天放开。

任务队列同时活跃的数量有上限,超出的排队,可以置顶置底。

错误分了十二类:网络、磁盘、权限、空间不足、认证、链接过期、服务器、限流、协议、不支持、用户取消、未知。每类都带一句中文说明,还有「能不能重试」。HTTP 状态码自动归类。服务端给了 Retry-After 就尊重它,重试用指数退避加抖动,最多五次。

装

从 Releases 下对应平台的压缩包。macOS 解压到 /Applications,Windows 解压完直接跑。

命令行和后台 daemon 都在 app 里。第一次启动会把 sdm 加进 PATH,并注册一个开机自启的登录任务,开机之后 daemon 自己起来。开一个新的终端窗口才能拿到更新过的 PATH。

macOS 12 以上、Windows 22H2 以上。从源码跑需要 Python 3.11 以上。

最后

v2.0 之后版本号跳得比较快,主要是底层在换:v2.1 重写了下载引擎,v2.2 把浏览器接管真正接通了。跟用户打交道最多的其实是 v2.2 —— 之前浏览器扩展那套东西写好了但没法用,扩展在哪、配对 token 是什么,应用里一个字没提。

代码在仓库里:SuperDownloadManager

遇到问题或者想要什么功能,说一声。