txs:contrib:peertube_a18:decouverte_peertube

Découverte de PeerTube

Le travail de contribution nécessite d’abord de comprendre le fonctionnement de PeerTube et des outils qu’il mobilise.

Sur son GitHub, PeerTube se présente comme suit :

//Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular//.

L

e projet repose ainsi sur deux concepts centraux dont nous allons expliciter la nécessité et les technologies qui leur sont associées.

À la base de PeerTube, il y a l’idée d’un système décentralisé : toutes les vidéos ne sont pas possédées par un serveur unique, comme c’est le cas avec YouTube. PeerTube est ainsi réparti en plusieurs instances. La liste des instances est disponible ici. Une instance peut être installée par n’importe qui ayant une maîtrise suffisante de l’utilisation d’un serveur. Chaque instance héberge les vidéos des utilisateurs qui ont décidé de la rejoindre. Si une instance A follow une instance B, alors les vidéos hébergées par la B seront visibles pour les utilisateurs de l’instance A. C’est en cela qu’on parle d’un modèle fédéré.

Cette fédération suppose une communication intense entre les serveurs. Par exemple, si un utilisateur enregistré sur une instance A like une vidéo hébergée sur une instance B, l’instance B doit en être informée pour traiter cet événement.

ActivityPub est un protocole de communication standard pour les réseaux sociaux décentralisés, comme PeerTube, mais aussi Mastodon et Diaspora*. Il permet l’interopérabilité entre ces reseaux, par exemple, un utilisateur Mastodon peut mettre un like sur une vidéo PeerTube. Comme son nom l’indique, il manipule des activities, réalisées par des actors. Par exemple, un commentaire ou un like réalisé par un utilisateur. Chaque acteur possède une inbox et une outbox par lesquelles il va respectivement pouvoir recevoir les messages qui lui sont adressés et poster des messages aux autres acteurs : Exemple d’acteur :

{"@context": "https://www.w3.org/ns/activitystreams",
 "type": "Person",
 "id": "https://social.example/alyssa/",
 "name": "Alyssa P. Hacker",
 "preferredUsername": "alyssa",
 "summary": "Lisp enthusiast hailing from MIT",
 "inbox": "https://social.example/alyssa/inbox/",
 "outbox": "https://social.example/alyssa/outbox/",
 "followers": "https://social.example/alyssa/followers/",
 "following": "https://social.example/alyssa/following/",
 "liked": "https://social.example/alyssa/liked/"}

Exemple d’activité :

{"@context": "https://www.w3.org/ns/activitystreams",
 "type": "Create",
 "id": "https://social.example/alyssa/posts/a29a6843-9feb-4c74-a7f7-081b9c9201d3",
 "to": ["https://chatty.example/ben/"],
 "actor": "https://social.example/alyssa/",
 "object": {"type": "Note",
            "id": "https://social.example/alyssa/posts/49e2d03d-b53a-4c4c-a95c-94a6abf45a19",
            "attributedTo": "https://social.example/alyssa/",
            "to": ["https://chatty.example/ben/"],
            "content": "Say, did you finish reading that book I lent you?"}}

On trouvera sur GitHub les activités définies par PeerTube.

Il s’agit maintenant de comprendre comment une vidéo hébergée par une instance A est diffusée à l’utilisateur d’une instance B.

Quand une instance A follow une instance B, elle donne accès à ses utilisateurs aux vidéos de l’instance B. Pour ce faire, B fournit à A des metadata sur ses vidéos : en particulier la magnet URI du fichier torrent, une image miniature et une description.

Pour ce faire, PeerTube utilise WebTorrent, un outil s’appuyant sur WebRTC (Web Real Time Communication). WebRTC définit les spécifications de quelques API javascript pour permettre la communication temps réel entre navigateurs (cf. www.w3.org/TR/webrtc/). Ces spécifications sont ensuite implémentées par les différents navigateurs web. WebTorrent utilise le même protocole que BitTorrent, qui permet de streamer le contenu avant d’avoir fini de le télécharger. La vidéo est fragmentée en chunks (morceaux) qui sont partagés en temps réel par les navigateurs des utilisateurs en train de visionner la vidéo. Chaque client est donc bien lui-même fournisseur du contenu, on parle de streaming peer-to-peer.

WebTorrent utilise cependant une couche transport différente. Tandis que BitTorrent utilise des connexions TCP/UDP qui ne peuvent pas être implémentées directement dans une application web pour des questions de sécurité, WebTorrent utilise les API WebRTC.

Petite parenthèse: cela crée deux réseaux de partage de torrents: un réseau basé sur WebRTC et un autre basé sur TCP/UDP. Ces réseaux ne peuvent pas communiquer directement entre eux, bien qu’il existe certaines applications comme WebTorrent Desktop qui permettent de faire le pont entre les deux.

L’intérêt d’utiliser WebTorrent est de ne pas surcharger le serveur lorsqu’une vidéo devient virale. En effet, au lieu de devoir envoyer la même vidéo à des centaines d’utilisateurs en même temps, il suffit de l’envoyer à quelques-uns, qui la rediffuseront à leur tour, leur navigateur devenant fournisseur du contenu.

PeerTube est développé à l’aide de nombreuses technologies1).

  • Server
    • TypeScript → Language
    • PostgreSQL → Database
    • Redis → Job queue/cache
    • Express → Web server framework
    • Sequelize → SQL ORM
    • WebTorrent → BitTorrent tracker and torrent creation
    • Mocha → Test framework
    • Client
    • TypeScript → Language
    • Angular → JavaScript framework
    • SASS → CSS framework
    • Webpack → Source builder (compile TypeScript, SASS files, bundle them…)
    • Bootstrap → CSS framework
    • WebTorrent → JavaScript library to make P2P in the browser
    • VideoJS → JavaScript player framework

1)
Celles soulignées correspondent à celles auxquelles nous avons eu affaire durant notre TX.
  • txs/contrib/peertube_a18/decouverte_peertube.txt
  • de 127.0.0.1