0

我尝试创建一个简单的 libtorrent python 客户端(用于磁铁 uri),但失败了,该程序永远不会超过“下载元数据”。如果你能帮我写一个简单的客户端,那就太棒了。

PS当我选择保存路径时,保存路径是我希望保存数据的文件夹吗?或数据本身的路径。

(我使用了某人在此处发布的代码)

import libtorrent as lt
import time

ses = lt.session()
ses.listen_on(6881, 6891)
params = {
'save_path': '/home/downloads/',
'storage_mode': lt.storage_mode_t(2),
'paused': False,
'auto_managed': True,
'duplicate_is_error': True}
 link = "magnet:?xt=urn:btih:4MR6HU7SIHXAXQQFXFJTNLTYSREDR5EI&tr=http://tracker.vodo.net:6970/announce"
handle = lt.add_magnet_uri(ses, link, params)
ses.start_dht()

print 'downloading metadata...'
while (not handle.has_metadata()):
    time.sleep(1)
print 'got metadata, starting torrent download...'
while (handle.status().state != lt.torrent_status.seeding):
    s = handle.status()
    state_str = ['queued', 'checking', 'downloading metadata', \
            'downloading', 'finished', 'seeding', 'allocating']
    print '%.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s %.3' % \
            (s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, \
            s.num_peers, state_str[s.state], s.total_download/1000000)
    time.sleep(5)
4

2 回答 2

2

发生的情况是第一个 while 循环变得无限,因为状态没有改变。

您必须添加一个s = handle.status ();以使元数据状态更改并且循环停止。或者将第一个 while 添加到另一个 while 中,这样也会发生同样的情况。

于 2016-08-09T20:49:38.087 回答
0

是的,您指定的保存路径是种子文件将被下载到的路径。

至于元数据下载部分,我会先添加以下扩展:

ses.add_extension(lt.create_metadata_plugin)
ses.add_extension(lt.create_ut_metadata_plugin)

其次,我会添加一个 DHT 引导节点:

ses.add_dht_router("router.bittorrent.com", 6881)

最后,我会通过查看我的网络接口是否绑定或是否出现任何其他错误来开始调试应用程序(我对 BitTorrent 下载问题的经验通常是它们与网络相关)。为了了解正在发生的事情,我会使用 libtorrent-rasterbar 的警报系统:

ses.set_alert_mask(lt.alert.category_t.all_categories)

并创建一个线程(使用以下代码)来收集警报并显示它们:

while True:
    ses.wait_for_alert(500)
    alert = lt_session.pop_alert()

    if not alert:
        continue

    print "[%s] %s" % (type(alert), alert.__str__())

即使所有这些工作正常,请确保您尝试下载的 torrent 确实有对等点。即使有几个对等点,也可能没有正确配置或支持元数据交换(交换元数据不是标准的 BitTorrent 功能)。尝试加载一个 torrent 文件(不需要下载元数据),看看是否可以成功下载(排除一些网络问题)。

于 2015-11-26T02:29:49.843 回答