Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I can't download torrent from public tracker libtorrent

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.

like image 839
Chaker Avatar asked Jun 23 '15 16:06

Chaker


1 Answers

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)
like image 100
Ben Avatar answered Nov 08 '22 05:11

Ben