首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Libtorrent -给定一个磁铁链接,如何生成torrent文件?

Libtorrent -给定一个磁铁链接,如何生成torrent文件?
EN

Stack Overflow用户
提问于 2012-01-01 02:29:47
回答 4查看 9.1K关注 0票数 20

我已经通读了manual,但我找不到答案。给定一个磁铁链接,我想生成一个torrent文件,这样它就可以在下一次启动时加载,以避免重新下载元数据。我已经尝试了快速恢复功能,但我仍然必须在执行时获取元数据,这可能需要相当长的时间。我看到的例子是为一个新的torrent创建torrent文件,我想创建一个匹配磁铁uri的torrent文件。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-05 15:52:52

可在此处找到解决方案:

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

请参见创建torrent:

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

修改第一行:

代码语言:javascript
运行
复制
file_storage fs;

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

create_torrent t(fs);

要这样做:

代码语言:javascript
运行
复制
torrent_info ti = handle.get_torrent_info()

create_torrent t(ti)

"handle“是这里的意思:

代码语言:javascript
运行
复制
torrent_handle add_magnet_uri(session& ses, std::string const& uri add_torrent_params p);

此外,在创建torrent之前,您必须确保元数据已下载,通过调用handle.has_metadata()来完成此操作。

更新

似乎libtorrent python api缺少一些从磁铁创建torrent所需的重要c++ api,上面的例子在python中不起作用,因为create_torrent python类不接受torrent_info作为参数(c++提供了它)。

所以我尝试了另一种方法,但也遇到了砖墙,这是不可能的,以下是代码:

代码语言:javascript
运行
复制
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()

这一行抛出了一个错误:

代码语言:javascript
运行
复制
torfile.set_hash(i, hash)

它期望哈希值为const char*,但torrent_info.hash_for_piece(int)返回big_number类,该类没有将其转换回const char*的接口。

当我有时间的时候,我会向libtorrent开发人员报告这个缺失的api bug,因为目前在使用python绑定时,无法从磁石uri创建.torrent文件。

python绑定中也缺少torrent_info.orig_files(),我不确定torrent_info.files()是否足够。

更新2

我在这个问题上创建了一个问题,请在这里查看:http://code.google.com/p/libtorrent/issues/detail?id=294

启动它,这样他们就能快速修复它。

更新3

现在已经修复了,有一个0.16.0版本。windows的二进制文件也是可用的。

票数 13
EN

Stack Overflow用户

发布于 2014-09-29 22:34:16

我只是想使用现代的libtorrent Python包提供一个快速更新: libtorrent现在有了parse_magnet_uri方法,您可以使用它来生成torrent句柄:

代码语言:javascript
运行
复制
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
票数 6
EN

Stack Overflow用户

发布于 2012-01-26 19:24:14

如果保存resume data对您不起作用,您可以使用现有连接中的信息生成一个新的torrent文件。

代码语言:javascript
运行
复制
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()

我怀疑它是否会使简历比专门为此目的构建的函数更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8689828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档