下载工具gopeed

自定义规则支持huggingface的镜像自动处理

结论(2026-10-22)

  • 可视化下载器选 Gopeed(本机 nixpkgs pin 版 v1.9.0,GPL;GUI 与 REST API 同体,扩展脚本可按 pattern 改写 URL;Motrix / Persepolis / KGet 只能配代理地址、无改写能力;JDownloader 本机 nixpkgs 无包)。上游已有 v1.9.3,但改动(ed2k、3 个无关 bug 修)与代理/扩展无关,不追。
  • 安装:/etc/nixos/modules/desktop/remote/gopeed.nix,已 switch 进现行系统(sw/bin/gopeed + gopeed.desktop 双实证)。aria2 / wget 同目录另两模块。
  • 代理:设置里配一次全局(手动 http://127.0.0.1:7890,不用“跟随系统”),每次建任务三选一:跟随设置(走)/ 不使用代理(跳过)/ 自定义。代理是创建时属性(tasks 路由无 patch),选错删了重建。
  • 镜像规则:弃现成 Huggingface 下载插件(只做整仓解析,单文件会被误拦截),改自写 mirror.js 规则表。单文件必须用 /resolve/ 版 URL——/blob/ 是网页,下回来的是 HTML。

自写 mirror 扩展落点

  • 文件:simpletools/gopeed-extension-demo/mirror.js(新 entry)+ manifest.json(onResolve 配 *://*/* 全匹配 + settings 加 extraRules 文本框)。
  • 规则改两处(叠加):mirror.js 顶部 MIRROR_RULES 数组(只改那里;独立 JSON 不可行——goja 无 require、无文件读,entry 必须自包含);扩展设置页“追加规则”文本框,每行一条 source target,保存即生效。
  • 语义:命中改写交回;未命中不设 res,走默认下载,不拦截。target 为空字符串表示明确放行。
  • 已验证(node 搭桩实测):T1 HF→hf-mirror 改写且 query 保留、文件名正确;T2/T3 运行时文本规则(含 # 注释行)生效;T4 未命中 res=null;manifest JSON 合法、node --check 通过。

关键证据

  • 链路:curl --noproxy 直连 huggingface.co 15 秒空回包(直连不通);走 7890 代理正常 302 到 CDN;hf-mirror.com 同路径走代理 302 到 cas-bridge.xethub.hf.co。判据:在 Gopeed 里不配代理必死,跟插件无关。
  • 插件误拦截机制(DSYZayn 版 src/api/*.js 实证):prepare() 明确 return 拒绝 /resolve/,但不拒绝 /blob/ → basePath 把 blob/main 当目录拼进 getMetaData 的 https://hf-mirror.com/api/${path} → !resp.ok 即 throw → catch 交空 res → 回落下载原 blob 网页(HTML)。
  • Gopeed v1.9.0 源码实证:setupFetcher 注释“task request proxy config has higher priority”;同扩展多 script 全跑无 break;match 语义遵循 Chrome MV3(*://*/* 合法)。

待实测矩阵

编号事项判据状态
R01扩展页装本地文件夹后,先拿小文件走一遍日志出现 [mirror] source -> target 行且文件正确待实测
R02866MB mmproj 经 hf-mirror 下载(/resolve/ 版 URL)大小 907543008 且可用待实测
R03全局代理下 Gopeed 任务三选一(跟随/不用/自定义)跟随走代理能下、不用直连失败符合预期待实测