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é.
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.
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.
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>
Dans le fichier XML obtenu, il faut repérer ces quelques informations utiles :
rtmpe://vod.mosaik.tv:80/vod/mosaiktv
mp4:mozaiktv
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.