
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同一个游戏又排进了下载队列磁盘里躺着一堆同名文件是不是特别闹心Hydra Launcher 是一款开源游戏平台除了管理游戏库还能通过 Real-Debrid 这类加速服务帮你下载游戏。如果你正被 Real-Debrid 重复下载问题困扰先别急着怪网络——把这篇读完你能定位到源码里造成重复下载的 3 处位置并逐个补上。先给结论Hydra 下载链路里漏风的 3 处先把结论摆出来。同一个种子被反复下载不是玄学是下载链路上有 3 个漏风口磁链去重靠不住Hydra 添加磁力链接前会查你 Real-Debrid 账户里的种子列表查不到就新增一个。而查询逻辑有个软肋——账户里删过、或列表同步慢时去重会落空。这段逻辑在 Real-Debrid 客户端源码 的getTorrentId方法里。等待选择文件状态被误判种子刚加进去时Real-Debrid 的状态是等你挑文件。Hydra 调了一次全选只回头查一次状态服务器没来得及刷新它就把结果当成没下载好返回空值上层稍后重试重试时又可能触发新增。链接没存本地Hydra 的本地数据库只记这个游戏下载到百分之几不记下载链接是什么。重启后只能重新取链接、重新整包下载。这 3 个洞各对应源码里的一个位置。下面按磁链的流转顺序走一遍你就能看清每一处是怎么漏的。顺磁链走一遍从磁力链接到磁盘上的游戏Hydra 下载一个磁链游戏完整走 3 步。每一步都埋着一颗雷。第一步下载前Hydra 先查户口遇到磁链getTorrentId做的第一件事是解析磁力链接取出infoHash。你可以把 infoHash 理解成种子的身份证号——文件内容相同号码就相同哪怕磁链的文字描述写得千差万别也不会变。调 Real-Debrid 的 API程序和 Real-Debrid 服务器之间通信的标准通道拉回你账户里的全部种子在里面找身份证号相同的那条。找到了就复用它返回的种子编号id找不到就调addMagnet新增一条。雷就在这儿这套去重完全依赖种子还在 Real-Debrid 账户里且 API 当场能返回列表。两种常见情况会让去重空转你曾经在 Real-Debrid 网站里手动删过那条种子。Hydra 本地没有任何备注下次取链接时一查查不到再加一条。服务端列表更新有延迟。种子刚加进去列表还没同步紧接着的又一次检查查无此号于是又多一条。换句话说现有逻辑把去重这件事全权外包给了 Real-Debrid 服务器Hydra 自己不留底。第二步等待选择文件为什么会引发误判种子如果是新加的Real-Debrid 给出的初始状态是waiting_files_selection——大白话就是服务器在等你勾选要下载哪些文件。源码里getDownloadUrl的处理是这样的看到该状态就调selectAllFiles告诉服务器文件我全要然后只重查一次状态状态若变成downloaded下载完成、链接就绪就取第一条链接走解锁拿到直链返回。雷在只重查一次Real-Debrid 的服务端状态刷新有延迟服务器处理完到 API 能查到新状态中间有时间差。查早了拿到的还是waiting_files_selection函数直接返回空。上层的下载管理器看到空值理解为链接还没就绪过一会儿重试。重试时如果列表仍未同步就绕回第一步的查不到 → 再加一条——重复的种子就是这么循环出来的。第三步为什么重启必重新下你可能会问都下过一次了重启之后为什么还要重新下答案在 Hydra 的本地数据库里。下载记录存在 downloads.ts底层是 LevelDB程序内置的小型数据库按键 → 值存数据可以理解成本地的一个通讯录。这里每条游戏记录存的是下载进度、下载路径、当前状态下载中 / 已完成 / 出错……但没有存这个游戏的磁链对应 Real-Debrid 上哪条直链。于是每次需要链接——重启、重新排队、切换下载源——getDownloadUrl都要重跑一遍重新调unrestrictLink解锁这个解锁动作会消耗你 Real-Debrid 高级账户的额度文件也重新落到磁盘。本地数据库里没有这条链接已经换过、还能用的记录只能从头再来。给源码打补丁去重、重试、链接缓存3 个洞对应 3 个修复方向逐个说。修复一让 getTorrentId 分级认识老种子改 real-debrid.ts 里的getTorrentId把找到算数改成按状态分级匹配。思路就三层const { infoHash } await parseTorrent(magnetUri); const userTorrents await RealDebridClient.getAllTorrentsFromUser(); // 1. 先看下完的已下载完成直接复用 const downloaded userTorrents.find( (t) t.hash infoHash t.status downloaded ); if (downloaded) return downloaded.id; // 2. 再看进行中的避免同一个再加一遍 const pending userTorrents.find( (t) t.hash infoHash [downloading, waiting_files_selection].includes(t.status) ); if (pending) return pending.id; // 3. 确实查无此号才新增 return (await RealDebridClient.addMagnet(magnetUri)).id;这段代码用来替换getTorrentId里原有的匹配逻辑先确认有没有下载完的再确认有没有正在走的都落空才去addMagnet。建议在两个命中分支各加一行调试日志输出命中的种子编号方便你回头核对走的是哪条路。修复二让 getDownloadUrl 等几秒再问一次第二步里只重查一次改成重试循环只要状态还停在waiting_files_selection且没到重试上限就等 2 秒再查。let torrentInfo await this.getTorrentInfo(realDebridTorrentId); while ( torrentInfo.status waiting_files_selection retryCount 3 ) { await this.selectAllFiles(realDebridTorrentId); await new Promise((resolve) setTimeout(resolve, 2000)); torrentInfo await this.getTorrentInfo(realDebridTorrentId); retryCount; }这个小循环是给状态延迟留缓冲给 Real-Debrid 服务器几秒把处理走完避免第一次查询就误判没就绪。状态真正变成downloaded后流程照旧——取第一条链接、解锁、返回直链。修复三给下载记录加一份链接缓存第三个洞靠扩展下载记录模块 downloads.ts 来补思路是加一对读 / 写函数写缓存每次成功拿到直链后以 infoHash 为键存一条{ 链接, 过期时间 }记录。Real-Debrid 的直链有有效期通常数小时到 24 小时过期时间字段必须一起写进去。读缓存getDownloadUrl取链接前先按 infoHash 查一次缓存命中且未过期就直接返回完全不打 Real-Debrid 的 API。这样链接有效期内重启、重新排队、换下载源都复用已经换来的那条直链——既不额外消耗解锁额度也不会触发第二轮整包下载。验证 Hydra 是否还在重复下载的 3 个快速检查改完之后按顺序做这 3 步全部通过才算闭环。检查一把已下载的游戏再添加一次挑一个已经下载完、装好的游戏移出游戏库后重新添加。正常表现是下载页直接显示已完成或复用已有种子继续绝不应该出现进度从 0 开始的新任务。检查二开发者工具里看日志关键词打开开发者工具CtrlShiftI在 Console 过滤Reusing existing torrent。重新触发一次下载出现这条日志说明去重命中了已有种子如果只有 Created new torrent 字样说明还走的是新增分支——回去看 3 个修复哪个没落地。检查三本地缓存里有没有新记录找到 Hydra 的本地数据库目录一般在系统配置目录下的 leveldb 文件夹。下载完成后看有没有新增以rd:开头的键点开确认里面存着链接和过期时间。完全没记录说明修复三的写入逻辑没生效。最后叮嘱两句别去 Real-Debrid 网站手动删种子。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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考