C'est pour moi un combat quotidien que de réussir à regarder des vidéos sans avoir ce fameux plugin (un logiciel propriétaire que ma religion m'interdit formellement d'installer). Comme les lecteurs ne servent qu'à afficher un fichier ou un flux, le but est de réussir à trouver l'adresse de ce fichier pour le lire avec le logiciel de mon choix. Parfois l'URL du fichier est disponible directement dans la page, dans les paramètres du lecteur. Parfois il faut accéder à un fichier de configuration sur le serveur pour récupérer cette URL. Et dans les cas extrêmes, découvrir l'URL nécessite de désassembler le lecteur[1] ou de sniffer les échanges sur le réseau.

Fort heureusement, beaucoup de bricoleurs ont déjà fait ce travail et le partagent. Des sites comme userscripts proposent par exemple de nombreux scripts GreaseMonkey qui ajoutent automatiquement aux pages de YouTube, Vimeo et compagnie des liens vers la source de la vidéo.

Il n'y en a cependant pas pour une chaîne de télé cryptée française, qui met à disposition sur son site de nombreux extraits de ses émissions, hélas embastillés dans du Flash. Jusqu'à il y a peu, les fichiers sources étaient assez simples à trouver, mais le site a changé il y a quelques mois et j'ai dû renoncer à regarder le journal télévisé d'une voisine présipauté.

Heureusement bis, des chtis gars d'Ubuntu-fr ont découvert les nouvelles URL, et j'ai pu écrire un petit script pour à nouveau pouvoir regarder certaines émissions[2].

Récupérer l'adresse des fichiers

On peut le faire en interrogeant un service web, mais je me suis aperçu d'une méthode encore plus simple : les URLs des flux ressemblent beaucoup à celles des images de leurs vignettes. J'ai donc écrit un petit script déduisant les premières des secondes. Si j'avais été bon, j'aurais créé une commande GM qui ajoute les liens automatiquement au chargement de la page, mais comme je suis mauvais et plus à l'aise avec la syntaxe d'Ubiquity (qui surtout intègre nativement jQuery), j'ai pondu une commande Ubiquity.

 CmdUtils.CreateCommand({
   name: "canal",
   description: "Add download links to C+",
   execute: function() {
     var document = CmdUtils.getDocument();
     jQuery("img[src$='_image_L.jpg']", document).each(function() {
       var file = this.getAttribute('src').split('/').pop().replace('_image_L.jpg', '_video_H.flv');
       var month = /\d{6}/.exec(file);
       if (month) {
         month = month.shift().substr(0,4);
         $(this).after('<a href="rtmp://vod-fms.canalplus.fr/ondemand/videos/'+month+'/'+file+'">rtmp</a>');
       }
     });
   }
 });

Rien de compliqué : je recherche toutes les vignettes (dont le nom finit par _image_L.jpg), je déduis de leur nom celui du flux et j'insère sous l'image un lien vers le flux. Un peu de mise en forme du lien ne ferait probablement pas de mal.

Afficher le flux

Les flux sont diffusés en utilisant RTMP, un protocole de streaming développé par Adobe. C'est un protocole propriétaire. Ses spécifications sont accessibles, mais Adobe a interdit la diffusion de rtmpdump, un utilitaire permettant de lire les flux et incluant certaines fonctionnalités de protection qu'Adobe tient à garder secrètes. Un dérivé de rtmpdump, flvstreamer, est heureusement disponible, dont ont été retiré les fonctionnalités dont Adobe ne souhaite pas la divulgation.

VLC sait normalement lire les flux RTMP, mais s'il n'y arrive pas vous pouvez passer par flvstreamer. Par défaut, celui-ci écrit le flux sur sa sortie standard, on peut donc l'afficher en redirigeant celle-ci vers n'importe quel logiciel capable de lire du flv. J'utilise pour ma part cette simple commande:

$ cat rtmpplay.sh
#!/bin/sh
flvstreamer -r $1 2> /dev/null | vlc -

Reste à expliquer à Firefox que faire des URL rtmp:. Pour cela, rien de plus simple, il suffit de lui demander gentiment de gérer un nouveau protocole. Allez dans la configuration avancée (about:config dans la barre d'adresse) et rajoutez deux clés :

  • network.protocol-handler.external.rtmp, clé booléenne à true pour lui indiquer que ce protocole est géré par une application externe;
  • network.protocol-handler.app.rtmp, chaîne de caractère contenant le path de la commande externe à lancer pour traiter l'URL. Si vous omettez cette clé, Firefox vous demandera à la première utilisation de choisir le programme à utiliser;

Vala, le tout ne m'a pas pris longtemps et je peux à présent regarder à ma guise Jules-Edouard. Bien sûr, si le Web était ouvert, ces vidéos auraient été diffusées à un format lui aussi ouvert, via par exemple la balise video, et je n'aurais pas eu à passer par ce petit hack. Mais en attendant, une simple bidouille permet de contourner le problème. J'ai utilisé ici par facilité des fonctions spécifiques à Firefox, via Ubiquity, mais écrire une bookmarklet faisant la même chose et compatible avec tous les navigateurs serait trivial.

Notes

[1] swfdump est là pour ça;

[2] pour ce savoir plus, je vous conseille ce fil ( les messages à partir de juillet-août donnent les nouvelles URL);