# [Script] Telecharger les fichiers d'une playlist

## bob1977

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

```

#! /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 

```

#! /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   :Wink: 

----------

