I can't download torrent from public tracker libtorrent

1.5k views Asked by At

I'm using libtorrent module in python to download torrent. I can download torrent from a private tracker but not from a public one. I tried using various torrents, which I can download using "transmission". I checked it against 4 different connections, all the same.

def downloadTorrent(torrent):
    """
    Download torrent using libtorrent library.
    Torrent will be stored at the current directory.
    """
    ses = lt.session()
    ses.listen_on(6881, 6891)

    info = lt.torrent_info(torrent)
    h = ses.add_torrent({'ti': info, 'save_path': './'})
    ses.start_dht()
    print 'starting', h.name()

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

        state_str = ['queued', 'checking', 'downloading metadata', \
          'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
        print '\r%.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]),
        sys.stdout.flush()

        time.sleep(1)

    print h.name(), 'complete'

When I try I get:

0.00% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 0) downloading 

And it stop there.

I don't know if it help, but the private tracker is using http and not udp, and it doesn't allow DHT.

1

There are 1 answers

0
Ben On BEST ANSWER

You don't really explain how you provide the torrent file in your downloadTorrent function. Your function works if you have already downloaded the torrent file on your computer.

If you want to provide a torrent url as an argument for this function, you need to read the http response as bytes like this torrent = lt.bdecode(urllib2.urlopen(torrent_url, 'rb').read())

Here's the full code that works with python 2.7:

import libtorrent as lt
import urllib2

public_torrent = 'http://releases.ubuntu.com/14.04.3/ubuntu-14.04.3-desktop-amd64.iso.torrent'

def downloadTorrent(torrent_url):
    """
    Download torrent using libtorrent library.
    Torrent will be stored at the current directory.
    """
    ses = lt.session()
    ses.listen_on(6881, 6891)

    # read torrent file as bytes
    torrent = lt.bdecode(urllib2.urlopen(torrent_url, 'rb').read())

    info = lt.torrent_info(torrent)
    h = ses.add_torrent({'ti': info, 'save_path': './'})
    ses.start_dht()
    print 'starting', h.name()

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

        state_str = ['queued', 'checking', 'downloading metadata', \
          'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
        print '\r%.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]),
        sys.stdout.flush()

        time.sleep(1)

    print h.name(), 'complete'

downloadTorrent(public_torrent)