bob1977 Guru
Joined: 16 Mar 2004 Posts: 387
|
Posted: Mon May 01, 2006 2:21 pm Post subject: [Script] Telecharger les fichiers d'une playlist |
|
|
salut à tous,
Etant addict de jamendo ( http://www.jamendo.com/fr/ ), j'ai fait un petit script qui me permette de telecharger les fichiers d'une playlist puis de les jouer dans xmms. Ca m'évite d'ecouter puis de retelecharger à chaque nouvelle écoute et en plus, je peux sauter des passages dans la musique.
Il y a en fait 2 scripts:
- Le script principal qui telecharge la playlist(m3u ou pls) ou un fichier quelconque dans un repertoire precisé dans le script. Si ce repertoire depasse une certaine taille, les fichiers les plux vieux sont supprimés. Ce script utilise wget et mplayer pour recuperer les fichiers.
- Le script specifique xmms que j'appelle dans firefox pour ouvrir les playlists. Voici ce script:
~/bin/playlist/xmms_download.sh
Code: |
#! /bin/sh
# Telecharge le fichier ou l'ensemble des fichiers de la playlist passée en paramètre et les ouvre avec xmms des qu'ils sont telecharges
#arg 1 : la playlist ou le fichier
~/bin/playlist/download.sh "${1}" "xmms -e";
|
Et maintenant le script principal:
~/bin/playlist/download.sh
Code: |
#! /bin/bash
# Telecharge un mp3 ou une playlist de type m3u ou pls dans le repertoire de destination precise par la variable "dir".
#arg 1 : la playlist ou le fichier
#arg 2 optionnel: la commande pour ouvrir ce(s) fichier(s) à chaque fois qu'un est fini de telecharger
# Taille maximale du répertoire en Mega Octets. Si elle est dépassée, les fichiers sont supprimés à la fin du script. max_size=1000 par defaut (1 Giga octet)
#les sous repertoires ne sont pas pris en compte dans le decompte de la taille
max_size=1000;
# Repertoire ou sont stockés les fichiers téléchargés
dir="/opt/download/net/download";
# fichier pour ecrire temporairement la liste des fichiers à telecharger
tmp="/home/bob/download_tmp`date '+%s'`";
#echo ${tmp};
dir="/opt/download/net/download";
# écrit la liste des fichiers d'une playlist m3u
#arg 1 : la playlist
#arg 2 optionnel: écrit dans le fichier passé en argument 2
function m3u ()
{
if [ $# == 2 ];
then
{
#echo "On ecrira dans ${2}";
cat ${1} | grep -v "#" > ${2};
}
else
{
#echo "On affichera";
cat ${1} | grep -v "#";
}
fi
}
# écrit la liste des fichiers d'une playlist pls
#arg 1 : la playlist
#arg 2 optionnel: écrit dans le fichier passé en argument 2
function pls ()
{
if [ $# == 2 ];
then
{
#echo "On ecrira dans ${2}";
cat ${1} | grep File|cut -d= -f 2 > ${2};
}
else
{
#echo "On affichera";
cat ${1} | grep File|cut -d= -f 2;
}
fi
}
#on veut recuperer le nom du fichier
l=(`dirname "${1}"|wc -c`); #nb de caracteres de l'adresse
#echo ${l};
l=$(expr $l + 1);
#echo ${l};
nom=`echo ${1}|cut -b ${l}-`;
#echo ${nom};
ext=`echo ${nom} | cut -d. -f 2`;
#echo ${ext};
case "${ext}" in
"m3u")
#~/bin/playlist/m3u.sh "${1}" ${tmp};;
m3u "${1}" ${tmp};;
"pls")
#~/bin/playlist/pls.sh "${1}" ${tmp};;
pls "${1}" ${tmp};;
*) #on suppose que ce n'est pas une playlist
#echo "fichier simple";
echo "${1}"> ${tmp};;
esac
#cat ${tmp};
#maintenant on telecharge les fichiers un par un ( pas simultanement)
n=`cat ${tmp}|wc -l`; #nb de fichiers à telecharger
for ((i=1; i<=n;i++)) do
{
fic=`cat ${tmp} | head -n ${i} |tail -1 `; # le i-eme fichier à telecharger
l=(`dirname "${fic}"|wc -c`); #nb de caracteres de l'adresse
l=$(expr $l + 1);
nom=`echo ${fic}|cut -b ${l}-`; #nom du fichier sans l'adresse
dest="${dir}/${nom}"; #chemin complet du fichier de destination
#on verifie si le fichier existe
if [ -a ${dest} ];
then
{ #On indexe le fichier par le nb de secondes écoulées depuis 1970
dest="${dir}/`date '+%s'-`${nom}";
#echo ${dest};
}
fi
#echo "On lance wget";
#`wget -nv -o ${dir}/wget.log -O ${dest} ${fic}`;
taille_avant=`du --max-depth=0 ${dir} | cut -f 1`;
protocole=`echo ${fic} | cut -d/ -f 1`;
echo "protocole=${protocole}";
case "${protocole}" in
"http:")
echo "on utilise wget";
wget -q -O ${dest} ${fic};;
"mms:")
echo "on utilise mplayer"
mplayer -dumpstream -dumpfile "${dest}" "${fic}";;
*) echo "Le protocole ${protocole} est inconnu";;
esac
taille_apres=`du --max-depth=0 ${dir} | cut -f 1`;
#echo "C'est fait";
if [ $taille_avant -eq $taille_apres ];
then
{
echo "erreur dans le telechargement";
}
else
{
echo "telechargement OK";
#on lance la commande passée en argument
if [ $# == 2 ];
then
${2} "${dest}";
fi
}
fi
}
done
rm ${tmp};
#taille=`du -m --max-depth=0 ${dir} | cut -f 1`;
#taille=$(expr $taille );
#echo ${taille};
# on supprime les fichiers les + vieux si la taille du repertoire sans ses sous-repertoires depasse max_size defini au debut du script
while [ `du -m --max-depth=0 ${dir} |cut -f 1` -ge $max_size ]; do
{
f=`ls ${dir} -t -u |tail -1`;
echo "on supprime ${f}";
rm ${f};
}
done;
#echo "fini";
|
Si vous voulez des précision ou voyez des améliorations possibles, n'hesitez pas a m'en faire part.
PS: C'est mon premier vrai script, il y a donc certainement pas mal de choses qui auraient pu etre faites de maniere plus elegante ou plus rapide |
|