====== Découverte de PeerTube ====== Le travail de contribution nécessite d'abord de comprendre le fonctionnement de PeerTube et des outils qu'il mobilise. ===== Les deux concepts centraux : Fédération et Streaming Peer To Peer ===== Sur son [[https://github.com/Chocobozzz/PeerTube|GitHub]], PeerTube se présente comme suit : >> //Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular//. Le 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 [[https://instances.joinpeertube.org/instances|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é. ==== Communication inter-instances avec ActivityPub ==== 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. [[https://www.w3.org/TR/activitypub/|ActivityPub]] est un protocole de communication standard pour les réseaux sociaux décentralisés, comme PeerTube, mais aussi [[https://joinmastodon.org/|Mastodon]] et [[https://joindiaspora.com/|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 : {{ :txs:peertube-a18:activity_pub.png?600 |}} 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 [[https://github.com/Chocobozzz/PeerTube/tree/develop/shared/models/activitypub|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. ==== Streaming peer-to-peer avec WebTorrent ==== 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 [[https://fr.wikipedia.org/wiki/Magnet_(standard)|magnet URI]] du fichier torrent, une image miniature et une description. Pour ce faire, PeerTube utilise [[https://en.wikipedia.org/wiki/WebTorrent|WebTorrent]], un outil s'appuyant sur [[https://fr.wikipedia.org/wiki/WebRTC|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. [[https://www.w3.org/TR/webrtc/|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 [[https://www.bittorrent.com/lang/fr/]|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 [[https://webtorrent.io/desktop/|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. ==== Stack technique ==== PeerTube est développé à l'aide de nombreuses technologies((Celles soulignées correspondent à celles auxquelles nous avons eu affaire durant notre TX.)). * **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