Avis d’obsolescence

Ce document explique comment on pouvait obtenir un accès plein et entier à l’ensemble de l’offre de tou.tv, en utilisant uniquement du logiciel libre. Cette méthode fut fonctionnelle de février 2010 à décembre 2012. Au moment d'écrire ces lignes (2012-12-15), elle ne fonctionne plus, et cette explication n’est maintenue en ligne que pour référence.

Si vous êtes en quête d’une solution à ce problème, consultez plutôt cette mise à jour.

Quelques Mots

Radio-Canada est une société à la fois fantastique et désespérante. Fantastique, d’abord, pour la qualité de sa production télévisuelle, autant en information qu’en fiction. Désespérante, enfin, pour le peu de cas qu’elle fait de son accessibilité.

Ce n’est pas la première fois que les utilisateurs de logiciel libre se heurtent à ce genre de difficulté avec la SRC: qui ne se souvient pas dans cette communauté du lancement difficile, en juin 2007, de la Zone Audio · Vidéo? Même si les difficultés ont été un peu applanies depuis, l’expérience de l’utilisateur de libre de cette zone reste encore aujourd’hui dans le meilleur des cas erratique, dans le pire calamiteuse. Comme beaucoup d’utilisateurs de logiciel libre, j’ai bien essayé par le passé de faire valoir mes vues auprès de la société. Comme mes démarches, à l’instar de celles de beaucoup, se sont avérées largement infructueuses, je n'éprouve que peu de scrupules à expliquer publiquement aujourd’hui comment télécharger le contenu de tou.tv pour visonnement dans un lecteur tiers.

Note
Aucune garantie ne peut être donnée sur la durabilité de la procédure décrite ici: rien n’est éternel, surtout pas un site web! J’espère néanmoins donner ci-bas suffisamment d’indications pour qu’un hobbyiste déterminé puisse l’adapter aux changements qui ne manqueront pas de survenir; je ne m’engage pas à le faire.

Je tiens à souligner que ma "solution" est le résultat d'à peine quelques heures d’observation et d’expérimentation, ce qui est en soi une démonstration, sinon de l’incurie technique de notre société d'état, tout au moins de son absence réitérée de sensibilité au problème et de son incompréhension du domaine.

Ce qui ne marche pas

Mentionnons d’entrée de jeu que la nouvelle plate-forme de diffusion de Radio-Canada est infiniment plus propre que la précédente: une rapide analyse de trafic (en utilisant par exemple un "packet sniffer", qu’il s’agisse de tcpdump ou d’un outil plus convivial tel Wireshark) nous apprend que l’équipe Internet a eu l’intelligence de s’associer à The Platform, une compagnie américaine qui offre un service bien rodé de publication média depuis une dizaine d’années à beaucoup de gros joueurs.

Ainsi, Radio-Canada a opté pour une solution HTML + JavaScript + Flash, largement identique sur tous les systèmes, et qui reste malheureusement la combinaison dominante pour la diffusion de contenu vidéo sur Internet. Le hic est que la portabilité du Flash est un mythe: par exemple, le lecteur Flash disponible actuellement sur mon système (linux x86_64: 10.0.42.34), est incapable d’utiliser les procédures d’authentification récentes du protocole RTMP, contrairement aux lecteurs Flash 10.x sous Mac OS X ou Windows.

En résumé, on peut donc dire qu’en fait, Radio-Canada a fourni un effort très raisonnable vers la portabilité: il y eu simplement un choix malheureux de protocole, qui met en évidence l’infériorité des implantations Flash sur les systèmes libres.

Erratum: ma première hypothèse sur les limitations de lecteur Flash sur plate-forme libre est incorrecte. Pour une solution beaucoup plus simple pour les utilisateurs de Firefox et de Flash, allez lire ce billet de Fabian Rodriguez.

Mais pourquoi avoir opté pour RTMP?

Probablement parce que ce protocole propriétaire, qui n’a été ouvert que l’année dernière, est perçu comme un bon rempart contre le téléchargement à des fins d’archivage. Comme souvent, c’est faux. Ironiquement, c’est justement l’utilisation du RTMP par Radio-Canada qui va nous forcer ici à télécharger sur disque leur contenu plutôt que de simplement le regarder de la façon prévue!

La Procédure d’accès

Obtenir le idMedia de l'émission

À partir de la page d’accueil de tou.tv, on accède à une page secondaire ou ternaire sur laquelle réside un lecteur Flash et où nous devrions théoriquement voir une émission (ce qui ne marche pas). Or, en examinant le source de cette dernière page, on verra peu après le début du corps de la page (balise "body") la définition littérale d’un tableau associatif en javascript, toutv.mediaData, qui ressemblera à ceci:

<script type="text/javascript">
//<![CDATA[
toutv.mediaData={ "idMedia" : "valeur_program_id", ... };
//]]>
</script>
Obtenir la liste de lecture

C’est cette valeur associée à la clef "idMedia" qui nous intéresse. En fait, on l’utilisera pour accéder, avec son fureteur par exemple, à l’URI "http://release.theplatform.com/content.select?pid=valeur_program_id". Le serveur retournera un document XML dans une espèce de syntaxe SMIL simplifiée qui ressemblera à ceci:

<?xml version="1.0" encoding="utf-8"?>
<playlist>
  <choice>
     <url>http://url/vers/une_pub</url>
     ...
  </choice>
  <choice>
     <url>rtmp://medias-flash.tou.tv/ondemand/?...</url>    <== L'émission
     ...
  </choice>
  <choice>
     <url>http://url/vers/une_seconde_pub</url>
     ...
  </choice>
</playlist>

Il s’agit d’une liste de lecture destinée au lecteur Flash qui définit plusieurs choses, dont entre autre ce qui devrait être lu et dans quel ordre. L’adresse RTMP complète vers votre émission ressemblera à ceci:

rtmp://medias-flash.tou.tv/ondemand/?auth=CLEF_D_AUTHENTIFICATION&aifp=v0001&
slist=001/MOV/HR/CONTENU_hr;001/MOV/MR/CONTENU_mr;001/MOV/BR/CONTENU_br<break>
mp4:001/MOV/HR/CONTENU.mov
Note
En fait, vous vous rendrez compte qu'à chaque fois que vous rechargez la liste de lecture, la clef d’authentification, vraisemblablement un masque jetable, change; vous avez en fait dix à vingt secondes pour vous en servir avant qu’elle ne soit invalidée.
Télécharger l'émission

On utilisera pour se faire rtmpdump. Veuillez noter que je n’ai testé cette procédure que sur la révision r242 de l’entrepôt subversion (bien que cela doive théoriquement fonctionner sur les révisions r141 et supérieures). Voici le bourne script qui règle correctement tous les paramètres (adapter la variable RTMPDUMP à votre système):

#! /bin/sh
#
# rtmpdump.sh
#
RTMPDUMP=rtmpdump

RTMP="`echo $* | sed 's/<break>.*$//'`"
APP="`echo ${RTMP} | sed 's/^.*\/\(ondemand\/\?\)/\1/'`"
PLAYPATH="`echo $* | sed 's/^.*<break>//'`"
AUTH="`echo $* | sed 's/^.*auth=//;s/&.*$//'`"

set -x
exec ${RTMPDUMP} --app ${APP} \
   --flashVer 'WIN 10,0,22,87' \
   --swfVfy 'http://static.tou.tv/lib/ThePlatform/4.1.2/swf/flvPlayer.swf' \
   --auth "${AUTH}" \
   --tcUrl "${RTMP}" --rtmp "${RTMP}" \
   --playpath "${PLAYPATH}" \
   -o out.flv --verbose

Il suffira à partir de là de lui passer l’adresse RTMP précédemment identifiée dans un délai suffisamment serré (voir note) pour que démarre le téléchargement dans le fichier out.flv:

sh rtmpdump.sh 'rtmp://medias-flash.tou.tv/ondemand/?...'
Attention
Méfiez-vous, car les besoins en bande passante sont significatifs: typiquement, il s’agit d’un codec vidéo H.264 dans une résolution comparable au DVD et d’un codec audio AAC, le tout dans un conteneur FLV, ce qui exigera aisément une centaine de Méga-octets pour dix minutes de diffusion.
Regarder l'émission

La combinaison (conteneur FLV + vidéo H.264 + audio AAC) est largement supportée par les lecteurs multimédia libres (j’utilise personnellement mplayer). Une fois le téléchargement complété, vous ne devriez n’avoir qu'à pointer votre lecteur préféré vers out.flv. Voici d’ailleurs la capture d'écran de circonstance.

Outils d’investigation et notes diverses

Donne un poisson à un homme, et il mangera une fois. Donne la photo d’un poisson à un homme, et il la regardera toute sa vie.

— Citation biblique apocryphe

Il est certain que la méthode décrite ci-haut ne marchera qu’un temps, comme le moindre changement à l’infrastructure la rendra disfonctionelle. Je veux dans cette section énumérer quelques techniques et outils qui permettront d’observer ces changements et de s’y adapter en conséquence.

Le Renifleur de paquets

La technique la plus simple consiste à observer ce qui arrive lors d’une session fonctionelle sur tou.tv avec un renifleur de paquets ("packet sniffer"). Ainsi, ouvrir une machine physique ou virtuelle (Qemu, etc.) avec un système propriétaire, et placer en amont un logiciel tel Wireshark reste la façon la plus aisée d’obtenir un matériel d’analyse pertinent. Le maximum de flexibilité sera vraisemblablement atteint en utilisant un ordinateur comme routeur NAT d’un réseau local.

Le Serveur mandataire

Il est souvent utile lors de l’analyse de subvertir les réponses des serveurs dynamiquement à l’aide d’un serveur mandataire ("proxy"), tel DeleGate. Par exemple, dans ce cas-ci, la publicité étant servie sans authentification, il était utile de l’expurger des listes de lecture pour une observation plus claire de la séquence d’authentification RTMP:

delegated -v -P8080 SERVER=http FTOCL=theplatform.cfi

Contenu de theplatform.cfi:

SERVER_HOST: release.theplatform.com
Content-Type: application/smil
Body-Filter: gawk '/<switch>/{i=1;p+=1}/<\/switch>/{i=0;if(p!=2)next}!i||p==2'

Il suffit ensuite de rediriger tout le trafic HTTP pertinent vers le serveur mandataire… Par exemple, sur un routeur muni de netfilter, c’est souvent aussi simple que de spécifier:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

rtmpsuck et rtmpsvr

Une autre source intéressante d’information vient de la lecture des sorties de deux programmes (incomplets au moment d'écrire ses lignes), fourni avec rtmpdump, rtmpsuck et rtmpsvr. Référez-vous au fichier README accompagnant ce code pour les détails d’utilisation.

Conclusion

Il est donc possible, même si cela reste fastidieux, d’avoir accès dès maintenant au contenu de tou.tv en employant uniquement du logiciel libre. Il ne me reste qu'à souhaiter (mais est-ce autre chose qu’utopique?), que Radio-Canada comprenne que la protection des contenus par logiciel sur un système programmable n’est qu’une entreprise par définition vouée à l'échec et y renonce une fois pour toute, au profit de tous.