Downloading a Torrent with libtorrent-python

孤街醉人 提交于 2019-12-03 04:25:07

问题


I have the following python code:

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)

Which seems to work fine, but then slows down to less than a byte/s:

$ python test.py 
downloading metadata...
got metadata, starting torrent download...
0.00% complete (down: 195.0 kb/s up: 8.0 kB/s peers: 28) checking 3.069
0.00% complete (down: 133.0 kb/s up: 5.0 kB/s peers: 28) checking 3.342
0.00% complete (down: 29.0 kb/s up: 1.0 kB/s peers: 28) checking 3.359
0.00% complete (down: 5.0 kb/s up: 0.0 kB/s peers: 28) checking 3.398
0.00% complete (down: 4.0 kb/s up: 0.0 kB/s peers: 28) checking 3.401
0.00% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 28) checking 3.405
0.00% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 28) checking 3.408
0.00% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 28) checking 3.412

It slows down and never completes. Any idea why this happens?


回答1:


The problem turned out to be trivial. The save_path did not exist, thus the libtorrent library downloaded as long as it did not have to flush the cache, but once it attempted to write the file, it failed and could not continue downloading, therefore the slowdown and eventual halt. Once an existing path was added it worked fine.




回答2:


The download rate that you see is most likely from the actual metadata download (i.e. the .torrent file downloaded from your peers). Once the .torrent file has been downloaded, it's started. In this case.

It appears as if you already have some of the files that belong to this torrent, so the downloading is stopped and those files are being checked. i.e. the piece are read in, hashed and compared to the piece hashes in the .torrent file.

The last column shows you the number of megabytes found in the files that match the hashes, the last but one column show you the state of the torrent, i.e. checking.

If you wait until the checking is done, the download should resume.

Better yet, if you save resume data when you quit, and load it back in on startup, you don't have to re-check every time.



来源:https://stackoverflow.com/questions/6556657/downloading-a-torrent-with-libtorrent-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!