\section{Objectifs} La finalité de ce module est de pouvoir lire des flux vidéos depuis un torrent, c'est-à-dire d'effectuer la lecture d'un média transmis en streaming pair à pair. Le module en lui-même est également un très bon candidat pour exploiter un nouveau type de module dans libvlccore: les \inltype{stream_extractor}. Ces composants s'insèrent au niveau du \inltype{demux} et lui fournissent une interface pour choisir quel média lire à partir du fichier torrent ou du lien magnet. Le concept amené par ce nouveau type de module est facilement descriptible par l'exemple. Le premier module réalisé ayant cette capacité est celui capable de lire des archives. Cela permet alors d'ouvrir l'archive comme si il s'agissait d'un dossier et lire n'importe quel flux au sein de ce premier flux. Ce module existait déjà avant le début de mon travail, mais j'ai travaillé sur les problématiques suivantes. \begin{itemize} \item Portage du module et mise à jour des dépendances. \item Ajout du support pour GnuTLS.\@ \item Intégration avec WebTorrent. \end{itemize} \section{Support de Windows et Android} \subsection{Réimplémentation de promesses} L'implémentation initiale était écrite avec la bibliothèque standard en C++14. le module n'était alors pas utilisable sous Windows compilé avec MinGW en version winpthread. Il a donc fallu écrire un wrapper remplaçant les mutexes, threads et variables de conditions utilisés en substituant pour l'implémentation disponible dans VLC.\@ Le travail était donc en particulier d'écrire une nouvelle implémentation des promesses et futures. Le concept se sépare en deux parties: d'un côté les futures sont renvoyées à l'utilisateur lorsqu'il souhaite effectuer une action asynchrone. Lorsque l'utilisateur souhaite utiliser la valeur, il peut utiliser la fonction \inltype{get}. Lors de l'appel à \inltype{get}, soit la valeur est disponible et elle est retournée, soit une erreur est disponible sous forme d'exception et elle est lancée, soit aucun des deux n'est encore disponible et l'appel bloque jusqu'à la validation de la promesse. De l'autre côté, la promesse est utilisée par la fonction asynchrone pour fournir la valeur ou l'erreur à renvoyer. Une promesse ne peut être exaucée qu'une seule fois par une valeur ou une erreur. % TODO: expliquer thread-safe Afin de faire fonctionner ces deux parties ensemble, il faut les doter d'un état partagé. L'implémentation utilise un pointeur avec comptage de référence sur cet état partagé pour gérer atomiquement sa durée de vie, puis l'état contenu dans le pointeur fournit une interface thread-safe. L'intégration dans le module se fait par la classe déjà existante \inltype{i11e_promise}, pour \og{}promesse interruptible\fg{}, qui permet de définir les attentes des promesses comme un point d'annulation possible pour le thread. \subsection{Correction des problèmes de compilation de libtorrent} La seconde partie du travail a consisté à faire compiler libtorrent sur les autres plateformes que Linux. J'ai pour cela ouvert des tickets et proposé des \og{}pull request\fg{}, principalement pour le système de build. J'ai aussi intégré des patch temporaires rajoutant une implémentation des threads pour winpthread. Cela semble rentrer en conflit avec le travail effectué précédemment, mais cette initiative est seulement cloisonnée à la dépendance et ne déborde pas sur VLC. \@ C'est notamment une solution temporaire apparues avec le remplacement de \inltype{boost::thread}, destinée à disparaitre dans le futur et un patch s'accorde plus facilement avec cet esprit. % TODO: https://github.com/arvidn/libtorrent/pull/2999 % TODO: ajouter références vers les pull requests Sur les cinq pull requests proposées, quatre ont été acceptées et intégrées: \begin{itemize} \item \og{}dynamically load getauxval so as to support older android devices\fg{} \#2830: utilise \inltype{dlsym} pour charger dynamiquement \inltype{getauxval} et éviter la situation où la bibliothèque ne compile pas quand \inltype{sys/auxv.h} n'est pas disponible. \item \og{} Add missing define for old android sdk\fg{} \#2831 corrige des erreurs de compilation avec netlink lorsque certaines constantes ne sont pas définies. \item \og{}fix if defined TORRENT\_ANDROID\fg{} \#2836 définit la constante \inltype{TORRENT_ANDROID} pour faire fonctionner la pull request précédente. \item \og{}add windows socket libraries in Makefile.am\fg{} \#2834 corrige la configuration autotools du projet qui n'était pas à jour avec les autres scripts de construction. \end{itemize} \section{Étude des besoins pour l'ajout du support SSL} Lors de l'utilisation de trackers privés, il est possible d'utiliser des certificats SSL pour s'assurer que la personne se connectant aux autres hôtes appartient bien au réseau, en plus de chiffrer très faiblement les données avec un algorithme RC4. % TODO décrire BEP Libtorrent supporte\cite{SSLlibtorrent} la BEP 35\cite{BEP35} qui est une extension au protocole apportant cette fonctionnalité. En interne, libtorrent utilise OpenSSL.\@ Or, la licence d'OpenSSL n'est pas compatible avec les applications sous licence GPL.\@ L'objectif de cette mission était donc d'essayer d'intégrer GnuTLS dans Libtorrent en parallèle du support pour OpenSSL.\@ Après discussion avec le développeur principal de Libtorrent, le projet s'est transformé en l'intégration de GnuTLS dans boost::asio, la bibliothèque réseau utilisée par Libtorrent. Quelques tentatives d'intégration ont néanmoins été faites directement dans libtorrent pour modifier d'autres parties dépendant directement d'OpenSSL. A la suite d'une autre discussion avec des développeurs souhaitant aussi l'arrivée de cette fonctionnalité, évoquant la difficulté de faire accepter une pull request sur le dépôt officiel, et devant la quantité de travail à effectuer pour cette intégration, le projet a été mis en pause pour donner la priorité au reste du stage. \section{Projet subsidiaire, support du WebTorrent} Le module était déjà fonctionnel et est désormais compatible avec toutes les plateformes importantes, malgré le manque de support pour OpenSSL.\@ Cependant il ne peut pas être intégré et distribué avec VLC pour des raisons principalement politiques. Un logiciel aussi connu distribuant un moyen d'utiliser des torrents illégaux seraient mal vu et représente une position difficile à assumer. Suivant l'annonce de la sortie de PeerTube, se voulant être un Youtube décentralisé fonctionnant grâce à Webtorrent, l'idée de s'intégrer nativement à Peertube a émergé comme une alternative correcte pour justifier l'intégration de ce module. Après une discussion avec Jean-Baptiste, l'idée fut acceptée et j'ai pû commencer à me renseigner sur les différents moyens à notre disposition pour utiliser webtorrent dans le module torrent. La stratégie fut sans surprise de procéder à l'intégration dans Libtorrent du support de Webtorrent. Malheureusement ce dernier n'est pas encore standardisé dans une BEP, ou \og{}BitTorrent Enhancement Proposal\fg{} comme décrit dans la BEP 001. L'extension au protocole n'est donc pas encore terminée ni acceptée et seule une implémentation de référence en nodeJS est disponible. En suivant les discussions autour de cette intégration, je suis rapidement arrivé à la nécessité d'intégrer une bibliothèque permettant de supporter une connexion WebRTC directement dans libtorrent, le protocole BitTorrent étant identique une fois l'établissement de celle-ci. À ce jour, aucune action significative n'a encore été entreprise pour avancer sur cette tâche, par manque de temps.