How to download specific files by using python-libtorrent

别说谁变了你拦得住时间么 提交于 2019-12-05 03:50:32

问题


when I use python-libtorrent to implement a client I find an example on GitHub

import libtorrent as lt
import time

ses = lt.session()
ses.listen_on(6881, 6891)


e = lt.bdecode(open("test.torrent", 'rb').read())
info = lt.torrent_info(e)

h = ses.add_torrent(info, "d:\\temp")

while (not h.is_seed()):
    s = h.status()

    state_str = ['queued', 'checking', 'downloading metadata', \
    'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
    print s.download_rate
    print '%.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s' % \
            (s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, \
            s.num_peers, state_str[s.state])

    time.sleep(1)

It works fine. But it will download all the include files

I want ask user to select the files and this client should only download the specific files.

How to ? Thank you.


回答1:


At first you need to find out which pieces belong to the chosen file/files. In order to do that you first need to find out the index of your file. Doing that is as simple as going through info.files()

i=0
for f in info.files():
    if fileIndex == i:
        fileStr = f
        break
    i += 1

You can confirm that's the correct file by printing its path:

print fileStr.path

Now you need to find the file to piece mapping and assign priorities (0 means don't download)

h = ses.add_torrent(info, "d:\\temp")

pr = info.map_file(fileIndex,0,fileStr.size)
n_pieces = pr.length / info.piece_length() + 1 

for i in range(info.num_pieces()):
    if i in range(pr.piece,pr.piece+n_pieces):
        h.piece_priority(i,7)
    else:
        h.piece_priority(i,0)

Now you can download the files as before. Keep in mind that you now need to stop downloading by checking the progress since you do not enter seed mode as before:

while (not h.is_seed()):
    s = h.status()

    state_str = ['queued', 'checking', 'downloading metadata', \
    'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
    print s.download_rate
    print '%.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s' % \
            (s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, \
            s.num_peers, state_str[s.state])

    if s.progress>=1:
        break

    time.sleep(1)



回答2:


There is much easier way with torrent_handle.prioritize_files or torrent_handle.file_priority

see libtorrent reference: http://www.rasterbar.com/products/libtorrent/manual.html#torrent-handle



来源:https://stackoverflow.com/questions/16249113/how-to-download-specific-files-by-using-python-libtorrent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!