18

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.

Chaker
  • 1,197
  • 9
  • 22
  • 3
    What happens when you try? Do you get an error that you could include in your question? – khagler Jun 23 '15 at 16:40
  • It doesn't connect to any peers. – Chaker Jun 23 '15 at 16:43
  • 1
    Does the tracker(s) really work?! Try the trackers you can find on the list here: http://coppersurfer.tk/ Many of the older public trackers doesn't work any more. – Encombe Jun 23 '15 at 19:40
  • I can download the same torrent file using `transmission`, So trackers are working. – Chaker Jun 23 '15 at 20:04
  • That doesn't prove that the tracker(s) is working. – Encombe Jun 23 '15 at 21:46
  • 3
    perhaps you need to bootstrap the DHT. There is no way of knowing without you printing the alerts produced by libtorrent, looking at them to figure out which ones may be relevant. if you can't figure that out, update your question with more information – Arvid Jun 24 '15 at 01:50
  • @Arvid The problem that I don't get any alerts from libtorrent. It only stop at 0% with no peers. – Chaker Jun 24 '15 at 10:00
  • 3
    the code you posted does not ask libtorrent for alerts. are you sure you're just not asking for them? If you ask and literally get 0 alerts back, make sure you set all bits in the alert mask in the session_settings. – Arvid Jun 24 '15 at 15:14
  • Can you tell us precisely which public torrent address you're trying to use. – Ben Sep 19 '15 at 10:57
  • @Ben it's doesn't work with any tracker. For example here this torrent http://www.chaker.tn/big_buck_bunny.torrent which I test with rtorrent and it works perfectly. – Chaker Sep 19 '15 at 11:23

1 Answers1

1

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)
Ben
  • 1,241
  • 1
  • 15
  • 22