3 步修复 Hydra Real-Debrid 重复下载
2026/9/10 7:35:02 网站建设 项目流程

3 步修复 Hydra Real-Debrid 重复下载

【免费下载链接】hydraHydra Launcher is an open-source gaming platform created to be the single tool that you need项目地址: https://gitcode.com/GitHub_Trending/hy/hydra

你挑好游戏,用 Real-Debrid 作为下载源,进度条终于磨到了 100%。你以为这事过去了,可稍后把任务删掉、重新添加同一个磁力链接,Hydra Launcher 的下载队列里又冒出一条崭新的"下载中"——同一份游戏文件被完整拉了第二遍。带宽和磁盘空间双倍消耗,Real-Debrid 面板里还多了两条一模一样的任务记录。

如果同一个磁力链接下载过一次,再次添加却照样重新下载,问题多半不在你的网络。下面是可落地的修复路径,只动两个源文件,改完重启客户端即可生效。

快速自检:你的重复下载是否命中这个问题

对照下面 4 条,符合的请打 ✅:

  • ✅ 重启 Hydra 后,原本已完成的 Real-Debrid 任务重新显示"下载中",而不是"已完成"
  • ✅ 本地下载目录里出现两份文件名相似的同游戏文件副本
  • ✅ Real-Debrid 账号的磁力任务列表里,同一 hash 同时存在两条记录
  • ✅ 删掉队列任务后重新添加同一磁力链接,立刻开始重新下载,没有任何"已存在"提示

四条里中了两条以上,基本可以确认是这套逻辑的问题;如果全部 ❌,你的情况更可能是磁盘空间不足或队列顺序引起的,可以跳过本文。

为什么会重下:两个根因

整条链路用一句话概括:Hydra 每次把磁力链接换成可下载直链时,都是"现场问服务器,找不到就新建"。具体有两处值得盯住。

成因一:种子唯一性校验会漏判。人话版:列表里没翻到旧种子,就立刻新建一个。 技术版:src/main/services/download/real-debrid.ts 里的getTorrentId方法会先拉取账号下的任务列表,按 hash 匹配;一旦没匹配上,紧接着就调用addMagnet在服务器端创建新任务。麻烦在于,列表接口默认只返回第一页,比较时也没有统一大小写。任务排在第一页之外、或者 hash 大小写不一致,匹配就会落空,Hydra 便认定"从没见过",重复建种子。

成因二:解析出的直链没有本地留痕。人话版:刚要来的链接记不住,下次重新问一遍。 技术版:本地状态只存在 src/main/level/sublevels/downloads.ts 的下载记录里。任务每次启动或恢复,src/main/services/download/download-manager.ts 都会重新调用getDownloadUrl查询 Real-Debrid 接口。叠加服务器状态更新有延迟,任务很容易被误判为"未下载"而重来。

修复实操:三步走

第一步:给 real-debrid.ts 的 hash 比较做归一化

getTorrentId的匹配逻辑为"先统一转小写再比较,匹配不上才允许新建"。这段把 hash 比较改成归一化之后才进行,命中就复用旧任务,不再重复建种子。

static async getTorrentId(magnetUri: string) { const userTorrents = await RealDebridClient.getAllTorrentsFromUser(); const { infoHash } = await parseTorrent(magnetUri); // 改动:统一转小写再比较,避免大小写差异导致漏匹配 const found = userTorrents.find( (t) => t.hash.toLowerCase() === infoHash.toLowerCase() ); if (found) return found.id; // 命中即复用已有任务 const torrent = await RealDebridClient.addMagnet(magnetUri); return torrent.id; }

同时把getAllTorrentsFromUser的请求地址改成/torrents?limit=1000,一次取全任务,避免第一页之外的记录漏判。改完的预期表现:重试同一磁力链接时,日志里出现复用了旧任务 ID 的记录,而不是新建一条。

第二步:状态没刷新前,先别判定重下

getDownloadUrl里,选完文件后服务器状态经常还停在waiting_files_selection,旧逻辑立刻判断,容易把"还没索引完"误读成"没下载过"。这里改成带 3 次重试的轮询,给服务器一点消化时间。

// 改动:选完文件后轮询等待状态变化,而不是立即判断 let torrentInfo = await this.getTorrentInfo(realDebridTorrentId); for ( let i = 0; i < 3 && torrentInfo.status === "waiting_files_selection"; i++ ) { await this.selectAllFiles(realDebridTorrentId); await new Promise((r) => setTimeout(r, 2000)); torrentInfo = await this.getTorrentInfo(realDebridTorrentId); }

改完的预期表现:下载不会因状态瞬态中断,队列里也不会因为一次误判再冒出新任务。

第三步:把解析过的直链缓存在本地

最后把拿到的直链写盘保存,重启后不必再向服务器要。在 src/main/level/sublevels/downloads.ts 旁边新增一个独立 sublevel,以任务 hash 为键,有效期 24 小时,避免和 Download 记录类型冲突。

// 改动:新增独立 sublevel 缓存直链,key 为任务 hash const rdLinks = db.sublevel("real-debrid-links", { valueEncoding: "json", }); // 写入:拿到新直链时回写 await rdLinks.put(hash, { url: downloadUrl, expires: Date.now() + 24 * 60 * 60 * 1000, }); // 读取:未过期直接返回,过期则重新解析 const cached = await rdLinks.get(hash).catch(() => null); if (cached && cached.expires > Date.now()) return cached.url;

三步做完,校验不漏判、判定不急躁、链接不重复问,重复下载就断掉了。

验证修复:重加一次同一磁力链接

挑一个已经下载完成的磁力链接,删掉本地任务后重新添加。你应该看到队列直接复用已完成的任务,而不是发起新的下载;再检查~/.config/hydra下的 leveldb 数据,能找到以 hash 命名的直链缓存记录。

下载去重的后续增强已列入 Hydra 的迭代计划,相关改动将在后续版本中随官方发布一起落地。

【免费下载链接】hydraHydra Launcher is an open-source gaming platform created to be the single tool that you need项目地址: https://gitcode.com/GitHub_Trending/hy/hydra

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询