0

Python-Libtorrent を使用して torrent をダウンロードしようとしています。トレントの一時停止が期待どおりに機能しないという問題があります。

import libtorrent as lt
import time

import sys


def get_libtorrent_session_and_start_dht(start_port, end_port):
    ses = lt.session()
    ses.listen_on(start_port, end_port)
    ses.add_dht_router('dht.transmissionbt.com', start_port)
    ses.add_dht_router('router.bittorrent.com', start_port)
    ses.add_dht_router('router.utorrent.com', start_port)
    ses.start_dht()
    return ses


const_state_str = ['queued', 'checking', 'downloading metadata', \
                   'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
const_pause_torrent = "pause_torrent"
const_resume_torrent = "resume_torrent"
const_kill_torrent = "kill_torrent"
const_user_logged_in = "user_logged_in"
const_user_logged_out = "user_logged_out"
const_quit_seeding = "quit_seeding"

ses = get_libtorrent_session_and_start_dht(6881, 6891)

torrent_info = None
torrent_handle = None
try:
    torrent_info = lt.torrent_info("/home/horvste/Downloads/ubuntu-14.04.4-desktop-amd64.iso.torrent")
    torrent_handle = ses.add_torrent(
        {'ti': torrent_info, 'save_path': "/home/horvste/Downloads"})
except Exception as exception:
    raise exception

while not torrent_handle.has_metadata():
    print "Getting meta data"
    time.sleep(1)

current_iteration = 0
while not torrent_handle.is_seed():
    torrent_status = torrent_handle.status()

    print "current_iteration: " + str(current_iteration)

    if current_iteration == 10:
        print "Calling torrent_handle.pause()...Pausing Torrent"
        sys.stdout.flush()
        torrent_handle.pause()
        while not torrent_handle.status().paused:
            print "Torrent Is Not Paused Yet"
            time.sleep(1)
            sys.stdout.flush()
        while torrent_handle.status().paused:
            print "Torrent Is Paused!"
            torrent_handle.pause()
            time.sleep(1)
            sys.stdout.flush()


    if const_state_str[torrent_status.state] == "checking":
        print 'Checking Torrent....'
        continue

    print '\r%.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s' % \
          (torrent_status.progress * 100, torrent_status.download_rate / 1000, torrent_status.upload_rate / 1000, \
           torrent_status.num_peers, const_state_str[torrent_status.state]), \
        sys.stdout.flush()

    current_iteration += 1

    if torrent_status.paused:
        print "Is Paused"
    else:
        print "Is Not Paused"

    time.sleep(1)

このスクリプトの出力は次のとおりです。

...Previous Output Checking Torrent
Checking Torrent....
current_iteration: 0
4.17% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 0) downloading None
Is Not Paused
current_iteration: 1
4.17% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 0) downloading None
Is Not Paused
current_iteration: 2
4.17% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 4) downloading None
Is Not Paused
current_iteration: 3
4.17% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 7) downloading None
Is Not Paused
current_iteration: 4
4.17% complete (down: 1.0 kb/s up: 1.0 kB/s peers: 11) downloading None
Is Not Paused
current_iteration: 5
4.17% complete (down: 4.0 kb/s up: 2.0 kB/s peers: 16) downloading None
Is Not Paused
current_iteration: 6
4.17% complete (down: 52.0 kb/s up: 5.0 kB/s peers: 21) downloading None
Is Not Paused
current_iteration: 7
4.17% complete (down: 132.0 kb/s up: 8.0 kB/s peers: 28) downloading None
Is Not Paused
current_iteration: 8
4.26% complete (down: 234.0 kb/s up: 12.0 kB/s peers: 33) downloading None
Is Not Paused
current_iteration: 9
4.31% complete (down: 317.0 kb/s up: 15.0 kB/s peers: 38) downloading None
Is Not Paused
current_iteration: 10
Calling torrent_handle.pause()...Pausing Torrent
Torrent Is Paused!
Torrent Is Paused!
Torrent Is Paused!
4.31% complete (down: 418.0 kb/s up: 19.0 kB/s peers: 46) downloading None
Is Not Paused
current_iteration: 11
4.44% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 10) downloading None
Is Not Paused
current_iteration: 12
4.44% complete (down: 0.0 kb/s up: 1.0 kB/s peers: 12) downloading None
Is Not Paused
current_iteration: 13
4.44% complete (down: 1.0 kb/s up: 2.0 kB/s peers: 21) downloading None
...Torrent keeps downloading

上記のスクリプトからわかるように、トレント ハンドルで一時停止を呼び出すと、ループが 3 回繰り返される間一時停止し、ダウンロードが再開されます。torrent_handle.pause()前のスクリプトには、この while ループでの呼び出しが含まれていないことに注意してください。

while torrent_handle.status().paused:
    print "Torrent Is Paused!"
    torrent_handle.pause()
    time.sleep(1)
    sys.stdout.flush()

私はまだ同じ出力を得ています。トレントが期待どおりに一時停止しません。Ubuntu 14.04.4 を実行しており、すべて apt-get 経由でインストールされています。libtorrent init.py で、私のバージョン番号はversion = '0.16.13.0'. 私は何かを見逃していますか、それともライブラリを誤用していますか?

4

1 に答える 1

2

トレントはデフォルトで自動管理されており、一時停止から解放される可能性があります。add_torrent_params のフラグを確認してください

于 2016-05-15T20:41:11.933 に答える