Comment télécharger les vidéos en haute définition depuis Mosaik.tv

Le site mosaik.tv stream ses vidéos à travers un flash player depuis un serveur Adobe par l'intermédiaire du protocole RTMP.

Pour contourner le téléchargement direct de ses émissions, Mosaiktv crypte le fichier XML de configuration du FlashPlayer.

Voici la méthode pour décrypter ce fichier et récupérer le lien RTMP direct vers le flux en haute qualité.

1. Trouver la clef

Toutes les vidéos sont représentées par une clef unique que vous trouverez dans le code HTML de la page où se trouve la vidéo que vous cherchez à télécharger. Exemple d'un lien vers une vidéo dont la clef est “aBcDe12345” :

<a href="/index.php?video=aBcDe12345" class="marqueur">

Le flash player fait appel à la vidéo de cette manière :

http://www.mosaik.tv/hdr_visio/visio_v7.swf?key=aBcDe12345

Où la clef sert à appeler le fichier de configuration XML qui servira à donner les informations nécessaires au player pour jouer la vidéo ainsi que d'autres paramètres de configuration.

2. Récupérer le fichier de configuration

Le fichier XML crypté est appelé comme ceci:

http://www.mosaik.tv/hdr_visio/proprietes_visio_v6.php?key=aBcDe12345

Ce qui vous renvoie un texte (en une ligne) du style :

M7t477tw0t44Mtw0t449tMGtM7tw0t449t44Gt474twwt44MtMGtM7twwt4[…]

Enregistrez ce texte dans un fichier pour l'utiliser plus tard.

Pour décrypter ce texte, il m'a fallut décompiler le flashplayer et retrouver le bout de code qui assure la conversion de ce texte en un format XML lisible. Vous n'avez pas besoin de décompiler le flash player à nouveau. Vous pouvez passer directement à l'étape “Décryptage”. Mais l'information est notée ici au cas où le code aurait été changé entre temps.

En utilisant un service comme “Show My code”, voici le code actionscript complet du player visio_v7.swf http://www.showmycode.com/?8cf3a970abb6dda8b5a4bf86d2587369

À la ligne 1150, vous trouverez la classe Decrytpage{} dont la méthode Decrypter(_arg1:string):string{} peut être facilement convertie en javascript comme suit.

3. Décryptage

var cle = "t4G3a9M0Zw7"; function Decrypter(_arg1){ var _local; var _local8; var _local9; var _local2 = String(cle.substr(0, 1)); var _local3 = 0; var _local4 = _arg1.length; var _local5 = ""; var _local6 = ""; while (_local3 < _local4) { _local7 = String(_arg1.substr(_local3, 1)); if (_local7 == _local2){ _local5 = (_local5 + String.fromCharCode(_local6)); _local6 = ""; } else { _local8 = 1; while (_local8 < cle.length) { _local9 = String(cle.substr(_local8, 1)); if (_local9 == _local7){ if (_local8 == 10){ _local8 = 0; } _local6 = (_local6 + String(_local8)); break; }; _local8++; }; }; _local3++; }; return (_local5); } var result = Decrypter("M7t477tw0t44Mtw0t449tMGtM7tw0t449[…]"); console.log(result);

En copiant et en faisant tourner ce code dans une console javascript (vous en avez une dans Chrome ou Firefox), et en remplaçant “M7t477[…]” par le texte que vous avez sauvé précédemment, vous obtiendrez un fichier XML en clair du type:

<datas> <aspect> <couleur_fond><![CDATA[0xb5b5b5]]></couleur_fond> <couleur_fond_boutons><![CDATA[0x444444]]></couleur_fond_boutons> <couleur_boutons><![CDATA[0xffffff]]></couleur_boutons> <couleur_rollover_boutons><![CDATA[0xfdcc00]]></couleur_rollover_boutons> <couleur_ombre><![CDATA[0xffffff]]></couleur_ombre> <corner_radius><![CDATA[0]]></corner_radius> </aspect> <menu> <afficher_partager><![CDATA[false]]></afficher_partager> <afficher_voter><![CDATA[false]]></afficher_voter> <afficher_playlist><![CDATA[true]]></afficher_playlist> <afficher_infos><![CDATA[true]]></afficher_infos> <afficher_tagger><![CDATA[false]]></afficher_tagger> <afficher_exporter><![CDATA[false]]></afficher_exporter> </menu> <commandes> <afficher_fullscreen><![CDATA[true]]></afficher_fullscreen> <afficher_temps><![CDATA[true]]></afficher_temps> <afficher_volume><![CDATA[true]]></afficher_volume> <afficher_menu><![CDATA[true]]></afficher_menu> <afficher_hq><![CDATA[false]]></afficher_hq> <afficher_fleches_chapitres><![CDATA[false]]></afficher_fleches_chapitres> </commandes> <options_videos> <mode_diffusion><![CDATA[ss]]></mode_diffusion> <url_fms><![CDATA[rtmpe://vod.mosaik.tv:80/vod/mosaiktv]]></url_fms> <instance_name><![CDATA[mp4:mosaiktv]]></instance_name> <video_width><![CDATA[920]]></video_width> <video_height><![CDATA[517]]></video_height> <afficher_toolbar><![CDATA[true]]></afficher_toolbar> <squeeze><![CDATA[non]]></squeeze> </options_videos> <incrustation> <logo_normal><![CDATA[false]]></logo_normal> <position_logo_normal><![CDATA[tr]]></position_logo_normal> <fichier_logo_normal><![CDATA[http://www.mosaik.tv/images/incrust_normal.png]]></fichier_logo_normal> <logo_fullscreen><![CDATA[false]]></logo_fullscreen> <position_logo_fullscreen><![CDATA[tr]]></position_logo_fullscreen> <fichier_logo_fullscreen><![CDATA[http://www.mosaik.tv/images/incrust_fullscreen.png]]></fichier_logo_fullscreen> <estampillage_export><![CDATA[false]]></estampillage_export> <fichier_estampillage><![CDATA[http://www.mosaik.tv/images/estampillage.png]]></fichier_estampillage> <lien_estampillage><![CDATA[http://www.mosaik.tv/video.php?key=EGZrzGmE2y]]></lien_estampillage> </incrustation> <options_lecture> <autoplay><![CDATA[true]]></autoplay> <loop><![CDATA[false]]></loop> </options_lecture> <url_envois> <partage><![CDATA[http://www.mosaik.tv/visionneuse/ajax/partagerVideo.php]]></partage> <tag><![CDATA[http://www.mosaik.tv/visionneuse/ajax/tagger.php]]></tag> <vote><![CDATA[http://www.mosaik.tv/visionneuse/ajax/voter.php]]></vote> <playlist_liste><![CDATA[http://www.mosaik.tv/visionneuse/ajax/playlist/get.php]]></playlist_liste> <playlist_ajout><![CDATA[http://www.mosaik.tv/visionneuse/ajax/playlist/addVideo.php]]></playlist_ajout> <playlist_suppression><![CDATA[http://www.mosaik.tv/visionneuse/ajax/playlist/removeVideo.php]]></playlist_suppression> </url_envois> <donnees_video> <fichier><![CDATA[ss]]></fichier> <imageBeforePlayDir><![CDATA[http://www.mosaik.tv/videoimages/grand/]]></imageBeforePlayDir> <imageBeforePlay><![CDATA[http://www.mosaik.tv/videoimages/grand/20131031.jpg]]></imageBeforePlay> <interdit><![CDATA[]]></interdit> <idVideo><![CDATA[EGZrzGmE2y]]></idVideo> <tcIn><![CDATA[]]></tcIn> <tcOut><![CDATA[]]></tcOut> <urlMarqueurs><![CDATA[http://www.mosaik.tv/visionneuse/ajax/marqueurs.php?key=EGZrzGmE2y]]></urlMarqueurs> <fichier_source><![CDATA[20131031/high.mp4]]></fichier_source> </donnees_video> <imagette> <largeurImage><![CDATA[160]]></largeurImage><hauteurImage><![CDATA[90]]></hauteurImage><nomImage><![CDATA[/videoimages/20131031.jpg]]></nomImage><imageDir><![CDATA[/videoimages/]]></imageDir><largeurImage_grande><![CDATA[920]]></largeurImage_grande><hauteurImage_grande><![CDATA[517]]></hauteurImage_grande><nomImage_grande><![CDATA[/videoimages/grand/20131031.jpg]]></nomImage_grande><imageDir_grande><![CDATA[/videoimages/grand/]]></imageDir_grande><urlUpload><![CDATA[http://www.mosaik.tv/admin/modules/vod/upload.php]]></urlUpload> </imagette> <smooth_files> <fichier qualite='500'>20131031/low.mp4</fichier> <fichier qualite='1000'>20131031/med.mp4</fichier> <fichier qualite='2000'>20131031/high.mp4</fichier> </smooth_files> </datas>

4. Télécharger la video avec RTMPDump

Dans le fichier XML obtenu, il faut repérer ces quelques informations utiles :

L'url du serveur de video <url_fms> (à priori, cette info ne devrait pas trop changer) :

rtmpe://vod.mosaik.tv:80/vod/mosaiktv

<instance_name> (ça ne devrait pas changer non plus très souvent) :

mp4:mozaiktv

L'url de la vidéo en HD <fichier_source> :

20131031/high.mp4

Grace au programme rtmpdump, télécharger le fichier vidéo avec des paramètres qui ressemblent à ça (en remplacant les valeurs aux endroits mentionnés):

rtmpdump -r "<url_fms>" \ -W "http://www.mosaik.tv/hdr_visio/visio_v7.swf" \ -y "<instance_name>/<fichier_source>" \ -o maVideo.mp4

un exemple concret :

rtmpdump -r "rtmpe://vod.mosaik.tv:80/vod/mosaiktv/" \ -W "http://www.mosaik.tv/hdr_visio/visio_v7.swf" \ -y "mp4:mosaiktv/20131031/high.mp4" \ -o 20131031.mp4

Vous obtiendrez ainsi un fichier mp4 de 1024×576 avec un débit de variable de 3000kb/s, équivalent à une qualité DVD.