如何使用libtorrent下载完全跳过将文件写入磁盘?

时间:2017-08-14 17:47:06

标签: libtorrent

我有以下代码从磁铁URI下载torrent。

#python
#lt.storage_mode_t(0) ## tried this, didnt work
ses = lt.session()
params = { 'save_path': "/save/here"}

ses.listen_on(6881,6891)
ses.add_dht_router("router.utorrent.com", 6881)

#ses = lt.session()
link = "magnet:?xt=urn:btih:395603fa..hash..."
handle = lt.add_magnet_uri(ses, link, params)
while (not handle.has_metadata()):
    time.sleep(1)
handle.pause () # got meta data paused, and set priority
handle.file_priority(0, 1)
handle.file_priority(1,0)
handle.file_priority(2,0)
print handle.file_priorities()
#output is [1,0,0]
#i checked no files written into disk yet.
handle.resume()
while (not handle.is_finished()):
    time.sleep(1) #wait until download 

它的工作原理,但是在这个特定的torrent中,有3个文件,文件0 - 2 kb,文件1 - 300mb,文件3 - 2kb。

从代码中可以看出,文件0的优先级为1,而其余的优先级为0(即不要下载)。

问题是当0文件完成下载时,我希望它停止而不再下载。但它有时会下载1个文件 - 部分,有时是100mb,或200mb,有时是kb,有时是整个文件。

所以我的问题是:如何确保只下载文件0,而不是1和2.

编辑:我添加了检查是否有元数据,然后设置优先级然后恢复,但这仍然部分地下载了第二个文件。

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是因为添加torrent(启动下载)和设置文件优先级之间的竞争。

为避免这种情况,您可以设置文件优先级以及添加torrent,如下所示:

p = parse_magnet_uri(link)
p['file_priorities'] = [1, 0, 0]
handle = ses.add_torrent(p)

<强>更新

您不需要知道文件的数量,可以为更多文件提供文件优先级,而不是最终存在于torrent文件中。其余的将被忽略。但是,如果您不想从群组中下载任何内容(元数据/ .torrent除外),则更好的方法是设置flag_upload_mode标志。请参阅documentation

p = parse_magnet_uri(link)
p['flags'] |= add_torrent_params_flags_t.flag_upload_mode
handle = ses.add_torrent(p)