Я прочитал manual, и я не могу найти ответ. Учитывая ссылку на магнит, я хотел бы создать торрент файл, чтобы его можно было загрузить при следующем запуске, чтобы избежать повторной загрузки метаданных. Я пробовал функцию быстрого возобновления, но мне все равно нужно получать метаданные, когда я это делаю, и это может занять довольно много времени. Примеры, которые я видел, предназначены для создания торрент файлов для нового торрента, где я хотел бы создать один соответствующий магнит uri.
Libtorrent - с учетом ссылки на магнит, как вы создаете торрент файл?
Ответ 1
Решение найдено здесь:
http://code.google.com/p/libtorrent/issues/detail?id=165#c5
Смотрите создание торрента:
http://www.rasterbar.com/products/libtorrent/make_torrent.html
Изменить первые строки:
file_storage fs;
// recursively adds files in directories
add_files(fs, "./my_torrent");
create_torrent t(fs);
Для этого:
torrent_info ti = handle.get_torrent_info()
create_torrent t(ti)
"handle" отсюда:
torrent_handle add_magnet_uri(session& ses, std::string const& uri add_torrent_params p);
Также перед созданием торрента вы должны убедиться, что метаданные были загружены, сделайте это, вызвав handle.has_metadata()
.
UPDATE
Кажется, что libtorrent python api не хватает некоторых важных С++ api, которые необходимы для создания торрента с магнитов, пример выше не будет работать в python cause create_torrent
класс python не принимает torrent_info как параметр (С++ имеет его доступный).
Итак, я пробовал это по-другому, но также столкнулся с кирпичной стеной, что делает невозможным, вот код:
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()
В этой строке есть ошибка:
torfile.set_hash(i, hash)
Он ожидает, что хэш будет const char*
, но torrent_info.hash_for_piece(int)
возвращает класс big_number
, у которого нет api, чтобы преобразовать его обратно в const char *.
Когда я нахожу какое-то время, я сообщаю об этом недостающем api-ошибке разработчикам libtorrent, так как в настоящее время невозможно создать файл .torrent из магнита uri при использовании привязок python.
torrent_info.orig_files()
также отсутствует в привязках python, я не уверен, достаточно ли torrent_info.files()
.
ОБНОВЛЕНИЕ 2
Я создал проблему на этом, см. здесь: http://code.google.com/p/libtorrent/issues/detail?id=294
Звезда так, чтобы они быстро исправляли.
ОБНОВЛЕНИЕ 3
Теперь исправлено, есть версия 0.16.0. Также доступны бинарные файлы для окон.
Ответ 2
Просто хотел предоставить быстрое обновление с использованием современного пакета libtorrent Python: теперь у libtorrent есть метод parse_magnet_uri
, который вы можете использовать для создания дескриптора торрента:
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
Ответ 3
Если сохранение резюме данных не сработало для вас, вы можете создать новый торрент файл, используя информацию из существующего соединения.
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()
Я сомневаюсь, что это сделает резюме быстрее, чем функция, созданная специально для этой цели.
Ответ 4
Попробуйте увидеть этот код http://code.google.com/p/libtorrent/issues/attachmentText?id=165&aid=-5595452662388837431& имя = java_client.cpp & маркер = km_XkD5NBdXitTaBwtCir8bN-1U% 3A1327784186190 он использует add_magnet_uri, который, я думаю, вам нужен