主题
磁力链接一直卡在「获取元数据」
下载器里加了一条磁力,状态栏永远显示「正在获取元数据(metaDL)」,速度 0,进度 0。放了半小时,一点动静都没有。
这不是下载慢,是它连这个种子有几个文件、多大都不知道。元数据是一种特殊的东西:它不是从服务器上拉下来的,而是从其它正在下这个种子的人那里要来的。
磁力链接里到底有什么
一个磁力链接长这样:
magnet:?xt=urn:btih:<40位info hash>&dn=<显示名称>&tr=<tracker地址>拆开看只有三样东西:
xt=urn:btih:...—— 一个哈希值(info hash)。它是种子文件(.torrent)的摘要dn=...—— 显示名称,纯装饰,不可信tr=...—— tracker 地址,可以有很多个
注意:磁力链接里没有种子文件本身。 只有哈希。下载器要做的是:拿着这个哈希,去问别人"你有这个种子吗?把元数据给我"。
找谁问?两条路:
- Tracker:一个中心服务器,记录"谁在下载哪个种子"。下载器带着哈希去问它,它返回一串 peer 地址
- DHT:一个分布式的哈希表,没有中心,靠 peer 之间互相通报
为什么会卡住
实测环境下(国内家用宽带),卡 metaDL 通常是这两个原因叠加:
1. 磁力链接里没有 tr= 参数
很多资源站给的磁力是裸的,只有 xt 和 dn。这时下载器只能用 DHT 找 peer。
2. DHT 冷启动被掐死
DHT 要工作,得先连上一批「引导节点」(bootstrap nodes),这些节点的地址写死在客户端里,多是国外的。国内网络下这一步经常超时——不是全断,是慢到你以为它没在动。
于是:没有 tracker → 只能靠 DHT → DHT 连不上引导节点 → 找不到任何 peer → 要不到元数据 → 永远 metaDL。
解法:给它加 tracker
不用换下载器,不用挂代理。直接往磁力链接后面追加公共 tracker:
python
trackers = [
"udp://tracker.opentrackr.org:1337/announce",
"udp://open.demonii.com:1337/announce",
"udp://tracker.torrent.eu.org:451/announce",
"udp://exodus.desync.com:6969/announce",
"udp://tracker.openbittorrent.com:6969/announce",
"udp://tracker.tamersunion.org:6969/announce",
"udp://open.stealth.si:80/announce",
"udp://tracker.dler.org:6969/announce",
"udp://explodie.org:6969/announce",
"http://tracker.openbittorrent.com:80/announce",
]
magnet = "magnet:?xt=urn:btih:xxxxx"
magnet += "".join(f"&tr={t}" for t in trackers)实测效果:加了 tracker 之后元数据几秒就解出来了。同一个种子,之前挂了半小时没动静。
用 qBittorrent 的 API 加任务时一样,urls 参数里带上加了 tr 的完整磁力就行:
bash
curl -b cookies.txt "http://127.0.0.1:8080/api/v2/torrents/add" \
--data-urlencode "urls=$MAGNET_WITH_TRACKERS" \
--data-urlencode "savepath=/data/downloads"元数据解出来了,然后呢?
这是第二个坑,而且更气人:元数据有了,peer 仍然可能是 0。
我第一次踩这个坑时特别高兴——状态从 metaDL 变成了"下载中",文件列表出现了,13.4 GB,2160p,多音轨。然后速度 0,一晚上没动。
原因:能给你元数据的 peer,和能给你数据的 peer,是两批人。
元数据很小(几十 KB),任何一个曾经加入过这个种子的客户端都能给你。但真实的数据分片,只有手上有完整文件且现在还在做种的人才能给你。老种子的常态是:元数据散落在一些历史记录里,做种的人早就跑了。
怎么判断?看「种数/总数(seeds/peers)」:
0 (0)—— swarm 死了,别等了,换源0 (30)—— 有人在连但没人有完整文件,也就是都在下同一堆残缺分片,这种情况偶尔能凑出来,但慢得离谱12 (40)—— 健康,等就行
结论:加 tracker 只解决"要不到元数据",不解决"没人做种"。 后者只能换源(找别的版本、别的压制组、或者干脆换平台)。
什么时候该放弃
我给自己定的判断标准:
- 加 tracker 后 10 分钟仍是 metaDL → 这个种子大概率已经没人了
- 元数据解出但 30 分钟 seeds 仍然 0 → 换源,别等
等待没有任何收益。BT 的 swarm 不会"过一会儿热起来"——除非刚好有个新发布的时机。
顺带一条:下完记得删种子
家用宽带跑 BT,有一个东西必须注意:做种会持续占用上行带宽。有些地区运营商把"持续大流量上行"当成 PCDN 特征,可能限速甚至断网。
我的习惯是下载完成后立刻做两件事:
- 在下载器里删除任务,同时勾选删除文件(文件先移到媒体库再删任务)
- 清理
BT_backup目录里的残留种子文件
bash
# qBittorrent 的种子备份目录,删完任务应该基本是空的
ls -la /path/to/qbt/config/BT_backup/ | head如果文件已经移动到媒体库,那一步"删除文件"其实删的是下载目录里的残留。顺序很重要:先移走,再删任务,反过来就把片子删了。
一句话版本:磁力卡 metaDL = 找不到人要元数据,加
&tr=公共 tracker 基本能解;但 tracker 救不了没人做种的死种,看 seeds 决定等还是换。