Enregistreur VHS dans les nuages

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.

Un projet signé COVID

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.

Des containers docker basés sur des outils simples mais puissants

Une image vaut milles mots alors voici en résumé l'architecture de l'enregistreur qui fait le gros du travail:

Architecture

Voici plus en détails les outils utilisés:

  • SimpleScreenRecorder: Un logiciel de capture vidéo et audio ajustant le sampling afin d'éviter les problèmes de synchronisation. Les paramètres par défauts fonctionnent très bien et le logiciel permet d'être contrôlé programmatiquement via stdin.
  • Pulseaudio: Serveur audio, celui par défaut sur Fedora, Ubuntu, Debian, Linux Mint, openSUSE et même OpenWrt.
  • Xvfb: Serveur d'affichage virtuel en protocole X11 (émulateur d'écran)
  • Selenium (geckodriver/firefox): Un framework d'automatisation pour contrôler les fureteurs programmatiquement.
  • Ffmpeg: Encodeur vidéo et audio; utilisé ici pour ré-encoder et compresser les vidéos enregistrés en haute-qualité sans trop de compression.
  • Gluetun VPN client: Un client VPN avec tinyproxy sous docker permettant d'avoir une IP canadienne même si étant exécuté sur une machine hébergée dans une autre région.

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 visualiser une émission, l'enregistrer et l'envoyer à bon port.

Ça ressemble à quoi?

Voici le résultat en ligne de commande:

Le logiciel se connecte automatiquement au site, s'authentifie, détecte la durée du vidéo et enregistre le tout en une seul ligne de commande. À noter que dans cet example 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.

Quelques défis

Selenium et tou.tv

Évidemment, tout n'a pas fonctionné du premier coup. Plusieurs embûches 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, pseudo-fiable 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 sûrement. Au final, j'ai probablement travaillé beaucoup plus sur ma patience que sur mon python.

Ceci dit, cela m'a permit de mieux comprendre quelques concepts de selenium que je ne connaissais que vaguement: ActionChains et les classes Wait.

Adresses IP et géoblocage

Comme tout ceci roule dans le cloud, et dû au fait que les régions canadiennes de Google avait 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 platforme tou.tv a aussi été problématique. Je ne dit 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 connections 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.

Complète automatisation sur GCP

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.