About

Dart implementation of a BitTorrent Http/Https and UDP tracker/scrape client

Support

How to use it

Tracker

To create the TorrentAnnounceTracker instance, the parameter AnnounceOptionProvider should be provided. Howerver, there is not any implements , user have to implement it manually:

class SimpleProvider implements AnnounceOptionsProvider {
  SimpleProvider(this.torrent, this.peerId, this.port);
  String peerId;
  int port;
  String infoHash;
  Torrent torrent;
  int compact = 1;
  int numwant = 50;

  @override
  Future<Map<String, dynamic>> getOptions(Uri uri, String infoHash) {
    return Future.value({
      'downloaded': 0,
      'uploaded': 0,
      'left': torrent.length,
      'compact': compact,// it should be 1
      'numwant': numwant, // max is 50
      'peerId': peerId,
      'port': port
    });
  }
}

When we have the AnnounceOptionsProvider instance, we can create a TorrentAnnounceTracker like this:

    var torrentTracker = TorrentAnnounceTracker(SimpleProvider(....));

TorrentAnnounceTracker have some methods to run started,stopped,completed announce event:

    torrentTracker.runTracker(url,infohash,event:'started');

We can add some listener on the torrentTracker to get the announce result:

    torrentTracker.onAnnounceError((source, error) {
      log('announce error:', error: error);
    });
    torrentTracker.onPeerEvent((source, event) {
      print('${source.announceUrl} peer event: $event');
    });

    torrentTracker.onAnnounceOver((source, time) {
      print('${source.announceUrl} announce over!: $time');
      source.dispose();
    });

Scrape

Create a TorrentScrapeTracker instance:

var scrapeTracker = TorrentScrapeTracker();

Then add the scrape url (same with the announce tracker url, TorrentScrapeTracker will transform it) and infohash buffer to create a Scrape:

scrapeTracker.addScrapes(torrent.announces, torrent.infoHashBuffer);

NOTE: The Scrape can add more than one infoHashbuffer , because it can "scrape" multiple torrent informations at one time, so if user invoke addScrapes or addScrape with same url but different infohashbuffer , it will return the same Scrape instance.

To get the scrape result:

scrapeTracker.scrape(torrent.infoHashBuffer).listen((event) {
    print(event);
});

The method scrape need a infoHashbuffer as the parameter and return a Stream , user can listen the Stream event to get the result.

Libraries

torrent_tracker
Bittorrent Tracker. Include UDP tracker and Http/Https tracker