2015-11-13 2 views
0

Я пробовал создать простой клиент python libtorrent (для магнитных uri), и я потерпел неудачу, программа никогда не продолжается после «загрузки метаданных». Если вы можете помочь мне написать простого клиента, это будет потрясающе.Simple libtorrent Python client

P.S. Когда я выбираю путь сохранения, является ли путь сохранения папкой, в которую я хочу сохранить мои данные? или путь для самих данных.

(я использовал код кто-то разместил здесь)

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) 
+0

Это поможет, если вы сможете разместить свой код. –

+0

Я добавил код –

ответ

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__()) 

Даже с все это работает правильно, убедитесь, что торрент, который вы пытаетесь загрузить, имеет сверстников. Даже если имеется несколько одноранговых узлов, ни один из них не может быть настроен правильно или поддерживать обмен метаданными (обмен метаданными не является стандартной функцией BitTorrent). Попробуйте загрузить торрент-файл (который не требует загрузки метаданных) и посмотрите, сможете ли вы успешно загрузить (чтобы исключить некоторые проблемы с сетью).

2

Что происходит, когда первый цикл while становится бесконечным, потому что состояние не изменяется.

Вы должны добавить s = handle.status(); для того, чтобы метаданные изменились и цикл остановился. В качестве альтернативы добавьте первое, а внутри другого, чтобы это произошло.