Libtorrent не работает при загрузке infohash из json?

Я пытаюсь создать скрипт Python, который загружает только метаданные торрента с учетом информационного хеша. Этот информационный хэш загружается из файла json с таким содержимым:

{"infohash":"someinfohash"}

Если я вручную закодирую инфохэш в строку ссылки или сделаю это лично с помощью словаря, вот так:

link = 'magnet:?xt=urn:btih:someinfohash'

или вот так:

foo = {}
foo['infohash'] = 'someinfohash'
link = 'magnet:?xt=urn:btih:' + foo['infohash']

Я всегда могу скачать метаданные, без проблем. Но по какой-то причине, когда я загружаю его из файла json, время ожидания постоянно истекает.

thedata = open(sys.argv[1]).read()
thedata = json.loads(thedata)

ses = lt.session()

ses.listen_on(6881, 6891)

params = {
    'save_path': '.', # doesn't matter because we're only downloading metadata
}
link = 'magnet:?xt=urn:btih:' + thedata['infohash']

handle = lt.add_magnet_uri(ses, link, params)

ses.add_dht_router('dht.transmissionbt.com', 6881)
ses.add_dht_router('router.bittorrent.com', 6881)
ses.add_dht_router('router.utorrent.com', 6881)
ses.start_dht()

sys.stdout.write('Downloading metadata...')
sys.stdout.flush()
timeout = time.time()
while (not handle.has_metadata()):
    if (time.time() >= 300 + timeout):
        print 'timed out'
        sys.exit(1)
    time.sleep(1)
print 'done'

ses.pause()

Если я проверю, равны ли строки, например:

link = 'magnet:?xt=urn:btih:' + thedata['infohash']
link2 = 'magnet:?xt=urn:btih:someinfohash'
print link == link2

Печатает верно.

Кто-нибудь знает, что происходит?


person takeshibaconsuzuki    schedule 29.08.2015    source источник


Ответы (1)


Наконец-то я нашел, что с ним не так.

Мне пришла в голову идея изучить удобное для программиста текстовое представление словаря, сгенерированного json, в отличие от моего, созданного вручную.

thedata = open(sys.argv[1]).read()
thedata = json.loads(thedata)

print thedata

thedata = {}
thedata['infohash'] = 'someinfohash'

print thedata

Вышло вот что:

{u'infohash', u'someinfohash'}
{'infohash', 'someinfohash'}

Судя по всему, json-сделанный dict был закодирован в юникоде, и это каким-то образом мешало libtorrent подключаться к сидерам. После отмены юникода всех ключей и значений скрипт работает отлично.

person takeshibaconsuzuki    schedule 29.08.2015