Простой libtorrent Python клиент
Я попытался создать простой клиент 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)
2 ответа
Случается так, что первый цикл while становится бесконечным, потому что состояние не меняется.
Вы должны добавить s = handle.status ();
для наличия метаданных статус изменяется, и цикл останавливается. В качестве альтернативы добавьте первое, находясь внутри другого, чтобы произошло то же самое.
Да, вы указываете путь сохранения, на который будут загружаться торренты.
Что касается части загрузки метаданных, я бы сначала добавил следующие расширения:
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__())
Даже если все это работает правильно, убедитесь, что торрент, который вы пытаетесь загрузить, действительно имеет одноранговых узлов. Даже если есть несколько одноранговых узлов, ни один из них не может быть настроен правильно или поддерживать обмен метаданными (обмен метаданными не является стандартной функцией BitTorrent). Попробуйте загрузить торрент-файл (который не требует загрузки метаданных) и посмотрите, сможете ли вы загрузить его успешно (чтобы исключить некоторые проблемы с сетью).