I can't download torrent from public tracker libtorrent
Asked Answered
E

1

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.

Ergot answered 23/6, 2015 at 16:36 Comment(10)
What happens when you try? Do you get an error that you could include in your question?Bedaub
It doesn't connect to any peers.Ergot
Does the tracker(s) really work?! Try the trackers you can find on the list here: coppersurfer.tk Many of the older public trackers doesn't work any more.Mendie
I can download the same torrent file using transmission, So trackers are working.Ergot
That doesn't prove that the tracker(s) is working.Mendie
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 informationSundry
@Sundry The problem that I don't get any alerts from libtorrent. It only stop at 0% with no peers.Ergot
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.Sundry
Can you tell us precisely which public torrent address you're trying to use.Circumscribe
@Circumscribe it's doesn't work with any tracker. For example here this torrent chaker.tn/big_buck_bunny.torrent which I test with rtorrent and it works perfectly.Ergot
C
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)
Circumscribe answered 19/9, 2015 at 14:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.