utorrent online magnet link direct c++ python libtorrent

c++ - online - magnet to direct download



Libtorrent: dado un enlace magnético, ¿cómo generar un archivo torrent? (4)

He leído el manual y no puedo encontrar la respuesta. Dado un enlace magnético, me gustaría generar un archivo torrent para poder cargarlo en el próximo inicio para evitar la descarga de los metadatos. He intentado la función de reanudación rápida, pero todavía tengo que buscar metadatos cuando lo hago y eso puede llevar bastante tiempo. Los ejemplos que he visto son para crear archivos de torrent para un torrent nuevo, donde me gustaría crear uno que coincida con un imán uri.


Si guardar los datos de reanudación 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.


Solo quería proporcionar una actualización rápida utilizando el moderno paquete de Python libtorrent: libtorrent ahora tiene el método parse_magnet_uri que puede usar para generar un controlador de torrent:

import libtorrent, os, time def magnet_to_torrent(magnet_uri, dst): """ Args: magnet_uri (str): magnet link to convert to torrent file dst (str): path to the destination folder where the torrent will be saved """ # Parse magnet URI parameters params = libtorrent.parse_magnet_uri(magnet_uri) # Download torrent info session = libtorrent.session() handle = session.add_torrent(params) print "Downloading metadata..." while not handle.has_metadata(): time.sleep(0.1) # Create torrent and save to file 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


Solución encontrada aquí:

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

Ver creando torrent:

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

Modificar 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" es de aquí:

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

Además, antes de crear torrent, debe asegurarse de que se hayan descargado los metadatos; para ello, llame a handle.has_metadata() .

ACTUALIZAR

Parece que a la API de Python le falta algo de la API de C ++ importante que se requiere para crear torrent desde los imanes, el ejemplo anterior no funciona en Python porque la clase de python create_torrent no acepta torrent_info como parámetro (c ++ lo tiene disponible).

Así que lo intenté de otra manera, pero también encontré un muro de ladrillo que lo hace 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 lanzado en esta línea:

torfile.set_hash(i, hash)

Espera que el hash sea const char* pero torrent_info.hash_for_piece(int) devuelve la clase big_number que no tiene una 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 uri de imán cuando se usan 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 con esto, véalo aquí: http://code.google.com/p/libtorrent/issues/detail?id=294

Star para que lo arreglen rápido.

ACTUALIZACIÓN 3

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