Python libtorrent создает пустой торрент с магнитной ссылкой
Я попытался загрузить торрент (конкретный файл.torrent), предоставив только info_hash. Я знаю, что это обсуждалось здесь раньше, я даже искал и модифицировал свой код соответственно. Результат следующий:
import libtorrent as lt
import time
import sys
import bencode
ses = lt.session()
ses.listen_on(6881, 6891)
params = {
'save_path': '.',
'storage_mode': lt.storage_mode_t(2),
'paused': False,
'auto_managed': True,
'duplicate_is_error': True
}
info_hash = "2B3AF3B4977EB5485D39F96FE414729530F48386"
link = "magnet:?xt=urn:btih:" + info_hash
h = lt.add_magnet_uri(ses, link, params)
ses.add_dht_router("router.utorrent.com", 6881)
ses.add_dht_router("router.bittorrent.com", 6881)
ses.add_dht_router("dht.transmissionbt.com", 6881)
ses.start_dht()
while (not h.has_metadata()):
time.sleep(1)
torinfo = h.get_torrent_info()
fs = lt.file_storage()
for f in torinfo.files():
fs.add_file(f)
torfile = lt.create_torrent(fs)
torfile.set_comment(torinfo.comment())
torfile.set_creator(torinfo.creator())
f = open("torrentfile.torrent", "wb")
f.write(lt.bencode(torfile.generate()))
f.close()
Это создает торрент-файл, который не может быть загружен при передаче. В нем отсутствуют как трекеры, так и реальные части (создает \x00 вместо реальных частей).
Следующая строка сохранит части, но все еще не имеет трекеров и не может быть открыта при передаче:
f = open("torrentfile.torrent", "wb")
f.write(lt.bencode(torinfo.metadata()))
f.close()
Как я могу создать торрент, который выглядит как настоящий торрент, просто используя магнитную ссылку (как указано в коде)?
(Я использую Ubuntu 15.04 x64 с libtorrent 0.16.18-1)
Я не незаконно загружаю файл за торрентом, однако, у меня есть торрент, который нужно сравнить с торрентом, загруженным моим скриптом.
1 ответ
Вы не устанавливаете хэши частей и размер части (из file_storage
объект). Смотрите документацию.
Однако более простой и надежный способ создания.torrent-файла заключается в использовании create_torrent
конструктор, который напрямую принимает torrent_info
объект. то есть:
torfile = lt.create_torrent(h.get_torrent_info())
f = open("torrentfile.torrent", "wb")
f.write(lt.bencode(torfile.generate()))
f.close()