2011-12-31 16 views
17

He leído a través del manual y no puedo encontrar la respuesta. Dado un enlace de imán, me gustaría generar un archivo torrent para que pueda cargarse en el siguiente inicio para evitar volver a descargar los metadatos. He intentado con la función de reanudación rápida, pero aún tengo que buscar metadatos cuando lo hago y eso puede llevar bastante tiempo. Los ejemplos que he visto son para crear archivos torrent para un nuevo torrente, mientras que me gustaría crear uno que coincida con un imán uri.Libtorrent: dado un enlace de imán, ¿cómo se genera un archivo torrent?

+0

Por supuesto, la documentación es terrible (aunque extrañamente utilizable) Pero, ¿qué hay de malo con la extensión de metadatos http://www.rasterbar.com/products/libtorrent/manual.html#add-extension? –

Respuesta

11

solución encontrada aquí:

http://code.google.com/p/libtorrent/issues/detail?id=165#c5

Ver crear torrente:

http://www.rasterbar.com/products/libtorrent/make_torrent.html

Modificar las primeras líneas:

file_storage fs; 

// recursively adds files in directories 
add_files(fs, "./my_torrent"); 

create_torrent t(fs); 

A esto:

torrent_info ti = handle.get_torrent_info() 

create_torrent t(ti) 

"manejar" a partir de aquí:

torrent_handle add_magnet_uri(session& ses, std::string const& uri add_torrent_params p); 

También antes de la creación de torrent que tiene que asegurarse de que los metadatos se ha descargado, esto llamando handle.has_metadata().

ACTUALIZACIÓN

parece que api libtorrent pitón le falta algunos de importancia API C++ que se requiere para crear torrente de imanes, el ejemplo anterior no funcionará en la causa pitón clase create_torrent pitón no acepta torrent_info como parámetro (C++ lo tiene disponible).

así que lo intenté otra manera, pero también se encontró con una pared de ladrillo que hace que sea imposible, aquí está el código:

if handle.has_metadata(): 

    torinfo = handle.get_torrent_info() 

    fs = libtorrent.file_storage() 
    for file in torinfo.files(): 
     fs.add_file(file) 

    torfile = libtorrent.create_torrent(fs) 
    torfile.set_comment(torinfo.comment()) 
    torfile.set_creator(torinfo.creator()) 

    for i in xrange(0, torinfo.num_pieces()): 
     hash = torinfo.hash_for_piece(i) 
     torfile.set_hash(i, hash) 

    for url_seed in torinfo.url_seeds(): 
     torfile.add_url_seed(url_seed) 

    for http_seed in torinfo.http_seeds(): 
     torfile.add_http_seed(http_seed) 

    for node in torinfo.nodes(): 
     torfile.add_node(node) 

    for tracker in torinfo.trackers(): 
     torfile.add_tracker(tracker) 

    torfile.set_priv(torinfo.priv()) 

    f = open(magnet_torrent, "wb") 
    f.write(libtorrent.bencode(torfile.generate())) 
    f.close() 

Hay un error arrojado en esta línea:

torfile.set_hash(i, hash) 

Espera que hash sea const char*, pero torrent_info.hash_for_piece(int) devuelve la clase big_number que no tiene API para convertirla de nuevo a const char *.

Cuando encuentre algo de tiempo, reportaré este error de API faltante a los desarrolladores de libtorrent, ya que actualmente es imposible crear un archivo .torrent desde un imán uri cuando se utilizan enlaces de python.

torrent_info.orig_files() también falta en los enlaces de python, no estoy seguro de si torrent_info.files() es suficiente.

ACTUALIZACIÓN 2

He creado un problema en esto, ver aquí: http://code.google.com/p/libtorrent/issues/detail?id=294

estrella que lo que solucionarlo rápidamente.

ACTUALIZACIÓN 3

Se fija ahora, hay una liberación 0.16.0. Binarios para ventanas también están disponibles.

+1

¡Muchas gracias por todo el trabajo! – ciferkey

0

Si guardar el resume data no funcionó para usted, puede generar un nuevo archivo torrent utilizando la información de la conexión existente.

fs = libtorrent.file_storage() 
libtorrent.add_files(fs, "somefiles") 
t = libtorrent.create_torrent(fs) 
t.add_tracker("http://10.0.0.1:312/announce") 
t.set_creator("My Torrent") 
t.set_comment("Some comments") 
t.set_priv(True) 
libtorrent.set_piece_hashes(t, "C:\\", lambda x: 0), libtorrent.bencode(t.generate()) 
f=open("mytorrent.torrent", "wb") 
f.write(libtorrent.bencode(t.generate())) 
f.close() 

Dudo que haga que el currículum sea más rápido que la función creada específicamente para este propósito.

3

Sólo quería dar una rápida actualización utilizando el paquete libtorrent Python moderna: libtorrent tiene ahora el método parse_magnet_uri que se puede utilizar para generar un mango torrente:

import libtorrent, os, time 

def magnet_to_torrent(magnet_uri, dst): 
    params = libtorrent.parse_magnet_uri(magnet_uri) 
    session = libtorrent.session() 
    handle = session.add_torrent(params) 
    print "Downloading metadata..." 
    while not handle.has_metadata(): 
     time.sleep(0.1) 
    torrent_info = handle.get_torrent_info() 
    torrent_file = libtorrent.create_torrent(torrent_info) 
    torrent_path = os.path.join(dst, torrent_info.name() + ".torrent") 
    with open(torrent_path, "wb") as f: 
     f.write(libtorrent.bencode(torrent_file.generate())) 
    print "Torrent saved to %s" % torrent_path 
Cuestiones relacionadas