bobuse a écritHello, je viens de démarrer une version en python. Je voulais une version console et reprendre la version bash me semblait trop compliqué.
Ça me semblait aussi compliqué de retravaillé la version Bash, car je m'y connais pas bcp en Shell, mais dire d'apprendre (et ça marche) j'ai réécris totalement le script pour y voir plus clair, et donc mieux l'adapter à mes besoins (je ne télécharge pas à l'endroit où je regarde ensuite les vidéos, donc il me fallait une gestion plus avancée) et donc j'ai un peu "forké" le script pour faire co-oexister ma version avec celle de BeudBeud.
Les différences à savoir si vous désirez tester :
- Le script est nommé arte+7 (à la place de "arte")
- Les fichiers pour les langues sont dans /usr/share/arte+7 (à la place de /usr/share/arteplus7)
- Le dossier par défaut pour le téléchargement est nommé "Arte+7" (à la place de "arte")
Les différences par rapport au script original :
- Activation de la reprise d'un téléchargement coupé (volontairement ou pas)
- Gestion des émissions téléchargés ou pas, pour savoir où on en est
- Le programme peut relancer tous les téléchargements coupés en une fois (j'en ai déjà relancé 11 en même temps ^^)
- Ajout (dans le script tout au début) d'une variable pour désactiver la pré-visualisation (dont je ne me sers pas du tout et qui me gênait plus qu'autre chose)
- (Par ce fait et celui d'avoir démarré depuis une 4.2, on ne choisi pas le lecteur chez moi, qui doit être vlc, c'est un point à faire évoluer)
- J'ai changé le format de la date dans le nom du fichier, passant de 01-04-2009 à 2009-04-01.
(Je télécharge tous les "Dessous des Cartes" notamment et ils ne se rangent pas bien à cause de ça.)
- J'ai ajouté l'heure dans le nom du fichier, car cette semaine plein d'émissions ont le même nom ! ça fait la différence
- La date dans la fenêtre écrit le mois en lettres, car je trouve ça bien plus joli ! Et c'est traductible.
- Les variables labels du script sont conçus sur le principe de l'arborescence, le nom de la variable du titre de la fenêtre de téléchargement donne : $label_download_title (chaque fenêtre à son nom)
Côté technique :
- J'ai quasi renommé toutes les variables pour structurer beaucoup plus le script.
(Certaines étaient en majusucles, d'autres minuscules, certaines en français, d'autres en anglais...)
(J'ai remplacé des /home/$USER en $HOME directement, etc...)
- J'ai aussi renommé les fonctions, en ajoutant le mot "function_" devant (pour mieux les repérer dans le code)
- Apprenant énormément de ce bidouillage, j'ai commenté beaucoup de lignes, plus le temps d'apprendre que pas nécessité.
- J'ai ajouté le PID aux noms des fichiers temporaires, si on relance une seconde fois le script, le premier détruit les fichiers temporaires du second qui se retrouve avec une liste vide ou en train de télécharger un fichier sans nom "_.wmv"
- Il sauvegarde dans un fichier .txt le résumé de l'émission, c'est provisoire mais je veux conserver cette information (qui forcément est perdue et dans le cas d'émissions comme GEO 360°, on fini par plus savoir laquelle parlait de quoi...)
Pour le futur :
- J'aimerais mettre en place une véritable vérification du succès du téléchargement. Je sais par expérience qu'en arrivant à saturation du disque dur, il termine tout avec succès alors que ce n'est pas le cas.
- J'aimerais trouver un moyen de détecter quand il y a eu une coupure de connexion, car les téléchargements restent figés. Je pense ouvrir une Zenity qui va suivre la taille des fichiers, et faire un killall / relancement automatique de tout.
- Quand sur la liste on clique sur annuler ça ferme le programme, je pense que c'est un bon endroit pour mener vers une fenêtre permettant la configuration du script (Lecteur Vidéo, Prévisualisation, etc...)
Le code actuel donne ceci : (Il faut donc le nommer arte+7 et le placer dans /usr/bin/ (en lui donnant les droits d'exécution)
#!/bin/bash
## Version du Script:
label_script_version="4.2 extended"
preview=0
## Déclaration des Variables de Configuration
path_script=/usr/bin
path_lang=/usr/share/arte+7
path_config=$HOME/.arte+7
file_config=$path_config"/.configuration"
path_stockage=$HOME/Vidéos/Arte+7
dir_stockage=Arte+7
i=""
user_lang=`echo "$LANG" | awk -F'"' '{print $1}' | awk -F'_' '{print $1}'`
## Importation des labels
source $path_lang/$user_lang
## Premier Lancement et Configuration du Script
function_config_create() #Fonction choisissant le dossier de téléchargement et le mettant dans le fichier de configuration
{
zenity --info --title="$label_first_title" --text="$label_first_text" #Fenêtre qui prévient qu'on va demander de choisir le chemin pour le dossier de téléchargement
user_choix_stockage=$(zenity --title="$label_dir_title" --file-selection --directory) #Fenêtre permettant de choisir le chemin pour le Dossier Arte+7
mkdir -p $path_config #Création du Dossier .arte+7 dans le /home de l'utilisateur user_path_stockage="$user_choix_stockage"/"$dir_stockage"
echo $user_choix_stockage > $file_config #Création du fichier .configuration dans le chemin choisi par l'utilisateur
}
ls $file_config >> /dev/null 2>&1 #Test pour vérifier la présence du fichier de Configuration
if [ $? = 2 ]; then
ls $path_stockage >> /dev/null 2>&1 #Test pour vérifier la présence du Dossier de Téléchargement
if [ $? = 2 ]; then function_config_create
else zenity --question --title="$label_dir_title" --text="$label_dir_exist" #Si le Dossier Arte+7 existe mais pas le fichier Configuration, alors on refait celuci.
if (test $? -eq 0) #Si l'utilisateur clique Oui, alors on ne choisi pas un autre Dossier
mkdir -p $path_config
then echo $path_stockage > $file_config #On place le Chemin par Défaut dans le Fichier de Configuration
else function_config_create #Sinon on Demande à choisir un Dossier pour y créer "Arte+7"
fi
fi
fi
user_path_stockage=$(head -1 $file_config) #On place le Chemin du Dossier de Stockage des Émissions dans cette variable
## Reprise automatique des téléchargements non finis
restart_download="non"
zenity --question --title="$label_script_name :: $label_restart_title ($label_script_version)" --text="<span color=\"red\">$label_restart_text</span>"
if (test $? -eq 0); then restart_download="oui"; fi
function_reprise_auto() #Fonction qui ré-ouvre le Téléchargement.
{
mimms -r $statute_file_ida "$user_path_stockage"/$row_filename | gawk -vRS="\r" '/^[0-9]/{print "#"$0 ; fflush();}' | zenity --progress --pulsate --title="$label_download_title $row_title" --text="$label_download_text $row_filename" --auto-close --auto-kill &
}
## Déclaration de Quelques Fonctions
function_annulation() #Fonction exécutée quand l'utilisateur ne télécharge pas l'émission et revient à la liste
{
if [ $? = 123 ]; then
rm $arte_xml_file
rm $path_config/arte_temp_listing_$$
rm $path_config/arte_temp_numbers_$$
exit; fi
}
## Choix de l'émission, création du Listing
function_selecteur_emission()
{
(
grep "<index>" $arte_xml_file | sed -e 's/<index>//g' -e 's/<\/index//g' -e 's/ //g' -e 's/>//g' > $path_config/arte_temp_numbers_$$
nb=1
rm $path_config/arte_temp_listing_$$
for y in $(cat "$path_config/arte_temp_numbers_$$"); do
row_ida=$(grep "<targetURL>" $arte_xml_file | sed -e 's/<targetURL>//g' -e 's/<\/targetURL>//g' | head -$nb | tail -1 | sed -e 's/http:\/\/plus7.arte.tv\/fr\/detailPage\///g' -e 's/CmC//g' -e 's/scheduleId//g' -e 's/.html//g' -e 's/,//g' -e 's/=//g' -e 's/ //g')
row_title=$(grep "<bigTitle>" $arte_xml_file | sed -e 's/<bigTitle>//g' -e 's/<\/bigTitle>//g' -e 's/ //g' -e "s/\&/and/g" | head -$nb | tail -1)
row_date_base=$(grep "<startDate>" $arte_xml_file | sed -e 's/<startDate>//g' -e 's/<\/startDate>//g' -e 's/\([[:digit:]][[:digit:]][[:digit:]][[:digit:]]\)-\([[:digit:]][[:digit:]]\)-\([[:digit:]][[:digit:]]*\)/\3-\2-\1/g' -e 's/T/@/g' -e 's/ //g' | head -$nb | tail -1)
month_to_index=`echo ${row_date_base:3:1} | sed -e 's/0//g'`
row_date=${row_date_base:0:2}" "${label_month[$month_to_index${row_date_base:4:1}]}" "${row_date_base:6:4}" "${label_month[0]}" "${row_date_base:11:2}${label_month[13]}${row_date_base:14:2}
row_url=$(grep "<targetURL>" $arte_xml_file | sed -e 's/<targetURL>//g' -e 's/<\/targetURL>//g' | head -$nb | tail -1)
row_date_rev=${row_date_base:6:4}"-"${row_date_base:3:2}"-"${row_date_base:0:2}"-"${row_date_base:11:2}"h"${row_date_base:14:2}
row_filename=`echo "$row_title" | sed -e "s/[[:space:]]/_/g" -e "s/\/$//" -e "s/[°:';,]/_/g" -e 's/-/_/g' -e 's/\///g' -e 's/ /_/g' -e 's/_\/_/_/g' -e "s/__/_/g"| awk -F" " '{print $1}'`"_"$row_date_rev".wmv"
row_statute=""
statute_file_ida=$(head $user_path_stockage/.$row_ida)
if [[ ${statute_file_ida:0:2} == "ok" ]]; then row_statute=$label_list_own; else
if [[ ${statute_file_ida:0:3} == "mms" ]]; then
row_statute=$label_list_inprogress
if [[ $restart_download == "oui" ]]; then function_reprise_auto >> /dev/null 2>&1; fi
fi
fi
echo '"'$row_url'"' '"'$row_title'"' '"'$row_date'"' '"'$row_ida'"' '"'$row_statute'"' '"'$row_filename'"' >> $path_config/arte_temp_listing_$$
nb=$(( $nb + 1 ))
done
) | zenity --progress --title="$label_script_name ($label_script_version)" --text="$label_start_loading" --auto-close
function_choix_emission()
{
file_listing=`cat $path_config/arte_temp_listing_$$`
emission_choisie=$(echo $file_listing | xargs zenity --list --width=735 --height=535 \
--title="$label_script_name :: $label_list_title ($label_script_version)" \
--text="$label_list_choice" \
--hide-column=1,4,6 \
--column="Url" --column="$label_list_head_title" --column="$label_list_head_date" --column="IDA" --column="$label_list_head_state" --column="WMV"
);
function_annulation
function_info_emission
}
}
## Informations de l'émission et confirmation de téléchargement
function_info_emission()
{
info_url=`grep $emission_choisie $path_config/arte_temp_listing_$$ | awk -F'"' '{print $2}'`
info_title=`grep $emission_choisie $path_config/arte_temp_listing_$$ | awk -F'"' '{print $4}'`
info_date=`grep $emission_choisie $path_config/arte_temp_listing_$$ | awk -F'"' '{print $6}'`
info_ida=`grep $emission_choisie $path_config/arte_temp_listing_$$ | awk -F'"' '{print $8}'`
info_resume=`wget -O - -q $emission_choisie | grep -A 2 '<p class="text">'| sed -e 's/<[a-z][a-z]*>//g' -e 's/<\/[a-z][a-z]*>//g' -e 's/<br \/>/\n/g' -e 's/^\s*//'|awk -F'<p class="text">' '{print $1}'`
info_file=`grep $emission_choisie $path_config/arte_temp_listing_$$ | awk -F'"' '{print $12}'`
source $path_lang/$user_lang #Que fait-il là lui, on avait déjà fait ça ?
zenity --question --title="$label_info_title" --text="<span font-family=\"Helvetica\">
<b>$label_info_text: $info_title</b>
<i>$label_info_date: $info_date
Id Arte: $info_ida</i>
$label_info_resume: $info_resume</span>"
if [ $? = 1 ]; then function_choix_emission; fi
}
mkdir -p $user_path_stockage ## Création du répertoire de téléchargement (vidéos/arte)
cd $user_path_stockage
lien_arte=`wget -O - -q http://plus7.arte.tv/ | grep xmlURL | awk -F'"' '{print $4}'` ## Récuperation de la page sur Arte.tv
lien_xml="http://plus7.arte.tv/"$user_lang/$lien_arte
wget $lien_xml ## Récuperation du fichier xml
arte_xml_file=`echo $lien_arte | awk -F"/" '{print $4}'`
## Sélection de l'émission
function_selecteur_emission
function_choix_emission
## Démarrage des opérations visant le téléchargement de l'émission choisie
fichier_temporaire=`echo temporary_"$info_file"`
wget -O - -q $emission_choisie | grep wmv | grep HQ >> /dev/null 2>&1 ## Recherche si la HQ est disponible, si oui on la choisi
if (test $? -eq 0); then qualite="HQ"; else qualite="MQ"; fi
## Récupère dans la source le lien vers le Fichier qui contient la véritable URL du fichier .wmv
fichier_source=`wget -O - -q $emission_choisie | grep wmv | grep $qualite | awk -F= '{print $2}' | awk -F\" '{print $2}' | awk -F\? '{print $1}'`
wget $fichier_source -O $fichier_temporaire ## Télécharger Fichier_Source dans Fichier Temporaire
mms_link=`cat $fichier_temporaire | grep mms | awk -F\" '{print $2}'` ## Extrait le lien mms
echo $info_resume > `echo $info_file | sed -e 's/.wmv/.txt/g'` ## On enregistre le résumé de l'émission dans un fichier .txt
## Nettoyage
rm $fichier_temporaire
rm $arte_xml_file
rm $path_config/arte_temp_listing_$$
rm $path_config/arte_temp_numbers_$$
echo "$mms_link" > "$user_path_stockage"/.$info_ida ## Indication de Téléchargement (On place le lien mms_link dans le fichier ID)
## Téléchargement de l'émission avec Mimms (Avec option -r pour Redémarrer après arrêt)
mimms -r $mms_link "$user_path_stockage"/$info_file | gawk -vRS="\r" '/^[0-9]/{print "#"$0 ; fflush();}' | zenity --progress --pulsate --title="$label_download_title" --text="$label_download_text" --auto-close --auto-kill&
## Prévisualisation
if [[ $preview==1 ]]; then
sleep 30s && zenity --question --title="$label_viewer_title" --text="$label_viewer_text" >>/dev/null 2>&1
if (test $? -eq 0)
then vlc "$user_path_stockage"/$info_file
previsualisation=1
else
previsualisation=0
fi
fi
## Notification finale
wait ## Attente de fin de téléchargement
echo message:$label_note_text | zenity --notification --listen --window-icon="info" | zenity --notification --window-icon="info" --text="$label_note_bulle"
echo "ok" > "$user_path_stockage"/.$info_ida ## Indication de Téléchargement (Trouver une vérification plus poussée !)
## Ouverture du fichier
if [[ $preview==1 ]]; then
if (test $previsualisation -eq 1)
then exit
else
zenity --question --title="$label_viewer_title" --text="$label_viewer_play" >>/dev/null 2>&1
if (test $? -eq 0)
then vlc "$user_path_stockage"/$info_file
else exit
fi
fi
fi
Et le fichier des labels en Français donne pour le moment ceci : (doit être nommé fr et placé dans /usr/share/arte+7/
############################
## Arte +7 Recorder : FR ##
## Déclaration des Labels ##
############################
#Labels Script : Liés au Programme Général
label_script_name="Arte +7 Recorder"
#Labels First : Premier lancement, la Zenity de Configuration
label_first_title="Premier lancement, configuration..."
label_first_text="Choisissez un répertoire pour le téléchargement des émissions
(un sous répertoire nommé \"Arte+7\" y sera automatiquement créé)"
#Labels Dir : Choix du Dossier, la Zenity d'exploration du Disque
label_dir_title="Choisissez où créer le répertoire \"Arte+7\""
label_dir_exist="Le répertoire \"Arte+7\" éxiste déjà, désirez-vous l'utiliser ?"
#Labels Restart : La Zenity qui relance les émissions non terminées
label_restart_title="Relancement des émissions"
label_restart_text="Faut-il relancer les téléchargements qui n'étaient pas fini ?"
#Labels Start : Démarrage de Arte+7, La Zenity qui télécharge la liste des émissions
label_start_loading="Chargement des émissions disponibles..."
#Labels List : Liste des émissions, la Zenity Liste
label_list_title="Liste des émissions disponibles"
label_list_head_title="Titre de l'émission"
label_list_head_date="Date du passage"
label_list_head_state="État du téléchargement"
label_list_own="Déjà téléchargé"
label_list_inprogress="En Téléchargement..."
label_list_choice="Veuillez sélectionner l'émission :"
#Labels Infos : Description de l'émission, la Zenity demandant si on télécharge
label_info_title="Voulez-vous télécharger cette émission ?"
label_info_text="Titre de l'émission"
label_info_date="Date de son passage"
label_info_resume="Résumé"
#Labels Download : La fenêtre Zenity de téléchargement
label_download_title="Téléchargement de"
label_download_text="Enregistrement de"
#Labels Viewer & Notification
#label_viewer_title="Lecture"
#label_viewer_text="Voulez vous prévisualiser $info_title $i?"
#label_viewer_play="Voulez vous lire $info_title $i?"
#label_note_text="enregistrement de $info_title $i est terminé"
#label_note_bulle="L'enregistrement de $info_title $i est terminé"
#Labels Divers
label_month[0]="à"
label_month[1]="Janvier"
label_month[2]="Février"
label_month[3]="Mars"
label_month[4]="Avril"
label_month[5]="Mai"
label_month[6]="Juin"
label_month[7]="Juillet"
label_month[8]="Août"
label_month[9]="Septembre"
label_month[10]="Octobre"
label_month[11]="Novembre"
label_month[12]="Décembre"
label_month[13]="H"
C'est testé chez moi et ailleurs, ce qui permet de vérifier le bon fonctionnement, mais c'est toujours en évolution. Le côté intéressant est que j'apprends une tonne de truc sur le Shell et qu'en Linux c'est vraiment super utile. Si vous avez des retours je suis intéressé. ^^