dimanche 20 mars 2011

Regarder plusieurs chaînes à partir d'une ligne de commande

Après avoir présenté dans un billet précédant une ligne de commande pour regarder la chaîne AlJazeera en direct, j'ai décidé de généraliser cette méthode à toutes les chaînes disponibles en streaming sur le net. Avant de commencer on aura besoin de tshark, une version en ligne de commande de wireshark pour analyser le réseau (sniffer les paquets) et de rtmpdump (qui permet de regarder des streaming en protocole rtmp), une application qui permet de regarder des chaînes en streaming, installons les:
ubugnu@ubugnu-laptop:~$ sudo apt-get install tshark rtmpdump
Si vous n'avez pas envie d'ajouter des dépôts pour installer rtmpdump, simplement installez ces deux paquets dans l'ordre:


PS: pour les autres architectures simplement rechercher dans les mêmes dossiers.
On aura aussi besoin d'un lecteur vidéo qu'on puisse utiliser en ligne de commande, optez pour mplayer (léger mais j'ai remarqué qu'on ne pouvait pas rendre la vidéo plein-écran):
ubugnu@ubugnu-laptop:~$ sudo apt-get install mplayer
ou vlc (très complet):
ubugnu@ubugnu-laptop:~$ sudo apt-get install vlc
Si vous optez pour mplayer il faudra mettre à la fin de chaque commande mplayer - pour lire le flux, si vous optez pour vlc préférez la version en ligne de commande cvlc en mettant à la fin de chaque commande | cvlc - Maintenant voyons comment on a utilisé rtmpdump dans le billet précédant:
ubugnu@ubugnu-laptop:~$ rtmpdump -qv -r rtmp://livestfslivefs.fplive.net/livestfslive-live/ -y "aljazeera_ar_medium?videoId=747084146001&lineUpId=&pubId=665003303001&playerId=751182905001&affiliateId=" -W "http://admin.brightcove.com/viewer/us1.24.04.08.2011-01-14072625/federatedVideoUI/BrightcovePlayer.swf" -p http://english.aljazeera.net/watch_now/ -a "aljazeeraflashlive-live?videoId=747084146001&lineUpId=&pubId=665003303001&playerId=751182905001&affiliateId=" | mplayer -



Analysons les paramètres:

  • -q: mode silencieux (quit)
  • -v: pour dire qu'on regarde une vidéo en live
  • -r: correspondra au paramètre tcUrl qui apparaîtra dans l'analyse des paquets
  • -y: correspondra au chemin et apparaîtra après l'attribut play qui apparaîtra dans l'analyse des paquets
  • -W: correspondra au paramètre swfUrl qui apparaîtra dans l'analyse des paquets
  • -p: correspondra au paramètre pageUrl qui apparaîtra dans l'analyse des paquets
  • -a: correspondra au paramètre app qui apparaîtra dans l'analyse des paquets

cmd | mplayer - demande à mplayer de lire le flux sortant (stdout) de cmd.
Maintenant voyons comment on peut récupérer ces paramètres en utilisant le sniffer de paquets tshark:
  1. Lancer tshark pour sniffer le port 1935 (réservé au protocole rtmp) dont on veut capturer les paquets -f "port 1935", spécifier quelle interface réseau il faut utiliser -i eth0, pour savoir quelle interface vous utilisez pour vous connecter à internet lancez ifconfig et voyez quelle interface porte votre adresse IP, restreindre le nombre de paquets à un nombre limité pour ne pas que ça dure trop longtemps (seulement les premiers paquets comportent les informations qui nous intéressent) avec -c 50, spécifier qu'on veut voir l'output en hex et ascii -x et enfin faire quelques manipulations pour ne garder que la partie ascii et supprimer les sauts de lignes. la deuxième partie de la commande permet alors d'extraire les informations voulues:
    ubugnu@ubugnu-laptop:~$ t=$(sudo tshark -c 50 -i eth0 -f "port 1935" -x | awk '{print $18}' | tr -d '\n'); echo $t | grep -oP 'app((?!swfUrl).?){0,}|swfUrl((?!tcUrl).?){0,}|tcUrl((?!pageUrl).?){0,}|pageUrl(.?){100}|\.play\.(.?){100}'
  2. Lancer le streaming de la chaîne (ou vidéo) voulu (par exemple http://www.livestation.com/channels/43-al-jazeera-arabic) dans un navigateur et attendre jusqu'à ce que l'image apparaisse, vous verrez alors que la commande précédente aura affiché quelque chose du genre:
    ubugnu@ubugnu-laptop:~$ t=$(sudo tshark -c 50 -i eth0 -f "port 1935" -x | awk '{print $18}' | tr -d '\n'); echo $t | grep -oP 'app((?!swfUrl).?){0,}|swfUrl((?!tcUrl).?){0,}|tcUrl((?!pageUrl).?){0,}|pageUrl(.?){100}|\.play\.(.?){100}'
    [sudo] password for ubugnu:
    Running as user "root" and group "root". This could be dangerous.
    Capturing on eth0
    50 packets captured
    app...live/..flashVer...LNX.
    swfUrl..6http://www.livestation.com/flash/player/5.4/player.swf...
    tcUrl...rtmp://media7.lsops.net/live/..fpad....capabilities.@m........audioCodecs.@.........videoCodecs.@o........videoFunction..?........
    pageUrl..8http://www.livestation.com/channels/43-al-jazeera-arabic..objectEncoding.ve......<.;.?..C........
    .play.............aljazeer_ar_medium.sdp...........C.....5....getStreamLength.@...........aljazeer_ar_medi
  3. Maintenant on a tout les paramètres dont on a besoin, mais faites attention, parfois un paramètre peut être "pollué" par des caractères non affichables qu'on retrouve alors incrusté sous forme de point ".", il faut savoir les repérer, dans notre exemple tout est clean:
    app: live/ -a
    swfUrl: http://www.livestation.com/flash/player/5.4/player.swf -W
    tcUrl: rtmp://media7.lsops.net/live/ -r
    pageUrl: http://www.livestation.com/channels/43-al-jazeera-arabic -p
    path: aljazeer_ar_medium.sdp -y
  4. La ligne de commande pour voir ce streaming est donc:
    ubugnu@ubugnu-laptop:~$ rtmpdump -qv -a "live/" -W "http://www.livestation.com/flash/player/5.4/player.swf" -r "rtmp://media7.lsops.net/live/" -p "http://www.livestation.com/channels/43-al-jazeera-arabic" -y "aljazeer_ar_medium.sdp" | mplayer -
  5. On peut refaire la même opération avec plusieurs chaînes, voici quelques exemples de chaînes que j'ai trouvé ici:
    ubugnu@ubugnu-laptop:~$ echo alarabia
    alarabia
    ubugnu@ubugnu:~$ t=$(sudo tshark -c 50 -i eth0 -f "port 1935" -x | awk '{print $18}' | tr -d '\n'); echo $t | grep -oP 'app((?!swfUrl).?){0,}|swfUrl((?!tcUrl).?){0,}|tcUrl((?!pageUrl).?){0,}|pageUrl(.?){100}|\.play\.(.?){100}'
    [sudo] password for ubugnu:
    Running as user "root" and group "root". This could be dangerous.
    Capturing on eth0
    50 packets captured
    app...live/..flashVer...LNX,154,17..
    swfUrl..6http://www.livestation.com/flash/player/5.4/player.swf...
    tcUrl...rtmp://media2.lsops.net/live/..fpad....capabilities.@m........audioCodecs.@.........videoCodecs.@o........videoFunction..?.........
    pageUrl..?http://www.livestation.com/channels/57-al-arabiya-arabic-arabic..objectEncoding...{.e....;.@..E..
    .play.............alarabiy_ar_medium.sdp......{.e....;.@..E..(..@.1.<..!.6...d.........Q..P...{.e....;.@..
    ubugnu@ubugnu:~$ echo cnn
    cnn
    ubugnu@ubugnu:~$ t=$(sudo tshark -c 50 -i eth0 -f "port 1935" -x | awk '{print $18}' | tr -d '\n'); echo $t | grep -oP 'app((?!swfUrl).?){0,}|swfUrl((?!tcUrl).?){0,}|tcUrl((?!pageUrl).?){0,}|pageUrl(.?){100}|\.play\.(.?){100}'
    Running as user "root" and group "root". This could be dangerous.
    Capturing on eth0
    50 packets captured
    app...livestfslive-live/..flashVer...LNX10,2,154,17..
    swfUrl..6http://www.livestation.com/flash/player/5.4./player.swf..
    tcUrl..3rtmp://livestfslivefs.fplive.net/livestfslive-live/..fpad....capabilities.@m........audioCodecs.@.........v.ideoCodecs.@o........videoFunction.?.........
    pageUrl..8http://www.livestation.com/products/66-cnn-international..objectEncoding...............{.e....;.@
    .play............jlivestfslive_cnn_en_veryhigh?start_time=20110320104231&end_time=20110320105231&token=0d9
    ubugnu@ubugnu:~$ echo euronews
    euronews
    ubugnu@ubugnu:~$ t=$(sudo tshark -c 50 -i eth0 -f "port 1935" -x | awk '{print $18}' | tr -d '\n'); echo $t | grep -oP 'app((?!swfUrl).?){0,}|swfUrl((?!tcUrl).?){0,}|tcUrl((?!pageUrl).?){0,}|pageUrl(.?){100}|\.play\.(.?){100}'
    Running as user "root" and group "root". This could be dangerous.
    Capturing on eth0
    50 packets captured
    app...live/..flashVer...LNX,154,17..
    swfUrl..6http://www.livestation.com/flash/player/5.4/player.swf...
    tcUrl...rtmp://media2.lsops.net/live/..fpad....capabilities.@m........audioCodecs.@.........videoCodecs.@o........videoFunction..?.........
    pageUrl..7http://www.livestation.com/channels/12-euronews-franais..objectEncoding...........{.e....;.@..E..
    .play.............euronews_fr_medium.sdp.......;.@..{.e...E..i..@.@..j...d.!.6....33.tR.^.P....r........*.
    .play.............euronews_fr_medium.sdp.......;.@..{.e...E..(..@.@......d.!.6....33..R.^.P...{.e....;.@..
    ubugnu@ubugnu:~$ echo france24
    france24
    ubugnu@ubugnu:~$ t=$(sudo tshark -c 50 -i eth0 -f "port 1935" -x | awk '{print $18}' | tr -d '\n'); echo $t | grep -oP 'app((?!swfUrl).?){0,}|swfUrl((?!tcUrl).?){0,}|tcUrl((?!pageUrl).?){0,}|pageUrl(.?){100}|\.play\.(.?){100}'
    Running as user "root" and group "root". This could be dangerous.
    Capturing on eth0
    50 packets captured
    app...france24/fr/..flashVer...LNX
    swfUrl..6http://www.livestation.com/flash/player/5.4/playe.r.swf..
    tcUrl..$rtmp://media2.lsops.net/france24/fr/..fpad....capabilities.@m........audioCodecs.@.........videoCodecs.@o.........videoFunction.?.........
    pageUrl..6http://www.livestation.com/channels/5-france-24-french..objectEncoding..............{.e....;.@..E
    .play.............f24_livefr..{.e....;.@..E..(.L@.1....!.6...d....s...S..2P...{.e....;.@..E..R.M@.1....!.6
    À partir de ces informations on peut conclure que:

    Pour alarabia
    ubugnu@ubugnu-laptop:~$ rtmpdump -qv -a "live/" -W "http://www.livestation.com/flash/player/5.4/player.swf" -r "rtmp://media2.lsops.net/live/" -p "http://www.livestation.com/channels/57-al-arabiya-arabic-arabic" -y "alarabiy_ar_medium.sdp" | mplayer -
    Pour cnn
    ubugnu@ubugnu-laptop:~$ rtmpdump -qv -a "livestfslive-live/" -W "http://www.livestation.com/flash/player/5.4/player.swf" -r "rtmp://livestfslivefs.fplive.net/livestfslive-live/" -p "http://www.livestation.com/products/66-cnn-international" -y "jlivestfslive_cnn_en_veryhigh" | mplayer -
    (ce dernier ne marche pas il faut encore un hack vu que cette chaîne est payante sur le site)
    Pour euronews
    ubugnu@ubugnu-laptop:~$ rtmpdump -qv -a "live/" -W "http://www.livestation.com/flash/player/5.4/player.swf" -r "rtmp://media2.lsops.net/live/" -p "http://www.livestation.com/channels/12-euronews-franais" -y "euronews_fr_medium.sdp" | mplayer -
    Il est aussi possible d'aller chercher ces information dans le site même de la chaîne qui offre un streaming en live, on obtient:
    ubugnu@ubugnu-laptop:~$ t=$(sudo tshark -c 50 -i eth0 -f "port 1935" -x | awk '{print $18}' | tr -d '\n'); echo $t | grep -oP 'app((?!swfUrl).?){0,}|swfUrl((?!tcUrl).?){0,}|tcUrl((?!pageUrl).?){0,}|pageUrl(.?){100}|\.play\.(.?){100}'
    [sudo] password for ubugnu:
    Running as user "root" and group "root". This could be dangerous.
    Capturing on eth0
    50 packets captured
    app...rtpeuronewslive..flashVer...LNX,2,154,17..
    swfUrl..0http://fr.euronews.net/media/player_live_1_7.s.wf..
    tcUrl..)rtmp://178.32.100.43:1935/rtpeuronewslive..fpad....capabilities.@m........audioCodecs.@.........videoCodecs.@o.........videoFunction.?.........
    pageUrl..'http://fr.euronews.net/infos/en-direct/..objectEncoding.@.................w_.d...m.....p{..7.YRz:
    .play.............fre_euronews-flash-750.sdp.....{.e....;.@..E..4R.@.2..j..d..../.w/..3...............:(.%
    Le commande sera donc (attention il y'avait un point incrusté dans le lien du swf, justement dans l'extension):
    ubugnu@ubugnu-laptop:~$ rtmpdump -qv -a "rtpeuronewslive" -W "http://fr.euronews.net/media/player_live_1_7.swf" -r "rtmp://178.32.100.43:1935/rtpeuronewslive" -p "http://fr.euronews.net/infos/en-direct/" -y "fre_euronews-flash-750.sdp" | mplayer -
    Pour france24
    ubugnu@ubugnu-laptop:~$ rtmpdump -qv -a "france24/fr/" -W "http://www.livestation.com/flash/player/5.4/player.swf" -r "rtmp://media2.lsops.net/france24/fr/" -p "http://www.livestation.com/channels/5-france-24-french" -y "f24_livefr" | mplayer -
    cette dernière ne donne que le son, mais il est possible de chercher ces informations depuis le site de la chaîne qui offre aussi un streaming en live, on obtient:
    ubugnu@ubugnu-laptop:~$ t=$(sudo tshark -c 50 -i eth0 -f "port 1935" -x | awk '{print $18}' | tr -d '\n'); echo $t | grep -oP 'app((?!swfUrl).?){0,}|swfUrl((?!tcUrl).?){0,}|tcUrl((?!pageUrl).?){0,}|pageUrl(.?){100}|\.play\.(.?){100}'
    Running as user "root" and group "root". This could be dangerous.
    Capturing on eth0
    50 packets captured
    app...france24_live/fr..flashVer...LNX0,2,154,17..
    swfUrl..Ohttp://www.france24.com/fr/sites/all/modules/.maison/aef_player/flash/player.swf..
    tcUrl..3rtmp://stream2.france24.yacast.net/france24_live/fr..fpad....capabilities.@m.........audioCodecs.@.........videoCodecs.@o........videoFunction.?.........
    pageUrl..<http://www.france24.com/fr/aef_player_popup/france.24_player#..objectEncoding...{.e....;.@..E....
    .play.............f24_livefr......{.e....;.@..E..p..@.2.qN..h....d......U.S.e................?.'{......@..
    La commande sera donc (attention au point incrusté dans le lien du swf!):
    ubugnu@ubugnu-laptop:~$ rtmpdump -qv -a "france24_live/fr" -W "http://www.france24.com/fr/sites/all/modules/maison/aef_player/flash/player.swf" -r "rtmp://stream2.france24.yacast.net/france24_live/fr" -p "http://www.france24.com/fr/aef_player_popup/france.24_player#" -y "f24_livefr" | mplayer -
    Apparemment celui ci ne marche pas aussi, je crois donc qu'il faut modifier quelques paramètres de rtmpdump (si quelqu'un sait comment faire?) car il a l'air de ne pas pouvoir lire le flux
  6. On remarque aussi que pour la plupart de ces chaînes d'informations, on peut changer deux paramètres dans la valeur de -y: la qualité et la langue, essayez de changer "medium" en "high" ou "veryhigh" si votre connexion vous le permet, ou alors il y'a aussi "low", pour la langue aussi il y'a les trois choix "ar", "fr" ou "en", l'étape suivante serait de créer un script qui prend comme arguments la chaîne, la qualité et la langue et nous donne la vidéo en direct, ce sera pour une prochaine fois inchaâ'Allah.
Remarques:
  1. Il est en théorie possible de remplacer fshark par tcpdump:
    ubugnu@ubugnu-laptop:~$ sudo tcpdump -XX -i eth0 -s 0 -v tcp src port 1935
    Mais ça à l'air de ne pas prendre en considération la partie "Handshake part 3", celle là même où on retrouve toutes les informations dont a besoin rtmpdump, si quelqu'un trouve une solution elle sera la bienvenue car elle nous évitera d'installer tshark
  2. Parfois les sites de streming brouilles les pistes en renvoyant des refus de connexion puis des redirection au lecteur flash ainsi que des redéfinitions des paramètres (c'est le cas de http://tvweb360.com/), dans ce cas il serait préférable d'utiliser la version graphique de fshark à savoir wireshark pour pouvoir bien chercher dans les paquets, si vous avez de la chance vous obtiendrez un paquet appelé "Handshake part 3" où se trouveront réunies et classées toutes les informations:








  3. Mais parfois wireshark ne reconnait pas ce paquet et lui donne l'étiquette de "Audio Data[Malformed Paquet]" il faudra alors chercher les mots clé sois-même, dans tout les cas, le paquet se trouvera entre "Handshake part 2" et le premier "Invoke" (c'est dans ce dernier "Invoke" qu'il faudra chercher le paramètre <code>-y</code> et non pas dans "Handshake part 3"):