给自己写的开源下载器加了插件系统,顺手把 ffmpeg / yt-dlp 关进了沙箱

clow 2026-07-15 14:05 1

去年闲着没事写了个下载器 FluxDown ,Rust 做引擎,Flutter 做壳,多线程分段、断点续传这些常规操作都有。本来到这就该收工了,但用久了老觉得少点什么——下载这活儿,真正烦的从来不是搬字节,是搬之前得先把分享页抠出直链,搬完了想顺手转个码、归个档。这些需求太杂,我不可能全预判,也不想把设置页堆成一百个勾选框。

所以最近给它加了个插件系统,想拿来给 V 友们拍拍砖。

一个插件就是一个文件夹:一个 `manifest.json` + 一两个 `.js`。没有构建、没有 npm 、没有框架。插件只能干两件事:

- resolver:下载前改写 URL ,把分享页换成真直链(导出 `resolve(ctx)`)
- hooks:任务开始 / 完成 / 出错时收通知(`onStart` / `onDone` / `onError` …)

四十行不到就能教它认识一个新站点,大概长这样:

```js
async function resolve(ctx) {
const id = ctx.url.split("/share/")[1];
if (!id) return null; // 不归我管,按原样下
const res = await flux.fetch({ url: "https://xxx/api/" + id });
const data = JSON.parse(res.body);
return { url: data.directUrl, fileName: data.name, rangeSupported: true };
}
```

我在安全上花的心思比功能本身还多,因为让第三方 JS 跑在别人机器上,一个不小心就是给人埋雷:

- 每次调用开一个全新的 QuickJS 上下文,跑完即弃,没有全局残留
- resolve 给 10s / 64MB ,钩子 5s / 32MB ,连续三次超时或爆内存直接熔断禁用
- `flux.fetch` 只放行公网 http/https ,环回 / 局域网 / 云元数据 IP 全拦,连每一跳重定向都查(防 SSRF )
- 失败 fail-closed ,绝不偷偷回退去下原始页面 URL——不然你会得到一个把 HTML 存成 .mp4 的坏文件还不知道为啥

然后把 ffmpeg 和 yt-dlp 也塞进来了,应用里一键托管安装,插件声明权限后能调,但同样关在笼子里:ffmpeg 只在下完那一刻可用、工作目录就是产物目录、参数审查( URL / 绝对路径 / `..` 全拒,够不到网络也出不了目录); yt-dlp 放行网络但那些能执行外部程序、读浏览器凭据的危险开关全黑名单,还强制前置 `--ignore-config`。于是一条流水线成立了:插件抠直链 → 多线程拉下来 → 下完自动转码,你只点了一下"下载"。

市场我特意没做成一个服务,就是一份数据格式:索引是 GitHub 上 Git 版本化的 JSON ,谁都能 fork ;插件包 `.fxplug` 内容寻址( sha256 整包),多镜像轮着下,没有单点、没人能一键下架你的东西。

关于承诺我想说清楚:项目免费、开源( AGPL )。以后功能会继续加,也会有账号体系,但免费、不放广告、界面保持简洁这三条不会变。别的都能商量,这三条是底线。

官网 fluxdown.zerx.dev ,代码和文档都在 GitHub 。目前主要是 Windows ,macOS/Linux 在路上。插件系统刚落地,肯定有没考虑到的地方,欢迎来提意见 / 骂两句 / 顺手写个插件。
最新回复 (11)
  • clow 楼主 07-15 14:09
    1
    [![1784095694691.png]( https://picui.ogmua.cn/s1/2026/07/15/6a5723ef5e273.webp)]( https://picui.ogmua.cn/s1/2026/07/15/6a5723ef5e273.webp)
    [![1784095701762.png]( https://picui.ogmua.cn/s1/2026/07/15/6a5723ef719d0.webp)]( https://picui.ogmua.cn/s1/2026/07/15/6a5723ef719d0.webp)
    [![1784095714762.png]( https://picui.ogmua.cn/s1/2026/07/15/6a5723ef78662.webp)]( https://picui.ogmua.cn/s1/2026/07/15/6a5723ef78662.webp)
  • clow 楼主 07-15 14:12
    2
    https://free.boltp.com/2026/07/15/6a5724ba1beea.webp
    https://free.boltp.com/2026/07/15/6a5724b9e62e8.webp
    https://free.boltp.com/2026/07/15/6a5724b9e286f.webp
  • peppapig 07-15 15:11
    3
    scoop 源不更新了?现在还是 0.1.54
  • ssack9 07-15 16:47
    4
    不错,UI 设计也很好
  • ko20 07-15 16:54
    5
    挺好的,下载了,感谢。提一句,我下载的 linux deb ,安装后设置里「关联 .torrent 文件」项,无法关闭

    OP 能帮忙看看吗
  • clow 楼主 07-15 18:32
    6
    @ko20 提个 issue 关注下,这两天我看看
  • clow 楼主 07-15 18:32
    7
    @peppapig scoop 源是 qq 群友维护的,我明天艾特他问问
  • clow 楼主 07-15 18:33
    8
    @ssack9 感谢支持~多多提建议😀
  • tcpdump 07-15 20:55
    9
    instagram
    抖音,TK 能支持吗
  • clow 楼主 07-15 23:26
    10
    @tcpdump 官方不提供插件,可以自行实现😀
  • clow 楼主 07-15 23:27
    11
    @tcpdump yt-dlp 支持的都可以,但目前插件只开放了几个平台,可以参考实现修改下就可以。
* 帖子来源V2EX
返回