Un titre terrible pour un projet fascinant, un système pour enregistrer à distance, dans le cloud, des sites de streaming ne permettant pas le téléchargement autrement que par une capture vidéo et audio.
Comme l'internet à la maison est satellitaire avec un minuscule 50 GB par mois maximum, j'avais l'habitude (avant la pandémie), de simplement enregistrer de Montréal les émissions de la plateforme tou.tv avec ffmpeg et de les déposer sur une clé USB. Le problème est que maintenant, je suis toujours à la maison, donc sans jamais avoir accès à une bonne connexion internet. Alors, comment profiter de la plateforme pour laquelle je paie chaque mois et qui peine à fonctionner en qualité aussi basse que 270p avec une latence comme celle de Xplornet? J'ai finalement développé la réponse.
Une image vaut mille mots alors voici en résumé l'architecture de l'enregistreur qui fait le gros du travail:
Pour résumé l'architecture en une simple phrase: un logiciel python contrôlant une panoplie d'outils qui roulent sous docker, et qui finalement se prend pour un robot qui clique ici et là pour visionner une émission, l'enregistrer et l'envoyer à bon port.
Le logiciel se connecte automatiquement au site, s'authentifie, détecte la durée du vidéo et enregistre le tout en une seule ligne de commande. À noter que dans cet exemple on force un enregistrement de seulement 10 secondes afin de ne pas attendre toute la durée de l'émission pour voir la suite de l'exécution.
Évidemment, tout n'a pas fonctionné du premier coup. Plusieurs embuches se sont présentées, surtout au point de vue de l'automatisation avec selenium. L'outil est formidable, mais comme la plateforme tou.tv est lourde, pseudofiable et réagissant aléatoirement selon plusieurs scénarios possibles, il a fallu s'armer de patience et contourner tous les cas possibles, tranquillement, mais surement. Au final, j'ai probablement travaillé beaucoup plus sur ma patience que sur mon python.
Ceci dit, cela m'a permis de mieux comprendre quelques concepts de selenium que je ne connaissais que vaguement: ActionChains et les classes Wait.
Comme tout ceci roule dans le cloud, et dû au fait que les régions canadiennes de Google avaient des problèmes de ressources ici et là, j'ai eu à utiliser des machines virtuelles hébergées aux États-Unis. Par conséquent, tou.tv a évidemment décidé de bloquer mes requêtes. La solution? VPN bien sûr. Je suis déjà client chez Private internet Access et découvert un client docker permettant aux autres containers de se connecter par proxy.
Par contre, la lourdeur de la plateforme tou.tv a aussi été problématique. Je ne dis pas ça gratuitement, la page d'accueil de tou.tv requiert 410 requêtes à elle seule avec plus de 8 MB à télécharger. Je suis désolé pour les développeurs, ou alors les product owners, mais une chose est sûr, ça pourrait être mieux (surtout pour les gens avec des connexions moyennes). Tout ça pour dire qu'il a fallu changer quelques paramètres de base de l'image pour la rendre plus costaude, voir la comparaison des paramètres ici.
Dans le prochain article, une vue d'ensemble et quelques explications sur le système complet déployé sur Google Cloud Platform permettant en un seul appel API d'enregistrer une émission.