如何使用 libtorrent 下载完全跳过将文件写入磁盘?
Posted
技术标签:
【中文标题】如何使用 libtorrent 下载完全跳过将文件写入磁盘?【英文标题】:How to completely skip writing files to disk with libtorrent downloads? 【发布时间】:2017-08-14 17:47:06 【问题描述】:我有以下代码可以从磁铁 URI 下载种子。
#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】:发生这种情况的原因是添加种子(开始下载)和您设置文件优先级之间的竞争。
为避免这种情况,您可以在添加种子的同时设置文件优先级,如下所示:
p = parse_magnet_uri(link)
p['file_priorities'] = [1, 0, 0]
handle = ses.add_torrent(p)
更新:
您不需要知道文件的数量,可以为比最终在 torrent 文件中更多的文件提供文件优先级。其余的将被忽略。但是,如果您不想从 swarm 下载任何内容(元数据/.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)
【讨论】:
在开始下载 torrent 之前,我需要有关 torrent、文件计数+ 大小和对等计数的元数据,所以我可以获取元数据然后设置优先级吗?还是我必须在获取元数据之前设置优先级? 我对代码进行了更新,我等待下载元数据,暂停种子并设置优先级,然后恢复它,然后循环直到 handle.is_finished 为真。但这仍然会造成这场比赛,即第二个文件下载以上是关于如何使用 libtorrent 下载完全跳过将文件写入磁盘?的主要内容,如果未能解决你的问题,请参考以下文章
H2 数据库 - CSVREAD - 跳过将 csv 文件的标题行加载到数据库中