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