Atelier Libtorrent

Créer son client Bittorrent en Python

Programme

  • Présentation de libtorrent
  • Construire le module python-libtorrent
  • ( ou l'installer )
  • Coder un simple client
  • Documentation

Libtorrent

Implémentation du protocole Bittorrent créer en 2001 par Bram Cohen.

Version 1.2

Dévelopé par Arvid

https://github.com/arvidn/libtorrent

Build from scratch

$ git clone https://github.com/arvidn/libtorrent.git
Linux
macOS
$ ./autotool.sh
$ PYTHON=/usr/bin/python3 ./configure --enable-python-binding
$ make -j $(nproc)
$ ./autotool.sh
$ ./configure --with-openssl=/usr/local/opt/openssl --enable-python-binding
$ make -j$(sysctl -n hw.ncpu)

Build with conan

$ conan remote add libtorrent https://api.bintray.com/conan/rllola80/Libtorrent
$ conan install --build=missing .
$ conan build .
$ python test.py

Client

import lib.libtorrent as libtorrent

ses = libtorrent.session({'listen_interfaces': '0.0.0.0:6881'})

Torrent file

info = libtorrent.torrent_info('./sintel.torrent')
h = ses.add_torrent({'ti': info, 'save_path': '.'})
Prépare les informations nécessaire pour le torrent
On ajoute le torrent à notre session

Torrent handle

h = ses.add_torrent({'ti': info, 'save_path': '.'})
s = h.status()
print('starting', s.name)
Après l'ajout à la session on nous a retourné le torrent_handle

In da loop

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

    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, s.state), end=' ')


    sys.stdout.flush()

    time.sleep(1)

print(h.status().name, 'complete')

Alerts

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

    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, s.state), end=' ')

    alerts = ses.pop_alerts()
    for a in alerts:
        if a.category() & libtorrent.alert.category_t.error_notification:
            print(a)

    sys.stdout.flush()

    time.sleep(1)

print(h.status().name, 'complete')

Torrent handle

   # On récupère le morceau de fichier qui peut être lu
   void read_piece (piece_index_t piece) const;
   
   # Vérifie si on le morceau de fichier à l'index
   bool have_piece (piece_index_t piece) const;
   
   # Essaye de télécharger le morceau indiqué avant la deadline
   void set_piece_deadline (piece_index_t index, int deadline, deadline_flags_t flags = {}) const;
   
   # Modifier la priorité du fichier
   void file_priority (file_index_t index, download_priority_t priority) const;
   
   # Est ce que le handle est valide
   bool is_valid () const;
   
   void pause (pause_flags_t flags = {}) const;
   void resume () const;

Magnet Link

magnet_link = 'magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fsintel.torrent'

h = ses.add_torrent({'info_hash': magnet_link, 'save_path': '.'})
Le torrent_info ne sera disponible qu'une fois les metadata reçues

Les applications

* Jeu vidéo : Blizzard l'utilise pour la distribution des mise à jour

* Distribution de vidéo/musique : Blender Studio distribue ses productions gratuitement via torrent (Sintel, Big Buck Bunny, Tears of Steel,...)

* Milieu académique : Distribution de large donnée scientifique

* Streaming : Par exemple avec PeerTube, alternative à Youtube

R.I.P

Entreprise Amiénoise Ugloo de sauvegarde et d'archivage de donnée

Attention

Ce n'est pas une solution anonymes !

Atelier Libtorrent

By Lola Rigaut-Luczak

Atelier Libtorrent

  • 191