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"):



vendredi 18 mars 2011

Regarder AlJazeera en une ligne de commande

Avant tout il faut que vous ayez un lecteur vidéo qui puisse s'utiliser en ligne de commande, normalement il doit déjà y avoir totem mais je n'ai pas réussi à le faire fonctionner avec le flux en direct, quoi qu'il en soit, il existe deux lecteurs qui sont bien meilleurs:
  • Le complet: vlc
ubugnu@ubugnu-laptop:~$ sudo apt-get install vlc

  • Le léger: mplayer
ubugnu@ubugnu-laptop:~$ sudo apt-get install mplayer
Après avoir installé l'un de ces paquets, il vous faut encore installer deux paquets debian, téléchargez les et installez les dans l'ordre (avec un simple clique sur le fichier .deb):
ubugnu@ubugnu-laptop:~$ wget http://ubuntu.mirror.cambrium.nl/ubuntu//pool/universe/r/rtmpdump/librtmp0_2.3-2_i386.deb 
ubugnu@ubugnu-laptop:~$ wget http://security.ubuntu.com/ubuntu/pool/universe/r/rtmpdump/rtmpdump_2.3-2_i386.deb
C'est tout maintenant vous pouvez regarder AlJazeera en directe avec la commande:
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 -
  • Si vous avez installé vlc plutôt que mplayer, remplacez dans la commande ci dessus "mplayer" par "cvlc"
  • Si vous voulez regarder AlJazeera en Anglais remplacez "_ar_" par "_en_"
  • Vous pouvez modifier la qualité de l'image selon la vitesse de votre connexion, pour ce modifiez "medium" dans la commande ci dessus, les valeurs possibles sont: "verylow", "low", "medium", "high", "veryhigh", si vous avez une bonne connexion optez pour "veryhigh" qui vous donnera une image haute résolution.

samedi 5 mars 2011

Télécharger automatiquement à partir de MegaUpload

Mise à jour: après les changement des modalités opéré par megaupload.com concernant les téléchargements j'ai modifié le script, l'ancien ne marche plus

Cette application vous permettra de:
  1. Stocker les liens des téléchargements dans un fichier
  2. Lancer l'application avec une ligne de commande qui va lire lien par lien et télécharger le fichier correspondant
  3. Arrêter le téléchargement quand vous voulez et le reprendre quand vous voulez
  4. Au fur et à mesure ajouter des liens au fichier même si c'est entrain de télécharger
Commencez par créer le fichier des liens dans le dossier qui va accueillir les téléchargements:
ubugnu@ubugnu-laptop:~$ cd Téléchargements/
ubugnu@ubugnu-laptop:~$ touch .liste
puis l'application elle même avec des droits de superutilisateur
ubugnu@ubugnu-laptop:~$ sudo nano /usr/bin/mega
et mettre

#!/bin/bash
#for l in $@

list=`cat .list`
for l in $list
do
echo "downloading $l..."
url=`wget -qO- $l | grep -P "id=\"downloadlink\"" | grep -oP "(((http)\://){1}\S+)" | grep "megaupload.com\/files" | tr -d "\""`
echo "url found: [$url] sleeping 46 sec..."
sleep 46
wget -c $url
echo "$l downloaded" `date`
sed -i '1 d' .list
done;
le rendre exécutable
ubugnu@ubugnu-laptop:~$ sudo chmod +x /usr/bin/mega
Maintenant il suffit de remplit le fichier .liste avec des lien (ligne par ligne)puis de rentrer dans le dossier et de lancer l'application pour télécharger la liste que vous aurez mise dans le fichier .list
ubugnu@ubugnu-laptop:~$ cd Téléchargements/
ubugnu@ubugnu-laptop:~$ mega

Automatic download from MegaUpload

Updated: script updated after megaupload.com changes their downloads system

This script allows you to:
  1. Store MegaUpload links in a file .list
  2. Run the script on a shell
  3. Stop and resume downloads at any time
  4. Add links to the files even when working
Create a file .list (hidden) in the downloads folder
ubugnu@ubugnu-laptop:~$ cd Downloads/
ubugnu@ubugnu-laptop:~$ touch .list
than create the script file
ubugnu@ubugnu-laptop:~$ sudo nano /usr/bin/mega
and put

#!/bin/bash
#for l in $@

list=`cat .list`
for l in $list
do
echo "downloading $l..."
url=`wget -qO- $l | grep -P "id=\"downloadlink\"" | grep -oP "(((http)\://){1}\S+)" | grep "megaupload.com\/files" | tr -d "\""`
echo "url found: [$url] sleeping 46 sec..."
sleep 46
wget -c $url
echo "$l downloaded" `date`
sed -i '1 d' .list
done;
make it executable
ubugnu@ubugnu-laptop:~$ sudo chmod +x /usr/bin/mega
To begin downloads, populate the .list file with MegaUpload links (line by line) than enter to the download folder and run the script
ubugnu@ubugnu-laptop:~$ cd Downloads/
ubugnu@ubugnu-laptop:~$ mega