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.
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