14/09/2009

Télécharger les Guignols de l’Info v2

"Nous, le téléchargement, on est pour! Si si, ça fait 50 fois qu'on télécharge le moment à l'Assemblée où la droite est ridicule!" (François Hollande)En avril nous publiions notre script bash pour télécharger les Guignols de l’Info. Malheureusement, et comme chaque année, Canal+ a changé les technologies de son site web, et notre méthode ne fonctionne plus aujourd’hui.

Nous sommes donc fiers de vous présenter la version entièrement réécrite de ce script pour télécharger les Guignols de l’Info en cette rentrée 2009!

La technique

Vous vous souviendrez peut-être que notre précédente technique profitait d’une faille de sécurité sur le site de Canal+ : bien que le player exploitait le RTMP, les fichiers étaient toujours accessibles en HTTP. Nous en profitions donc pour simplement wget les différentes vidéos. Évidemment cette année le HTTP est entièrement bloqué et il faut donc passer par le RTMP.

Le hic, c’est que récupérer une URL RTMP relève du parcours du combattant. Mais il y a quelques jours jeantube est passé nous signaler une URL très, très intéressante : http://www.canalplus.fr/rest/bootstrap.php?/bigplayer/search/guignols. Celle-ci correspond, je pense, au résultat AJAX des recherches de vidéo sur le site de Canal+.

Ce qui est génial avec ce fichier, c’est qu’il comporte en clair les URL rtmp://. Il ne nous reste plus qu’à utiliser un petit logiciel nommé rtmpdump pour enregistrer localement le fichier.

Le script

Pour automatiser la tâche, je vous ai rédigé un petit script bash très simple qui à coups de sed et grep récupère l’URL d’un épisode et lance le rtmpdump dessus. Il essaye toujours de prendre la plus haute qualité disponible et s’utilise comme le précédent:

./getGuignols.sh    #Télécharge l'épisode de la veille
./getGuignols.sh 0  #Télécharge l'épisode d'aujourd'hui
./getGuignols.sh 3  #Télécharge l'épisode d'il y a trois jours

Le script est publié sous GPLv3 et j’ai inclu dans l’archive le binaire rtmpdump distribué sous GPLv2. Le tout se télécharge ici

A noter que le code est très facile à comprendre et devrait être aisément adapté à d’autres émissions publiées sur le site de Canal+.

Remerciements

Je remercie jeantube sans qui nous ne serions nulle part et les quelques acharnés de Chrogeek.com qui ont permis de démêler le schmilblik.

  1. | #1

    Tu roxes sévère du boudin :))

    Des que j’ai un peu de temps, je vais inspecter tout ça 🙂

    Merci !

  2. | #2

    😉 🙂 🙂

  3. | #3

    HUm ! Parfait ! ça marche à merveille !!!
    Récupéré aujourd’hui le flux d’hier (normal vu l’heure)
    Merci beaucoup !!!

  4. Uytko
    | #4

    Salut, G-E-N-I-A-L ! Vite adapté/adopté pour prendre les guignols/le zapping et réencoder le tout pour mon baladeur. Merci

  5. Alex
    | #5

    Bonjour tout le monde. Alors là je dois être débile, mais bon, j’ai le lien rtmp, mais impossible de faire marcher le logiciel “rtmpdump” car ça me donne une archive tar.gz dont je ne comprend pas le fonctionnement… J’ai décompressé cette archive, et je me retrouve avec un dossier plein de fichiers a extensions inconnues dont je ne sais pas quoi faire 🙁

  6. | #6

    @Alex Il y a trois fichiers dans le .tar.gz : getGuignols.sh, rtmpdump et LICENSES. Je ne sais pas ce que tu utilises pour décompresser ça mais l’erreur doit venir de là 😀

    Oh, et c’est un logiciel pour systèmes Linux (quoique probablement compatible avec tous les Unix). Si tu es sous Windows et que tu ne sais même pas ce que veut dire Unix, passe ton chemin.

  7. asran298
    | #7

    et sous windows on fait comment?

  8. Alex D
    | #9

    version Mac:

    #!/bin/bash

    # Script getGuignols.sh permettant de télécharger l’épisode des Guignols de l’Info en HTTP
    # Écrit par Tito pour Geekfault (http://geekfault.org)
    # Distribué sous license GNU/GPLv3

    # UTILISATION :
    # $ ./getGuignols.sh #Récupère l’épisode de la veille
    # $ ./getGuignols.sh 0 #Récupère l’épisode d’aujourd’hui
    # $ ./getGuignols.sh 3 #Récupère l’épisode d’il y a 3 jours

    # Plus d’infos : http://geekfault.org/

    if [ -z $1 ]; then # Par défaut, télécharge l’épisode de la veille
    DATE=1
    else
    DATE=$1
    fi

    echo -e “33[1m * Recherche de l’épisode des Guignols de l’Info du date `date -v-“$DATE”d +%d/%m/%y`33[0m”
    IDATE=`date -v-“$DATE”d +%y%m%d`

    RTMP=$(wget http://www.canalplus.fr/rest/bootstrap.php?/bigplayer/search/guignols -O data)
    RTMP=$(sed -e “s/[]/\\”$’\n'”/g” data|grep ‘^rtmp’ |grep ‘LES_GUIGNOLS’|grep $IDATE |grep ‘_HD\.’)
    EXT=”mp4″

    if [ -z “$RTMP” ]; then
    RTMP=$(sed -e “s/[]/\\”$’\n'”/g” data|grep ‘^rtmp’ |grep ‘LES_GUIGNOLS’|grep $IDATE |grep ‘_H\.’)
    EXT=”flv”
    fi
    if [ -z “$RTMP” ]; then
    RTMP=$(sed -e “s/[]/\\”$’\n'”/g” data|grep ‘^rtmp’ |grep ‘LES_GUIGNOLS’|grep $IDATE |grep ‘_L\.’)
    fi
    if [ -z “$RTMP” ]; then
    echo -e “33[1;31m * Désolé, nous n’avons pas trouvé d’épisode des Guignols de l’Info pour le `date -v-“$DATE”d +%d/%m/%y`33[0m”
    else
    echo -e “33[1m * L’épisode du `date -v-“$DATE”d +%d/%m/%y` a été trouvé ! Lancement du téléchargement…33[0m”
    echo -e ” $RTMP”
    ./rtmpdump -r $RTMP -o “Guignols_”$IDATE.$EXT
    echo -e “33[1m * Le fichier téléchargé est enregistré en `date -v-“$DATE”d +%d/%m/%y`.$EXT ! Bon visionnage ;)33[0m”
    fi

  9. | #10

    Merci Alex! La seule incomatibilité avec Mac serait donc la commande date?

    Oh et désolé pour le délai, le système anti-spam a trouvé ton commentaire suspect, j’ai dû le valider à la main ^^

  10. Martin
    | #11

    Pour la version Mac, il faut compiler ça avec quoi?

  11. | #12

    @Martin
    C’est un script, il ne faut pas le compiler, il est directement exécutable 😉

  12. groslourd
    | #13

    Oui mais non, faut pas abuser non plus:
    rtmpdump: Taille totale des paquets (installation): 101,19 Mo
    Ça ‘boost’ peut-être mais il prend ça place le cochon!
    Dommage, merci quand même…

  13. | #14

    Je ne sais pas comment tu t’en sors… Je founis rtmpdump compilé dans l’archive et il fait 126ko.

  14. Olorin
    | #15

    Et pour les idiots qui utilise encore windows, pas moyen?

  15. | #16

    Roooh 😀 Bon ça va j’avoue tout.

    Il y a un logiciel qui s’appelle Canaille Plus qui permet de le faire. Toutes les infos ici : http://www.chrogeek.com/2009/10/canaille-plus-ou-comment-telecharger-les-videos-du-site-canal-plus/

  16. Olorin
    | #17

    Merci bien 😉

  17. psychik
    | #18

    @jeantube

    salut ,

    aparement depuis vendredi 13 il ne marche plus , vendredi il s’obstinais a prendre l’emission de jeudi , j’ai rententé aujourd’hui , il ne marche plus du tout :/

    ils ont encore du changer leurs routines

  18. lb
    | #19

    @psychik
    Testé pour la première fois aujourd’hui et ça marche !
    Je le rajoute à ma crontab.
    Merci

  19. | #20

    Oui le disfonctionnement était dû à un bug chez Canal+, pas dans le script 😉

  20. | #21

    Salut,
    Ton script m’a été d’une grande utilité et je t’en remercie vivement. Je regarde beaucoup de video sur le site de canal. Je me suis permis de modifier le script pour qu’il soit un peu plus modulable. Normalement on peut avoir toute ses videos préférées.

    #!/bin/bash

    # Script getGuignols.sh permettant de télécharger l’épisode des Guignols de l’Info en HTTP
    # Écrit par Tito pour Geekfault (http://geekfault.org)
    # Distribué sous license GNU/GPLv3

    # UTILISATION :
    # $ ./getcanal.sh [guignols zappping minute] #Récupère l’épisode de la veille
    # $ ./getcanal.sh minute 0 #Récupère l’épisode de “Une Minute Avant” d’aujourd’hui
    # $ ./getGuignols.sh minute 3 #Récupère l’épisode d’il y a 3 jours

    # Plus d’infos : http://geekfault.org/
    #Modified By Nolaan

    Emission=$1
    adresse_recherche=http://www.canalplus.fr:80/rest/bootstrap.php?/bigplayer/search/$1
    echo $adresse_recherche $Emission
    if [ -z $2 ]; then # Par défaut, télécharge l’épisode de la veille
    DATE=”1 days ago”
    else
    DATE=”$2 days ago”
    fi

    echo -e “33[1m * Recherche du `date +%d/%m/%y –date “$DATE”`33[0m”
    IDATE=`date +%y%m%d –date “$DATE”`

    RTMP=`wget -qO – $adresse_recherche |sed ‘s/[]/\n/g’ |grep ‘^rtmp’ |grep -i $Emission |grep $IDATE |grep ‘_HD\.’`
    EXT=”mp4”
    echo $RTMP

    if [ -z “$RTMP” ]; then
    RTMP=`wget -qO – http://www.canalplus.fr:80/rest/bootstrap.php?/bigplayer/search/$Emission |sed ‘s/[]/\n/g’ |grep ‘^rtmp’ |grep -i $Emission |grep $IDATE |grep ‘_H\.’`
    EXT=”flv”
    fi
    if [ -z “$RTMP” ]; then
    RTMP=`wget -qO – $adresse_recherche |sed ‘s/[]/\n/g’ |grep ‘^rtmp’ |grep -i $Emission |grep $IDATE |grep ‘_L\.’`
    fi
    if [ -z “$RTMP” ]; then
    echo -e “33[1;31m * Désolé, nous n’avons pas trouvé d’épisode pour le `date +%d/%m/%y –date “$DATE”`33[0m”
    else
    echo -e “33[1m * L’épisode du `date +%d/%m/%y –date “$DATE”` a été trouvé ! Lancement du téléchargement…33[0m”
    echo -e ” $RTMP”
    rtmpdump -c 80 -r $RTMP -o `date +%y%m%d –date “$DATE”`_$Emission.$EXT
    echo -e “33[1m * Le fichier téléchargé est enregistré en `date +%y%m%d –date “$DATE”`.$EXT ! Bon visionnage ;)33[0m”
    fi

  21. hobeur
    | #22

    bravo ca rox du poulet !
    par contre il doit y avoir un problème de caractère dans le script pour Mac
    j’ai essayé de le copier coller, de remplacer toutes les guillemets étrange par des vrai, je pense que tu devrais mettre un lien vers le fichier originel. (j’ai utilisé une VM pour télécharger)

  22. hobeur
    | #23

    Hello !
    Je crois que le script ne fonctionne plus depuis la nouvelle année 🙁
    étant un grand fan, je m’étais fait ma petite tache dans la Crontab pour aller les caller sur le NAS.
    Une fois le problème identifié, je veux bien jeter un oeil pour le corriger. Si l’erreur est de mon coté, ou que ce n’est que momentané, je m’en excuse

    encore bravo

  23. wan
    | #24

    @hobeur
    Bonjour,
    je confirme bien que le script ne fonctionne plus depuis la mi décembe. Donc pour récupérer les guignols faudra faire autrement.

  24. | #25

    Effectivement, ça ne fonctionne plus… En même temps on savait qu’un jour ou l’autre Canal changerait sa technologie ^^

    Malheureusement tous les logiciels que je connais (urecorder pour ne citer que lui) qui permettaient de télécharger sur CanalPlus.fr utilisaient la même astuce (détourner les résultats d’une recherche) et donc plus aucun ne fonctionne avec Les Guignols de l’Info…

    Si vous voulez vraiment enregistrer l’épisode il va falloir chipoter avec rmptsrv/rtmpdump jusqu’à une nouvelle faille/astuce

  25. Forty
    | #26

    Salut,

    voilà un truc qui marche aujourd’hui :

    ———————————————————————————
    #! /bin/bash

    # GetGuignols Copyright (C) 2011 forty
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.

    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.

    # You should have received a copy of the GNU General Public License
    # along with this program. If not, see .

    MAIN_PAGE_URL=”http://www.canalplus.fr/c-humour/pid1784-c-les-guignols.html”
    echo -n “Looking for current video…”
    current=$(curl $MAIN_PAGE_URL 2>/dev/null | grep ‘var videoEnCours = ‘ | cut -d”‘” -f 2)
    echo ” OK (#$current)”

    INFO_URL=”http://service.canal-plus.com/video/rest/getVideosLiees/cplus/$current”

    echo -n “Looking for available videos…”
    urls=( $(curl “$INFO_URL” 2>/dev/null | egrep -o ‘[^<]*’ | cut -d’>’ -f2 | cut -d'<' -f1) )
    dates=( $(for url in ${urls[@]}; do tmp="$(echo $url | egrep -o 'QUOTIDIEN_[[:digit:]]{6}')"; echo ${tmp:10}; done) )
    count=${#urls[*]}
    echo "OK ($count)"

    declare -a map

    echo "# date"
    for ((i=0;i ${dates[$i]}”
    map[${dates[$i]}]=${urls[$i]}
    done

    read -p “Enter number : ” number
    url=${urls[$number]}
    date=${dates[$number]}
    echo “URL = $url”

    ./rtmpdump -r “$url” -o “lesguignols_$date.mp4″ 2>&1 | awk ‘BEGIN {RS=”\r”} //{print $0; fflush(); }’ | grep –line-buffered ‘%’ | while read line; do echo -ne “\r$line”; done
    echo -e “\rdone ”

    ———————————————————————————

    J’espère que ça sera utile à quelqu’un.

    /Forty

  26. Tidus
    | #27

    Dommage le script ne marche plus.

  27. laura
    | #28

    arf , une autre solution svp ? ben laden c’est le meilleur moment :p

  28. Forty
    | #29

    Oui, la structure de la page des guignols sur le site canal+ a été modifié le lendemain du jour ou j’ai posté mon script, je ne sais pas si il y a un lien de cause à effet.
    La ligne à modifier est
    current=$(curl $MAIN_PAGE_URL 2>/dev/null | grep ‘var videoEnCours = ‘ | cut -d”‘” -f 2)
    à remplacer par :
    current=$(curl $MAIN_PAGE_URL 2>/dev/null | grep ‘videoId =’ | cut -d”\”” -f 2)

    Ça marche assez bien pour moi, j’arrive à télécharger les vidéos du jour même, et selon les jours, les autres vidéos de la semaine (certain jours il ne trouve aucune vidéos, notamment le week end il me semble).
    Je précise en passant que pour que le script marche, il faut le binaire rtmpdump que j’avais trouvé quelquepart sur cette page.

    /Forty

  29. | #30

    bonjour 🙂 l’article date a 2009 mais bon je demande comeme ! votre script bash la es que c’est possible d’avoir le meme sur windows en batch sous dos ? merci.

  1. | #1