Merci à vous deux !
Comme je souhaites que le script reste générique (donc utilisable par qui veut), je préfère que le nombre de morceaux à copier soit calculé en fonction de la place disponible sur le baladeur.
Du coup, j'ai réécrit le script en utilisant la commande sort -R pour définir une liste de morceaux aléatoires qui remplis le baladeur en une fois au maximum de sa capacité. Ça complique un peu le script vis à vis de ce que vous proposez. Mais tout de même, au revoir la commande perl et le test de remise en jeu :-)
Il garde globalement les fonctions précédentes :
- Contrôle du montage du baladeur. Interruption du script en son absence
+ Contrôle de la présence de la musithèque. Interruption du script en son absence
+ Contrôle de la présence de morceaux dans la musithèque. Interruption du script en leur absence
- Suppression des anciens morceaux
- Sélection de tout les ogg, mp3 et wav de la musithèque
+ Prise en compte des répertoires derrière des liens symboliques (ajout de l'option -L à find)
- Remplissage du baladeur avec une liste aléatoire de morceaux
- La copie s'ajuste à la taille disponible et s'effectue en une fois
- Les morceaux sont rangés automatiquement selon les dossiers de tri de la musithèque (ex : [Auteur]/[Album])
- Indication du bon déroulement du script via Notify-OSD [edit]
+ Un mode verbeux disponible pour les sorties en terminal
Bon, probablement qu'un pro ou un puriste s'arracherait les cheveux à la vue du résultat, mais il fait bien ce que je lui demande ^^
#!/bin/bash
######################################################
# Script de copie aléatoire de musique sur baladeur #
# Écrit par lylambda, inspiré par stefP #
# Version 5 #
# Shell : Supprimez #++# pour activer les sorties #
# http://forum.ubuntu-fr.org/viewtopic.php?id=200739 #
######################################################
# Définir le répertoire de destination
# /!\ À modifier selon le baladeur
rep_dest="/media/MUSIC/MUSIC"
# Définir le répertoire d'origine
# /!\ À modifier selon l'emplacement de la bibliothèque musicale
rep_orig="${HOME}/Musique"
#++#echo "Transfert musicale aléatoire de ${rep_orig} vers ${rep_dest}"
# Si le répertoire de destination existe :
if [[ -d ${rep_dest} && -d ${rep_orig} ]]; then
# Afficher une notification
notify-send -i music-player "Random Music Copy" "\nSuppression des anciens morceaux"
#++#echo "Suppression des anciens morceaux"
# Vider le répertoire de destination
rm -r ${rep_dest}/*
# Créer dans le répertoire d'origine, un fichier texte listant de manière aléatoire les morceaux disponibles
# --> Liste tout les morceaux mp3, ogg et wma avec leurs dossiers parents respectifs (ex: [Auteur]/[Album]/Morceau)
find -L ${rep_orig} -type f \( -iname "*.mp3" -o -iname "*.ogg" -o -iname "*.wma" \) | sort -R > ${rep_orig}/list_music && sed -i -e "s#${rep_orig}/##g" ${rep_orig}/list_music
# Si le répertoire d'origine contient de la musique
if test -s ${rep_orig}/list_music; then
#++#echo "Création de la liste des morceaux disponibles"
# Définir la taille disponible sur le répertoire de destination
taille_dispo=`df ${rep_dest} | awk '{print $4}' | head -2 | tail -1`
#++#echo "Taille disponible : ${taille_dispo}"
# Initialiser le compteur de morceaux à copier
nbr_copie=0
# Afficher une notification
notify-send -i music-player "Random Music Copy" "\nChoix des morceaux à copier"
# Lancer la boucle définissant les morceaux à copier pour remplir le répertoire de destination
while true; do
# Sélectionner un morceau
fic_music=`head -n $((${nbr_copie}+1)) ${rep_orig}/list_music | tail -1`
# Définir la taille du morceau
taille_music=`du -s "${rep_orig}/${fic_music}"| awk '{print $1}'`
# Si la taille disponible est strictement inférieur à la taille du morceau :
if test "${taille_dispo}" -lt "${taille_music}"; then
# Créer dans le répertoire d'origine, un nouveau fichier texte listant que les morceaux sélectionnés
head -n ${nbr_copie} ${rep_orig}/list_music | sort > ${rep_orig}/select_music
#++#echo "Création de la liste des morceaux sélectionnés"
# Quitter la boucle
break
fi
# Sinon actualiser de la taille disponible
taille_dispo=$((${taille_dispo}-${taille_music}))
# Incrémenter le compteur de morceaux de 1
nbr_copie=$((${nbr_copie}+1))
#++#echo "Sélection du morceau ${nbr_copie} : ${fic_music}"
#++#echo "Taille prise : ${taille_music} - Taille disponible : ${taille_dispo}"
done
# Afficher une notification
notify-send -i music-player "Random Music Copy" "\nLancement de la copie aléatoire"
#++#echo "Lancement de la copie aléatoire"
# Copier chaque morceau sélectionné
IFS=$'\n'
for morceau in $(cat ${rep_orig}/select_music); do
cd ${rep_orig} && cp --parents "${morceau}" "${rep_dest}" && cd
done
unset IFS
# Afficher une bulle de notification
notify-send -i music-player "Random Music Copy" "\nOpération terminée :\nCopie de ${nbr_copie} morceaux"
#++#echo "Copie de ${nbr_copie} morceaux - Place restante : ${taille_dispo}"
# Supprimer les fichiers texte temporaires
rm ${rep_orig}/list_music
rm ${rep_orig}/select_music
#++#echo "Suppression des fichiers temporaires"
# Si le répertoire d'origine ne contient pas de musique
else
# Afficher une notification
notify-send -i error "Random Music Copy" "\nMusithèque vide :\nAucun fichier mp3, ogg ou wma n'a été détecté."
#++#echo "Aucun fichier mp3, ogg ou wma n'a été détecté dans ${rep_orig}"
fi
# Si le répertoire de destination n'existe pas
elif [[ -d ${rep_orig} ]]; then
# Afficher une notification
notify-send -i error "Random Music Copy" "\nBaladeur non-monté :\n${rep_dest} introuvable."
#++#echo "${rep_dest} introuvable"
# Si le répertoire d'origine n'existe pas
elif [[ -d ${rep_dest} ]]; then
# Afficher une notification
notify-send -i error "Random Music Copy" "\nMusithèque absente :\n${rep_orig} introuvable."
#++#echo "${rep_orig} introuvable"
# Si aucun répertoire n'existe
else
# Afficher une notification
notify-send -i error "Random Music Copy" "\nRépertoires introuvables :\nVérifiez les variables."
#++#echo "${rep_orig} et ${rep_dest} introuvable"
fi
#++#sleep 300
exit 0
PS1 : Pour find, quel est l'avantage de
-type f -iname "*.mp3" vis à vis de
-name '*.mp3' ? Dans le doute, je l'ai utilisé, mais je n'ai pas perçu de résultat différents.
PS2 : Pour pouvoir conserver l'arborescence originel de la musithèque, j'ai dut faire un vilain hack à base de :
> ${rep_orig}/list_music && sed -i -e "s#${rep_orig}/##g" ${rep_orig}/list_music
cd ${rep_orig} && cp --parents "${morceau}" "${rep_dest}" && cd
Il aurait moyen de rendre cela plus propre ?