0

J'ai essayé de télécharger un torrent (le fichier .torrent spécifique) donné seulement un info_hash. Je sais que cela a été discuté ici avant, j'ai même cherché et modifié mon code en conséquence. Le résultat est le suivant:Python libtorrent crée vide torrent avec lien aimant

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

Cela produit un fichier torrent qui ne peut pas être chargé par transmission. Il manque de traqueurs ainsi que des pièces réelles (crée \ x00 au lieu des pièces réelles).
La ligne suivante serait sauver les morceaux, mais il lui manque encore les trackers et ne peut être ouverte par la transmission:

f = open("torrentfile.torrent", "wb") 
f.write(lt.bencode(torinfo.metadata())) 
f.close() 

Comment puis-je créer un torrent, qui ressemble le torrent réel, simplement en utilisant le lien de l'aimant (comme indiqué dans le code)?
(J'utilise Ubuntu 15.04 64 bits avec libtorrent 0.16.18-1)

Je ne suis pas télécharger illégalement le fichier derrière le torrent- cependant, j'ai le torrent à comparer au torrent téléchargé par mon script.

+0

pouvez-vous s'il vous plaît m'aider? J'utilise le même code que le vôtre mais dans mon cas il est bloqué dans la boucle 'while (pas h.has_metadata()):'. n'importe quoi? – muaaz

Répondre

1

Vous ne définissez pas les hachages pièce et la taille des pièces (de l'objet file_storage). Voir le documentation. Cependant, une manière plus simple et plus robuste de créer un fichier .torrent consiste à utiliser le constructeur create_torrent qui prend un objet torrent_info directement. i.e .:

torfile = lt.create_torrent(h.get_torrent_info()) 
f = open("torrentfile.torrent", "wb") 
f.write(lt.bencode(torfile.generate())) 
f.close() 
+0

Merci beaucoup pour votre réponse. Cela résout vraiment le problème de la définition des pièces sans l'appel de metadata(). Cependant, y a-t-il un moyen d'obtenir les trackers? Ou dois-je ajouter des trackers arbitraires et espérer qu'ils ont des seeders pour ce torrent? – user1252280

+1

Les trackers ne font pas partie des métadonnées transférées via le protocole ut_metadata. Si vous connaissez les trackers, vous pouvez les ajouter manuellement à l'objet create_torrent avant d'appeler generate(). L'ajout de trackers ne modifiera pas l'info-hash. – Arvid

+0

Mais y a-t-il un moyen de déterminer les trackers sans avoir le torrent d'origine? Alors, puis-je obtenir les trackers en quelque sorte? Sinon, je ne serai pas en mesure d'ouvrir le torrent dans e.g. transmission (il ne pouvait pas obtenir de semoirs de trackers). – user1252280