#!/bin/bash # # But: Telecharger des videos de canalplus.fr et les mettre dans une playlist # Auteur : Ras' # Dépendances : Zenity, wget # Licence : Ce script est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier # selon les termes de la Licence Publique Générale GNU ( GNU GPL ) publiée par la Free Software # Foundation. # # Merci à beudbeud pour l'implémentation de la fonction d'automatisation via cron # version=v1.400 todo=" Aucune c'est affreux ! Oo' Mais n'hésitez surtout pas à proposer les votres sur le forum : http://forum.ubuntu-fr.org/viewtopic.php?id=200149 " ############################################## Fonctions basiques ############################################ # Fonction qui permet l'affichage en couleur dans le terminal color() { printf '\033[%sm%s\033[m\n' "$@" } # Fonction qui quitte le script lorsqu'on clique sur annuler dans zenity annuler () { if [[ $? == "1" ]] then exit 0 fi } ############################################################################################################## ################################################### Display ################################################## # Fonction qui permet l'affichage via zenity ou bien dans le terminal function display { titre="$1" texte="$2" type="$3" if ( grep -q GTK "$parent_dir"/.canal_config ) then if [[ "$type" == "--progression" ]] then echo "$titre $texte" else zenity "$type" --title="$titre" --text="$texte" fi else echo `color 1 "$titre"` echo `color 34 "$texte"` fi } ############################################################################################################## ############################################### Dossier source ############################################### # Définition de $parent_dir, dossier ou le script et le fichier .canal_config sont enregistrés parent_dir=$( dirname "$0" ) if [[ "$parent_dir" == "." ]] then parent_dir=$( pwd ) fi cd $parent_dir ############################################################################################################## ################################################# Dépendances ################################################ # Fonction qui installe automatiquement les dépendances nécessaires aux diverses conversions function dependances { if [[ ! `which ffmpeg` ]]; then dependances="ffmpeg" elif [[ ! `which faac` ]]; then dependances="$dependances faac" elif [[ ! `which libfaac0` ]]; then dependances="$dependances libfaac0" elif [[ ! `which ffmpeg2theora` ]]; then dependances="$dependances ffmpeg2theora" elif [[ ! `which mencoder` ]]; then dependances="$dependances mencoder" fi if ! [[ -z $dependances ]] then echo "Ajout du dépot medibuntu dans /etc/apt/sources.list.d/medibuntu.list" echo "deb http://fr.packages.medibuntu.org/ hardy free non-free" >> medibuntu.list sudo cp -f medibuntu.list /etc/apt/sources.list.d/ echo "Mise à jour de la liste des paquets (apt-get update)" sudo apt-get update echo "Installation des dépendances, les paquets suivants seront installés : $dependances" sudo apt-get install $dependances echo "Toutes les dépendances sont désormais installées. Vous pouvez désormais convertir vos vidéos" fi } ############################################################################################################## ########################################## Function Mise à jour auto ########################################## # Mise à jour automatique du script si la version présente sur le net n'est pas la même que celle ci # Vérification de la connection internet par la même occasion function maj_auto { cd /tmp rm -f canal* wget "http://ibidems.free.fr/ras/script/canal" &>/dev/null if ! [[ -f canal ]] then display "Fin du script" "Veuillez vérifier votre connection internet et relancer le script." "--warning" exit 0 fi new=$( cat canal | grep "version=[v]" | cut -f2 -d "=" ) wget "http://ibidems.free.fr/ras/script/$new.txt" &>/dev/null if ! [[ "$new" == "$version" ]] then text="La version $new est disponible, voici la liste des nouveautées : $( cat $new.txt ) Voulez vous installer cette version ?" if ( grep -q GTK "$parent_dir"/.canal_config ) then display "Mise à jour" "$text" "--info" if [[ $? == "0" ]] then maj="oui" fi annuler else echo "$text" read -p "Tapez oui pour installer la nouvelle version : " maj fi if [[ $maj == "oui" ]] then echo "Mise à jour du script en cours..." rm -f "$parent_dir"/canal cp canal "$parent_dir"/ chmod +x "$parent_dir"/canal rm -f canal* text="Une mise à jour a été effectuée vers la version $new Merci de bien vouloir relancer le script." display "Mise à jour" "$text" "--info" exit 0 fi fi cd "$parent_dir" } ############################################################################################################### ####################################################### Help ################################################## # Fonction --help function _help { help="Télécharger les quotidiennes (ou pas) de Canal+ Créé par Ras' Usage : ./canal [ARGUMENT] Arguments disponibles : -m, --menu Ouvre un menu permettant de choisir parmis les options suivantes -c, --config Configurer le script -d, --date Ouvre un calendrier Zenity pour choisir la date -a, --alacarte Choisir exeptionnellement les émissions (sans changer la configuration) -l, --lanceur Rajoute une icône de lancement dans le menu \"Applications > Son et Video\" -cr, --cron Permet l'ajout du tâche planifié -b, --bug Ouvre Firefox à l'adresse : http://forum.ubuntu-fr.org/viewtopic.php?id=200149 Pour les rapports de bug -h, --help Affiche cette aide et quitte -?, --about Affiche les informations sur le script -dep, Installation des dépendances --dependances (nécessite d'être root) Installation manuelle des dépendances (pour la conversion) : _Ajouter la source mediubuntu : echo 'deb http://fr.packages.medibuntu.org/ hardy free non-free' >> medibuntu.list sudo cp -f medibuntu.list /etc/apt/sources.list.d/ _Mettre à jour de la liste des paquets sudo apt-get update _Installer les paquets suivants : ffmpeg faac libfaac0 # Ipod et PSP ffmpeg ffmpeg2theora # mkv mencoder # avi, Archos, Creative Zen, Iriver et Meizu" display "Menu Help" "$help" "--info" exit 0 } ############################################################################################################### ################################################# Menu Son et Vidéo ############################################ # Ajout d'une entrée dans le menu Applications > Son et vidéo function _lanceur { if ! [[ -f logo64x64.svg ]] then wget -q http://ibidems.free.fr/ras/script/logo64x64.svg fi echo "[Desktop Entry] Type=Application Encoding=UTF-8 Name=Canal GenericName=Canal Comment=Script permettant de télécharger les quotidiennes du site de Canal+ Icon=$parent_dir/logo64x64.svg Exec=$parent_dir/canal --menu Terminal=false StartupNotify=false Categories=Application;AudioVideo" > canal.desktop text="Le Script à besoin de votre mot de passe utilisateur pour créer l'entrée du menu 'Applications > Son et videos'. Ce mot de passe ne sera évidemment pas sauvegardé ni utilisé ultérieurement par le script." display "Droits root nécessaire" "$text" "--warning" if ( grep -q GTK "$parent_dir"/.canal_config ) then gksudo 'mv -f canal.desktop /usr/share/applications/' else sudo 'mv -f canal.desktop /usr/share/applications/' fi text="Une entrée 'Canal' à été ajouté au menu 'Applications > Son et videos'. Merci de bien vouloir relancer le script." display "Menu ajouté" "$text" "--info" sudo -k exit 0 } ################################################################################################################ ################################################### Configuration ############################################## ############################################## # Externalisation des fonctions "choix des émissions" et "true/false" de la configuration pour pouvoir fonctionner avec l'option "alacarte" # true_false : Fonction permettant d'afficher par défaut les options de l'ancien fichier de config function true_false { if ( grep -q $1 .canal_config.bak &>/dev/null ) then echo "TRUE" else echo "FALSE" fi } # choix_emissions : fonction écrivant une abreviation du nom des émissions choisies dans le fichier .canal_config function choix_emissions { rm -f "$parent_dir"/.alacarte zenity --list --checklist --height=580 --width=400\ --title="Configuration en cours... 4/7" \ --text="Choix des émissions à télécharger"\ --column="" --column="" --column="Emissions" \ --hide-column=2 \ --separator=" " \ `true_false ZAP` ZAP "Le zapping"\ `true_false PJA` PJA "Le petit journal actu de Yann Barthès"\ `true_false GUI` GUI "Les guignols de l'info"\ `true_false MET` MET "La météo de Louise Bourguoin"\ `true_false PJP` PJP "Le petit journal people de Yann Barthès"\ `true_false SAV` SAV "Le service après vente d'Omar et Fred"\ `true_false BAQ` BAQ "La boite à questions"\ `true_false RDP` RDP "La revue de presse de Chris Esquerre"\ `true_false STO` STO "La chronique de Sebastien Tohen"\ `true_false ADM` ADM "L'avis de Mouloud"\ `true_false DSH` DSH "Le daily show"\ `true_false SGU` SGU "La chronique de Stephane Guillon"\ `true_false IDB` IDB "Les infos de Blakowski" \ `true_false CDA` CDA "Le champion de l'actu"\ `true_false GRO` GRO "Le Groland"\ `true_false TAC` TAC "Les têtes à claques"\ `true_false PEP` PEP "Les Pépites du net" \ `true_false MDH` MDH "Le meilleur du hier (semaine courante)" >> "$parent_dir"/$1 } ############################################## ############################################## # Début de la configuration, le script est arrêté à la fin de la création du fichier .canal_config function _config { cd "$parent_dir" mv .canal_config .canal_config.bak &>/dev/null echo "Configuration en cours..." ############################################## # Vérification de la présence de zenity, installation si nécessaire if [[ ! `which zenity` ]] then gksudo -m "Veuillez entrer votre mot de passe pour installer Zenity et continuer l'installation en graphique. Sinon cliquez sur annuler." "apt-get install -y zenity" fi ############################################## # Choix du répertoire de téléchargement parent, un sous répertoire Canal+ est ensuite créé zenity --info --title="Configuration en cours... 1/7" --text="Choisir un répertoire pour le téléchargement des émissions ( un sous répertoire \"Canal+/\" y sera automatiquement créé )" REP=$( zenity --title="Choisir un répertoire pour le télécharchement des émissions" --file-selection --directory ) echo "$REP" > .canal_config ############################################## # Choix du lecteur vidéo : vlc, totem ou mplayer zenity --list --list --radiolist --height=210 --width=200 \ --title="Configuration en cours... 2/7" \ --text="Choix du lecteur de vidéos"\ --column="" --column="" --column="mode" \ --hide-column=2 \ --separator=" " \ `true_false vlc` vlc "vlc media player"\ `true_false mplayer` mplayer "mplayer movie player"\ `true_false totem` totem "totem" >> .canal_config ############################################## # Choix du mode de fonctionnement : quotidien, historique par date ou historique par émission zenity --list --list --radiolist --height=225 --width=850 \ --title="Configuration en cours... 3/7" \ --text="Choix du mode de fonctionnement"\ --column="" --column="" --column="mode" \ --hide-column=2 \ --separator=" " \ `true_false QUO` QUO "Quotidien : les anciennes vidéos sont supprimées et remplacées par les nouvelles"\ `true_false HIS` HIS "Historique : un dossier est créé pour chaque jour de diffusion, les anciennes vidéos ne sont pas supprimées"\ `true_false HEM` HEM "Historique : un dossier est créé pour chaque émission, les anciennes vidéos ne sont pas supprimées" >> .canal_config ############################################## # Choix des émissions à télécharger, utilisation de la fonction choix_emissions choix_emissions ".canal_config" ############################################## # Choix de la qualité des vidéos : high ou low zenity --list --list --radiolist --height=190 --width=650 \ --title="Configuration en cours... 5/7" \ --text="Choix de la qualité de lecture des vidéos"\ --column="" --column="" --column="mode" \ --hide-column=2 \ --separator=" " \ `true_false HIGH` HIGH "High : Optimisation de la qualité d'image, vidéos plus lourde "\ `true_false LOW` LOW "Low : Optimisation de la vitesse de téléchargement, qualité d'image moins bonne" >> .canal_config ############################################## # Choix d'un mode de conversion vidéo, conversion des vidéos dans différents formats (lisibles par différents lecteur mp3/vidéo) choix=$( zenity --list --list --radiolist --height=370 --width=585\ --title="Configuration en cours... 6/7" \ --text="Le script permet de convertir les vidéos dans d'autres format que l'original (.flv) Cette opération n'est réellement utile que si vous désirez lire les vidéos sur un lecteur vidéo portable. Choisissez 'Aucune conversion' si vous ne désirez pas convertir les vidéos."\ --column="" --column="" --column="Format de conversion" \ --hide-column=2 \ --separator=" " \ `true_false FLV` FLV "Aucune conversion"\ `true_false AVI` AVI "Convertir les vidéos au format .avi"\ `true_false MKV` MKV "Convertir les vidéos au format .mkv"\ `true_false IPOD` IPOD "Convertir les vidéos en un format lisible par un iPod"\ `true_false ARCHOS` ARCHOS "Convertir les vidéos en un format lisible par un Archos / Creative Zen"\ `true_false IRIVER` IRIVER "Convertir les vidéos en un format lisible par un iRiver"\ `true_false MEIZU` MEIZU "Convertir les vidéos en un format lisible par un Meizu"\ `true_false PSP` PSP "Convertir les vidéos en un format lisible par une PSP "\ ) echo "CONVERT=$choix" >> .canal_config if ! [[ $choix == "FLV" ]] then zenity --info --title="Configuration en cours... 6/7" \ --text="Des dépendances sont nécessaires pour cette conversion. Pour les installer automatiquement, ouvrez un terminal et tapez : cd `pwd` sudo ./canal --dependances Sinon regardez dans l'aide les dépendances nécessaires pour les installer manuellement" fi ############################################## # Choix du mode d'utilisation graphique ou console, en graphique, Zenity affiche des barres de progression zenity --question --title="Configuration en cours... 7/7" --width=700 --text="Voulez vous utiliser l'interface graphique ? En cliquant sur valider, le script affichera une barre de progression GTK+ lors du téléchargement des émissions. Sinon le script sera silencieux jusqu'à la fin des téléchargements (les détails seront néanmoins disponibles en console)" if [[ $? == "0" ]] then echo "GTK" >> .canal_config fi ############################################## # Inscription de la version du script dans le fichier de config echo "version=$version" >> .canal_config ############################################## #Fin de la configuration, le script est arreté rm -f .canal_config.bak echo "Configuration terminée" exit 0 } ################################################################################################################ ########################################## Planification de tache via cron ##################################### # Ajout d'une entrée dans crontab function _cron { grep -q CRON .canal_config >> /dev/null 2>&1 if (test $? -eq 1) then for days in `seq 1 7` do var[days]="TRUE" done fi if ( grep -q CRON "$parent_dir"/.canal_config ) then zenity --question --text="Une tâche est déjà planifiée. Voulez-vous la supprimer ou la modifier ? ( 'Valider' pour la supprimer ; 'Annuler' pour la modifier )" if [[ $? == "0" ]] then crontab -l >> tempcrontab sed -i '/canal/d' tempcrontab crontab tempcrontab rm tempcrontab sed -i '/CRON/d' "$parent_dir"/.canal_config zenity --info --text="Tâche supprimée" exit annuler else crontab -l | grep canal | awk -F'*' '{print $3}' >> tempcrontab for days in `seq 1 7`; do if ( grep -q $days tempcrontab ) then var[days]="TRUE" else var[days]="FALSE" fi done rm tempcrontab annuler fi fi crontab -l | grep DISPLAY >> /dev/null 2>&1 if (test $? -eq 1 ) then echo 'DISPLAY=":0.0"' > tempcrontab fi crontab -l >> tempcrontab sed -i '/canal/d' tempcrontab JOURS=$(zenity --list --checklist --width=500 --height=447 \ --title "Sélectionner les jours" \ --text="Veuillez sélectionnez les jours :" \ --separator="," \ --hide-column=2 \ --column="choix" --column="N° jour" --column="jours" \ ${var[1]} "1" "lundi" \ ${var[2]} "2" "mardi" \ ${var[3]} "3" "mercredi" \ ${var[4]} "4" "jeudi" \ ${var[5]} "5" "vendredi" \ ${var[6]} "6" "samedi" \ ${var[7]} "7" "dimanche" \ ) annuler crontab -l | grep canal >> /dev/null 2>&1 if (test $? -eq 0) then HH=`crontab -l | grep canal | awk -F' ' '{print $2}'` MM=`crontab -l | grep canal | awk -F' ' '{print $1}'` else HH=hh MM=mm fi CHHEURE=$( zenity --entry \ --title="Heure" \ --text="Saisissez l'heure du lancement exemple : 20H00" \ --entry-text "$HH"H"$MM" ) annuler HEURE=`echo $CHHEURE | awk -F"H" '{print $1}'` MIN=`echo $CHHEURE | awk -F"H" '{print $2}'` echo "$MIN $HEURE * * $JOURS $parent_dir/canal" '#canal quotidienne' >> tempcrontab #canal quotidienne crontab tempcrontab zenity --text-info --filename=tempcrontab --width=500 rm tempcrontab sed -i '/CRON/d' "$parent_dir"/.canal_config echo CRON >> .canal_config exit } ################################################################################################################ ################################################## Rapport de bug ############################################## # Fonction --bug ouvre Fx sur la page du forum function _bug { text="Le script va ouvrir Firefox à l'adresse http://forum.ubuntu-fr.org/viewtopic.php?id=200149 Veuillez y poster un descriptif clair de votre problème." display "Rapport de bug" "$text" "--info" firefox "http://forum.ubuntu-fr.org/viewtopic.php?id=200149" exit 0 } ################################################################################################################ ####################################################### About ################################################### # Fonction --about function _about { text="Créateur : Ras' Version : $version License : Ce programme est diffusée selon les termes de la Licence Publique Générale GNU publiée par la Free Software Foundation. Vous êtes libre de l'utiliser, le modifier et le redistribuer selon les termes de la license GNU GPL Todo list : $todo " display "Script Canal" "$text" "--info" exit 0 } ################################################################################################################# ####################################################### Copie ################################################### # Fonction qui regroupe les vidéos dans des dossier à leur nom (pour le mode historique par émission) function copie { mkdir -p "$1" mv -f "$VIDEO" "$1" if ! [[ -z $VIDEO ]] then VIDEO="$1/$VIDEO" fi } ################################################################################################################# #################################################### Conversion ################################################# # Fonction qui converti les vidéos aux formats avi, mkv, ogm, ipod, archos, iriver, meizu ou psp function convert { mkdir -p PID source="$1" # Creation du nom pour le fichier vidéo de sortie if [[ "$format" == "AVI" ]] || [[ "$format" == "ARCHOS" ]] || [[ "$format" == "MEIZU" ]] ; then VIDEO="$( echo $VIDEO | sed -e 's/\.flv$/\.avi/' )" elif [[ "$format" == "MKV" ]] ; then VIDEO="$( echo $VIDEO | sed -e 's/.flv$/.mkv/' )" else VIDEO="$( echo $VIDEO | sed -e 's/.flv$/.mp4/' )" fi case "$format" in AVI) mencoder "$source" -ovc xvid -xvidencopts fixed_quant=3 -oac mp3lame -lameopts cbr:preset=128 -o "$VIDEO" 2>/dev/null & ;; MKV) mencoder "$source" -ovc xvid -xvidencopts fixed_quant=3 -oac mp3lame -lameopts cbr:preset=128 -o "$VIDEO" 2>/dev/null & ;; IPOD) ffmpeg -y -i "$source" -vcodec mpeg4 -b 717000 -s 480x320 -aspect 16:9 -f mp4 -acodec aac "$VIDEO" 2>/dev/null & ;; ARCHOS) mencoder "$source" -ovc xvid -xvidencopts fixed_quant=3 -vf scale=320:-2 -oac mp3lame -lameopts cbr:preset=128 -af volume=+5 -o "$VIDEO" 2>/dev/null & ;; IRIVER) mencoder "$source" -ofps 15.000 -vf-add crop=0:0:-1:-1 -vf-add scale=320:240 -vf-add expand=320:240:-1:-1:1 -srate 44100 -ovc xvid -xvidencopts bitrate=380 -oac mp3lame -lameopts vbr=0 -lameopts br=128 -lameopts vol=0 -lameopts mode=0 -lameopts aq=7 -lameopts padding=3 -af volnorm -xvidencopts max_bframes=0:nogmc:noqpel -mc 0 -o "$VIDEO" 2>/dev/null & ;; MEIZU) mencoder "$source" -idx -noodml -ofps 20 -vf scale=320:-2,expand=:240:::1,crop=320:240,rotate=1 -ovc lavc -ffourcc XVID -lavcopts vcodec=mpeg4:vbitrate=384:vmax_b_frames=0:vhq -sws 9 -srate 44100 -oac mp3lame -lameopts cbr:br=128:mode=0 -o "$VIDEO" 2>/dev/null & ;; PSP) ffmpeg -y -i "$source" -title "$VIDEO" -vcodec h264 -level 13 -g 250 -s 368x208 -r 29.97 -b 768 -acodec aac -ac 2 -ar 48000 -ab 128 "$VIDEO" 2>/dev/null & ;; esac echo $! > ".PID/`basename "$VIDEO"`.pid" echo "$REP/Canal+/$source" >> ".PID/`basename "$VIDEO"`.pid" } ################################################################################################################# ###################################################### Get http ################################################# # fonction qui récupère le code source de la page contenant la vidéo dans un fichier ".menu_src_code" function get_http { wget -q --save-cookies cookie.txt --keep-session-cookies $1 -O .menu_src_code if ! ( [[ "$emission" == "PJA" ]] || [[ "$emission" == "PJP" ]] ) then rm -f .menu_src_code wget -q --load-cookies cookie.txt --keep-session-cookies $1 -O .menu_src_code fi rm -f cookie.txt } ################################################################################################################# ###################################################### Get video ################################################ # Fonction qui récupère l'url de la page de téléchargement de la vidéo dans le fichier ".video_src_code", récupère ensuite l'url direct de la vidéo, puis la télécharge function get_video { # Récupération de l'url de la page de téléchargement de la vidéo if [[ -z $2 ]] then aVideos=$( cat .menu_src_code | grep "$date" | cut -f2 -d [ | cut -f1 -d ] ) # Majorité des émissions if ! [[ -z $aVideos ]] then video_id=$( cat .menu_src_code | grep "aVideos\[$aVideos\]" | grep "CONTENT_ID" | cut -f2 -d '"' | head -n 1 ) fi else video_id=$( cat .menu_src_code | grep "$date" | grep chooseVideo | cut -f2 -d "'" | head -n 1 ) # Pepites sur le net, têtes à claques et meilleur du hier fi # Si video_id manque c'est que l'émission n'a pas été diffusée if [[ -z $video_id ]] then i=$(( $i + 100/$n )) echo "$i % : L'émission '$1' n'a pu être téléchargée" echo "_$1" >> "$parent_dir"/.canal_log # Si video_id existe, l'url direct de la video est trouvé sur la page et la vidéo est téléchargée else page="http://www.canalplus.fr/flash/xml/module/embed-video-player/embed-video-player.php?video_id=$video_id" wget -q -O .video_src_code "$page" url=$( cat .video_src_code | grep -o "http://[^ ]*$quality.flv" ) wget -c $url i=$(( $i + 100/$n )) display "$i % : Fin du téléchargement de l'émission :" "$1" "--progression" VIDEO=$( echo $url | cut -f7 -d "/" ) fi set -- } ################################################################################################################# ##################################################### Download ################################################## # Fonction de téléchargement des émissions, lance le téléchargement de la fonctione de téléchargement de page puis de celle de téléchargement de la vidéo # Copie puis converti les vidéos si nécessaire. Ajoute enfin la vidéo dans la playlist function download { if [[ $emission = "PEP" ]] then pepites else get_http "$1" get_video "$2" "$3" fi if ! [[ -z $VIDEO ]] then if [[ $mode == "HEM" ]] then copie "$2" fi if ! [[ $format == "FLV" ]] then convert "$VIDEO" fi echo `pwd`"/$VIDEO" >> $yy-$mm-$dd"-playlist.m3u" fi unset VIDEO unset video_id unset aVideos rm -f .menu_src_code rm -f .video_src_code } ################################################################################################################# function pepites { wget -q -O .menu_src_code "http://www.canalplus.fr/processus/page/commun/xt_mea_trombi.php?page_id=1778&zone_template_id=3329&langue_id=1" code_video=$( cat .menu_src_code | grep -o "PEPITES_SUR_LE_NET_EMISSION_"$yy$mm$dd"_CAN_[0-9]*_" ) if ! [[ -z $video_id ]] then i=$(( $i + 100/$n )) echo "$i % : L'émission '$1' n'a pu être téléchargée" echo "_$1" >> "$parent_dir"/.canal_log else code_video=$( echo "$code_video""video_""$quality.flv" ) url="http://vod-flash.canalplus.fr/$code_video" wget -c $url i=$(( $i + 100/$n )) display "$i % : Fin du téléchargement de l'émission :" "$1" "--progression" VIDEO=$( echo $url | cut -c 31- | cut -f2 -d "/" ) fi set -- } ##################################################### Emissions ################################################# # Appel de la fonction de téléchargement adaptée pour chaque émission function emissions { case "$1" in ZAP) # Zapping nom="le zapping" url="http://www.canalplus.fr/index.php?pid=1830" download "$url" "$nom" ;; PJA) # Petit Journal Actu # nom="le petit journal actu" # url="http://www.canalplus.fr/c-humour/pid2397-c-le-petit-journal.html?catId=608" # download "$url" "$nom" ;; GUI) # Guignols nom="les guignols de l'info" url="http://www.canalplus.fr/index.php?pid=1784" download "$url" "$nom" ;; MET) # Météo nom="la météo de Louise Bourguoin" url="http://www.canalplus.fr/index.php?pid=2028" download "$url" "$nom" ;; PJP) # Petit Journal People nom="le petit journal people" url="http://www.canalplus.fr/c-humour/pid2397-c-le-petit-journal.html?catId=613" download "$url" "$nom" ;; SAV) # SAV des emissions nom="le Service Après Vente des émissions" url="http://www.canalplus.fr/index.php?pid=1782" download "$url" "$nom" ;; BAQ) # Boite à questions nom="la boite à questions" url="http://www.canalplus.fr/index.php?pid=1786" download "$url" "$nom" ;; RDP) # Revue de presse nom="la revue de presse de Chris Esquerre" url="http://www.canalplus.fr/index.php?pid=2681" download "$url" "$nom" ;; STO) # Sebastien Tohen nom="la chronique de Sebastien Tohen" url="http://www.canalplus.fr/c-humour/pid2053-c-encore-de-rire.html?catId=2584" download "$url" "$nom" ;; ADM) # L'avis de Mouloud nom="l'avis de Mouloud" url="http://www.canalplus.fr/c-humour/pid2053-c-encore-de-rire.html?catId=622" download "$url" "$nom" ;; DSH) # Le daily show nom="le daily show" url="http://www.canalplus.fr/c-humour/pid2053-c-encore-de-rire.html?catId=722" download "$url" "$nom" ;; SGU) # La chronique de Stephane Guillon nom="la chronique de Stephane Guillon" url="http://www.canalplus.fr/c-humour/pid2053-c-encore-de-rire.html?catId=682" download "$url" "$nom" ;; IDB) #Blakowski nom="Les infos de blako" url="http://www.canalplus.fr/c-humour/pid2053-c-encore-de-rire.html?catId=684" download "$url" "$nom" ;; CDA) #Le champion de l'actu nom="Le champion de l'actu" url="http://www.canalplus.fr/c-humour/pid2053-c-encore-de-rire.html?catId=688" download "$url" "$nom" ;; GRO) # Groland nom="le Groland" url="http://www.canalplus.fr/index.php?pid=1787" download "$url" "$nom" ;; TAC) # Tetes à claques nom="les têtes à claques" url="http://www.canalplus.fr/index.php?pid=2170" download "$url" "$nom" 42 ;; PEP) # Pépites sur le net nom="les pépites du net" url="http://www.canalplus.fr/index.php?pid=1778" download "$url" "$nom" 42 ;; MDH) # Le meilleur du hier, changement de la date pour correspondre au format de date du site de canal nom="le meilleur du hier" url="http://www.canalplus.fr/index.php?pid=1831" day=$( date +%A -d $date_us ) date=$( echo $day | tr 'a-z' 'A-Z' ) if [[ $date == "SAMEDI" ]] || [[ $date == "DIMANCHE" ]] then date="WEEK-END" fi download "$url" "$nom" 42 date="$dd/$mm/$yy" ;; esac } ################################################################################################################# ################################################## Début du script ############################################## ############################################# # Creation du fichier log et définition du dossier parent (ou est rangé le script) touch .canal_log clear ############################################## # Lancement de la vérification de mise à jour éventuelle maj_auto | zenity --progress --pulsate --auto-close title="Demarrage" --text="Verification des mises à jour en cours..." ############################################## # Lancement automatique du script en mode config si la version du fichier .canal_config n'est pas la même que celle du script canal_config_version=$( cat .canal_config | grep "version=[v]" | cut -f2 -d "=" | cut -c 1-4 ) if ! [[ `echo "$version" | cut -c 1-4` = $canal_config_version ]] then text="Votre fichier de configuration n'existe pas ou ne correspond pas à la version actuelle du script. Lancement du script en mode configuration. Si vous faites fonctionner le script en mode console et que Zenity n'est pas installé, merci de créer votre fichier de config et relancez le script. Pour celà, inspirez vous de l'explication ici : http://forum.ubuntu-fr.org/viewtopic.php?pid=1762893#p1762893" display "Fichier de configuration erroné" "$text" "--error" if ( grep -q GTK "$parent_dir"/.canal_config ) then _config fi fi ################################################### Menu Principal ############################################## # Choix via une fenetre zenity de mode de fonctionnement du script if [[ "$1" == "-m" ]] || [[ "$1" == "--menu" ]] then option=$( zenity --list --radiolist --height=370 --width=540 \ --title="Choix du mode de lancement" \ --text="Choissez l'action à exécuter" \ --column="" --column="" --column="action" \ --separator=" " \ --hide-column=2 \ TRUE "" "Télécharger les émissions d'hier" \ FALSE "date" "Télécharger des émissions antérieures à hier" \ FALSE "alacarte" "Choisir exeptionnellement les émissions à télécharger aujourd'hui" \ FALSE "config" "Modifier la configuration du script" \ FALSE "lanceur" "Ajouter un lanceur au menu Applications > Son et Video" \ FALSE "cron" "Automatiser l'exécution du script via cron" \ FALSE "help" "Afficher l'aide et quitte" \ FALSE "bug" "Déclarer un bug ( ou faire des remerciements ^^ )" \ FALSE "about" "A propos du script / Todo list" ) if [[ $? == "1" ]] then zenity --warning --title="Fin du script" --text="Le script à été arreté" exit 0 fi set -- "--$option" if [[ "$1" == "--" ]] then set -- fi fi ################################################################################################################# ################################################## Appel de fonction ############################################ # Appel de la fonction demandé par l'argument d'appel du script, le menu, ou une exeption (fichier de config inexistant) # Appel fonction --help if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]] then _help fi # Appel fonction --lanceur if [[ "$1" == "-l" ]] || [[ "$1" == "--lanceur" ]] then _lanceur fi # Appel fonction --config if [[ "$1" == "-c" ]] || [[ "$1" == "--config" ]] then _config fi # Appel fonction --bug if [[ "$1" == "-b" ]] || [[ "$1" == "--bug" ]] then _bug fi # Appel fonction --about if [[ "$1" == "-?" ]] || [[ "$1" == "--about" ]] then _about fi # Appel fonction --alacarte if [[ "$1" == "-a" ]] || [[ "$1" == "--alacarte" ]] then set -- "--date" alacarte="yes" fi # Appel fonction --cron if [[ "$1" == "-cr" ]] || [[ "$1" == "--cron" ]] then _cron fi # Appel fonction --dependances if [[ "$1" == "-dep" ]] || [[ "$1" == "--dependances" ]] then dependances fi ################################################################################################################# ############################################# Définition des préférences ######################################## ############################################# # Changement de répertoire vers celui choisi lors de la configuration, création du sous répertoire Canal+ REP=$(head -1 .canal_config) mkdir -p "$REP"/Canal+ cd "$REP"/Canal+ ############################################# # Vérification de la date de téléchargement choisie # Si le script est lancé avec l'option --date ou --alacarte, choix de la date dans un calendrier Zenity if [[ "$1" == "-d" ]] || [[ "$1" == "--date" ]] then date=$( zenity --calendar --date-format=%d/%m/%y --text="Choix de la date" ) if ! [[ $? == "0" ]] then zenity --warning --title="Fin du script" --text="Le script à été arreté" exit 0 fi # Si la date est la date du jour, la date de la veille est choisie if [[ "$date" == "`date +%d/%m/%y`" ]] then date=$( date +%d/%m/%y --date '1 days ago' ) fi # Si le script n'est pas lancé avec l'option date, le script télécharge les vidéos de $1 days ago, ou de la veille si $1 n'est pas précisé lors de l'appel du script else if [[ -z $1 ]] then d="1" else d=$1 fi date=$( date +%d/%m/%y --date ''$d' days ago' ) fi dd=${date:0:2} mm=${date:3:2} yy=${date:6:2} date_us="$mm/$dd/$yy" echo `color 1 "Téléchargement des émissions du $date en cours... "` ############################################# # Définition du mode de téléchargement, quotidien, historique par date de diffusion ou historique par émission # Quotidien if ( grep -q QUO "$parent_dir"/.canal_config ) then # if (ls | grep $yy$mm$dd ) # then error=1 # else rm -f *.flv rm -f *-playlist.m3u # fi fi # Historique par date de diffusion if ( grep -q HIS "$parent_dir"/.canal_config ) then folder=$( date +%Y-%m-%d -d $date_us ) # if [[ -d $folder ]] # then error=1 # else mkdir -p $folder cd $folder # fi fi # Historique par émission if ( grep -q HEM "$parent_dir"/.canal_config ) then mode="HEM" fi ############################################# # Fonction qui arrête le script si les émissions sont déja présentes #if [[ $error == "1" ]] #then #text="Les émissions du $date sont déja présente dans votre dossier Canal+ # #Pour néanmoins télécharger les vidéos, veuillez supprimer les vidéos existantes ou le dossier vidéo existant correspondant à la date désirée puis relancer le script" #display "Emissions déja présentes" "$text" "--warning" #exit 0 #fi ############################################# # Détection de la qualité : High ou Low if ( grep -q HIGH "$parent_dir"/.canal_config ) then quality="H" else quality="L" fi ############################################# # Détection du format de conversion si nécessaire format=$( cat "$parent_dir"/.canal_config | grep "CONVERT=" | cut -f2 -d "=" ) ############################################# # création de la playlist echo "#EXTM3U" > $yy-$mm-$dd"-playlist.m3u" ############################################# # Liste des diminutifs des émissions à télécharger emissions_wanted=$( cat "$parent_dir"/.canal_config | head -4 | tail -1 ) ############################################# # Choix des émissions si l'option "alacarte" est choisie et modification de l'incrémentation de la barre de progression en conséquent if [[ $alacarte == "yes" ]] then choix_emissions ".alacarte" emissions_wanted=$( cat "$parent_dir"/.alacarte ) fi ############################################## # Initialisation des variables pour la barre de progression en fonctionnement graphique i="0" n=$( echo "$emissions_wanted" | wc -w ) ################################################################################################################# ############################################ Téléchargement des émissions ####################################### # Lancement de la fonction de téléchargement des émissions IFS=' '; if ( grep -q GTK "$parent_dir"/.canal_config ) then ( for emission in $emissions_wanted do emissions $emission done ) | zenity --progress \ --title="Téléchargement" \ --text="Téléchargement des émissions en cours..." \ --width=300 \ --auto-close \ --percentage=0 else for emission in $emissions_wanted do emissions $emission done fi IFS='\n'; ################################################################################################################# if ! [[ $format == "FLV" ]] then cd .PID/ ( while ( ls | grep ".pid" ) do proc=$( ls -rt | grep ".pid" | head -1 ) while ! ( top -n 1 | grep `cat $proc | head -1` ) do sleep 2 done video_source=$( cat $proc | tail -1 ) find "$video_source" -exec rm -f '{}' \; rm -f $proc done ) | zenity --progress --title="Conversion" --text="Conversion des vidéos en cours..." --auto-close --pulsate cd .. rmdir .PID/ fi ############################################# Déplacement de la playlist ######################################## # Déplacement de la playlist dans un dossier adapté si le script utilise une des options historique play_dir="$REP"/Canal+/ if ! ( grep -q QUO "$parent_dir"/.canal_config ) then mkdir -p "$REP"/Canal+/playlists/ mv *-playlist.m3u "$REP"/Canal+/playlists/ play_dir="$REP"/Canal+/playlists/ fi ################################################################################################################# ################################# Affichage des logs, ouverture de la playlist ################################## # Fin des téléchargement, affichage des logs, diffusion dans lecteur vidéo si demande exprimée par l'utilisateur (via fenetre Zenity) lecteur_video=$( cat "$parent_dir"/.canal_config | head -2 | tail -1 ) log=$(cat "$parent_dir"/.canal_log) if ! [[ -z $log ]] then erreur="Les vidéos suivantes n'ont pas été diffusées ce jour là :" fi text="Les vidéos du $date ont été téléchargées $erreur $log " if ( grep -q GTK "$parent_dir"/.canal_config ) then text2="Voulez vous lancer la lecture dans $lecteur_video ?" display "Fin du script" "$text$text2" "--question" if [[ $? == "0" ]] then if [[ $lecteur_video == "mplayer" ]] then lecteur_video="$lecteur_video -playlist" fi nohup "$lecteur_video" "$play_dir"/$yy-$mm-$dd"-playlist.m3u" & fi else text2="La playlist est disponible dans $play_dir/$yy-$mm-$dd-playlist.m3u" echo "$text$text2" fi rm -f "$parent_dir"/.canal_log exit 0 ################################################################################################################# ############################################# Astuces / Post it personnel ####################################### # Les liens direct vers les pages des émissions ont été trouvés sur les pages : # http://www.canalplus.fr/processus/page/commun/xt_plus_de_rire.php?PAGE_ID=2053&ZONE_TEMPLATE_ID=3659 ## pour le contenu d'encore + de rire # http://www.canalplus.fr//processus/page/commun/xt_plus_de_rire.php?PAGE_ID=2397&ZONE_TEMPLATE_ID=3659 ## pour le contenu du petit journal # Pour retrouver les liens : aller sur la page de menu et chercher ZONE_TEMPLATE dans le code source ^^ # # Dans le code source de chacun des liens, on trouve un numéro, c'est le catID à rajouter à la fin du lien de la page générale. Par exemple pour le top5 : # http://www.canalplus.fr/c-humour/pid2053-c-encore-de-rire.html?catId=1282