#1 Le 23/03/2010, à 14:46
- nordinatueur
[ASTUCE] Script qui lit toute la musique d'un dossier avec mpd.
Bonjour à tous !
Pour commencer j'adore MPD. C'est un très bon logiciel pour lire de la musique, même s'il m'a donné du fil à retordre et qu'il est a priori difficile à utiliser sans frontend graphique (notamment pour sélectionner un fichier dans sa bibliothèque.)
Surtout qu'avec ce script, on peut lire des dossiers en dehors de sa bibliothèque !
Tout d'abord, voilà mon fichier de config, si ça vous intéresse...
music_directory "/home/nordine/Musique"
playlist_directory "~/.mpd/playlists"
db_file "~/.mpd/mpd.db"
log_file "~/.mpd/mpd.log"
error_file "~/.mpd/mpd.error"
pid_file "~/.mpd/mpd.pid"
state_file "~/.mpd/mpd.state"
audio_output {
type "alsa"
name "Alsa"
}
mixer_device "alsa"
Note : J'ai depuis, arrété avec pulseaudio qui posait beaucoup de problèmes lors de la lecture de vidéos...
MPD marche tout aussi bien qu'avec...
Nouveau code !
Presque totalement refondu ! Avec la possibilité de choisir plusieurs actions à effectuer en même temps... Peut-être plus tard un menu d'aide avec zenity...
Cette version est plus rapide, et surtout fonctionne bien mieux. J'ai abandonné le mode CLI car ncmpc et ncmpcpp s'en chargent très bien !
Par contre on peux le lancer en cli, pour par exemple l'intégrer dans un script... (Même si à la base, j'ai fait ça pour le déboggage...)
Le support des playlists a été ajouté à la « One again » et est donc surement pleins de bugs. En plus de ça on ne peut pour l'instant ajouter que des m3u de playlists du dossier de mpd. Peut-être plus tard pour toute sorte de playlist.
Pour ce qui est des arguments en ligne de commande, je les ai ajoutés d'abord pour utiliser ce script avec un mode « par défaut ».
J'ouvre ainsi mes fichiers avec l'option « -a » (pour ajouter) lors d'un simple clic sur un fichier musical. Pour les autres, c'était surtout pour le déboggage et plus tard pour peut-être l'améliorer un jour.
Je ne suis pas sûr qu'il marche complètement avec les nautilus-scripts, car j'utilise principalement Thunar et son système de script.
Donnez-moi vos avis, les bugs, etc. Voire même des améliorations...
#!/bin/bash
#+----------------------------------------------------------------------+
#| Script jouant toute la musique d'un dossier avec MPD... |
#+----------------------------------------------------------------------+
#| Toute la musique d'un clic ! |
#+----------------------------------------------------------------------+
#| |
#| Created by Nordinatueur - NoN |
#| Emails: nordinatueur@gmail.com |
#| Dernière modification le 01/02/2011 |
#| |
#+----------------------------------------------------------------------+
#|
#| Dépendances : zenity, mpd, mpc, grep, sed.
#| éventuellement nautilus-scripts
#+----------------------------------------------------------------------+
#---------- Couleurs pour le tty ! --------------#
rouge='\e[31m'; vert='\e[32m'; jaune='\e[33m'; bleu='\e[34m'; rose='\e[35m'; cyan='\e[36m'; gris='\e[37m'; NC='\e[0m'
#------------------------------------------------#
#-------------- Lancement de mpd ----------------#
if ! pidof mpd &>/dev/null ; then mpd; fi;
#------------------------------------------------#
#------------------------------------------------#
#------------------ Booléens --------------------#
melanger=false; #Mélanger la playlist finale.
ajouter=false; #Ajouter à la playlist actuelle.
remplacer=false; #Remplacer la playlist actuelle.;
jouer=false; #Jouer immédiatement après ajout.
sauver=false; #Sauver la playlist.
booldossier=false; #La sélection est un dossier.
playlist=false; #La sélection est une playlist.
mpcplay=false; #Lancer la lecture après action.
in_database=true; #Le fichier est dans la bdd.
#------------------------------------------------#
#t=.`date +%s`;
aujourdhui=$(date "+%A %d %B %Y, %H:%M:%S")
#------------------------------------------------#
#-- Gestion des options --#
continuer=false;
outlog=/tmp/mpd_out.log;
until ${continuer}; do
echo "${1}";
case ${1} in
"-d"|"-D"|"debug") shift;
exec 1>${outlog};
echo "-- Débogage --" ;;
"-a"|"-add"|"ajouter") shift;
action=${action}" Ajouter";;
"-r"|"remplacer") shift;
action=${action}" Remplacer";;
"-j"|"jouer") shift;
jouer=true;;
"-m"|"melanger") shift;
melanger=true;;
"-l"|"lancer") shift;
mpcplay=true;;
"-s"|"sauver") shift;
sauver=true;;
"-e"|"edit") shift;
vim "${0}";
exit 0;;
"-h"|"help") shift;
#Aide sur la sortie d'ereur au cas où le mode débogage est utilisé
cat >&2 <<FIN_AIDE
${0##*/} <option> <fichier/dossier>
-h help : affiche l'aide
-a ajouter : ajouter sans demande graphique
-r remplacer : remplacer sans demande graphique
-m melanger : mélanger
-j jouer : jouer immédiatement
-l lancer : lancer la lecture
-s sauver : sauver la playlist
-e edit : éditer le script
-d debug : mode déboggage >${outlog}
FIN_AIDE
exit 0;;
*)
continuer=true;;
esac;
done;
#------------------------------------------------#
#---- Variables à modifier selon vos besoins ----#
#-Dossiers en majuscules
MUSIQUE="${HOME}/Musique";
MPDLINKS="${MUSIQUE}/.MPDLINKS";
MPDDIR="${HOME}/.mpd";
MPDPLAYLISTS="${MPDDIR}/playlists";
mkdir -p ${MPDLINKS};
trap "fin" SIGINT SIGTERM
fin () {
echo
echo "Au revoir ! "
exit ${1};
}
# Label:deplacement
#------------------------------------------------#
#---- Déplacement vers le bon dossier ----#
if [[ ${NAUTILUS_SCRIPT_CURRENT_URI} ]]; then
if [[ ${#NAUTILUS_SCRIPT_SELECTED_URIS} -lt 1 ]]; then
FICHIER_AUDIO="${NAUTILUS_SCRIPT_CURRENT_URI#file://}";
FICHIER_AUDIO="${FICHIER_AUDIO//%20/ }";
echo "fond du dossier : "${FICHIER_AUDIO}"<EON>";
else
FICHIER_AUDIO="${NAUTILUS_SCRIPT_SELECTED_URIS#file://}";
FICHIER_AUDIO="${FICHIER_AUDIO//%20/ }";
echo "fichier/dossier : "${FICHIER_AUDIO}"<EON>";
fi;
elif [[ -d ${1} ]]; then
FICHIER_AUDIO="${1#${PWD}}";
FICHIER_AUDIO="${FICHIER_AUDIO#/}";
FICHIER_AUDIO="${PWD}/${FICHIER_AUDIO%/.}";
elif [[ -e ${1} ]]; then
FICHIER_AUDIO="${1#${PWD}}";
FICHIER_AUDIO="${PWD}/${FICHIER_AUDIO#/}";
elif [[ -n ${DISPLAY} ]]; then
type_recherche=$( zenity --list --text="Que recherchez-vous ?" --column="option" 'dossier' 'fichier' 'playlist' --title="Que recherchez-vous ?" --height="214" --width="300" ) || exit 1;
case ${type_recherche,,} in
dossier)
FICHIER_AUDIO="$(zenity --file-selection --directory --filename="${MUSIQUE}/" )" || exit 1;;
fichier)
FICHIER_AUDIO="$(zenity --file-selection --filename="${MUSIQUE}/" )" || exit 1;;
playlist)
playlist=true;
FICHIER_AUDIO="$(zenity --file-selection --filename="${MPDPLAYLISTS}/" )" || exit 1;;
esac
else
echo "No DISPLAY";
exit 0;
fi;
FICHIER_AUDIO="${FICHIER_AUDIO//\\%/\\x}"
FICHIER_AUDIO="${FICHIER_AUDIO%.}"
FICHIER_AUDIO="${FICHIER_AUDIO%/}"
echo "FICHIER AUDIO=${FICHIER_AUDIO}";
[[ -d ${FICHIER_AUDIO} ]] && booldossier=true && echo "DOSSIER" || { ${playlist} && echo "PLAYLIST" || echo "FICHIER"; }
#------------------------------------------------#
#------------------------------------------------#
#---- Le dossier est-il déjà reconnu par mpd ? ----#
TEMP="${FICHIER_AUDIO}";
if grep "${MUSIQUE}" <<<"${FICHIER_AUDIO}" ; then
echo "Reconnu"
TEMP_REL="${TEMP#${MUSIQUE}}";
TEMP_REL="${TEMP_REL#/}";
FICH_REL=${TEMP_REL};
elif grep "${MPDPLAYLISTS}" <<<"${FICHIER_AUDIO}" ; then
echo "Playlist reconnue"
TEMP_REL="${TEMP##*/}";
TEMP_REL="${TEMP_REL%.m3u}";
FICH_REL=${TEMP_REL};
else
echo "Non reconnu";
in_database=false;
#---- Création des variables temporaires ----#
TEMP="${TEMP#${MUSIQUE}}";
TEMP="${TEMP//[\/ ]/_}";
TEMP="${MPDLINKS}/${TEMP^^}";
TEMP_REL="${TEMP#${MUSIQUE}}";
TEMP_REL=${TEMP_REL#/};
FICH_REL=${TEMP_REL}"/"${FICHIER_AUDIO##*/};
#---- Création du lien vers la musique ----#
ln -s -T "${FICHIER_AUDIO}" "${TEMP}" ;
#Si ${TEMP} n'existe pas en lien symbolique.
if [[ ! -h "${TEMP}" ]]; then
zenity --error --text="Impossible de créer un lien symbolique."; fin 2;
fi;
mpc update "${MPDLINKS#${MUSIQUE}/}";
fi;
#------------------------------------------------#
#---- Reconnaissance du dossier ----#
echo "TEMP_REL=${TEMP_REL}";
echo "TEMP=${TEMP}";
#non playlist & in_database
if ! ${playlist} && ${in_database} ; then
${booldossier} && mpc update "${TEMP}" || mpc update "${TEMP##*/}";
fi
#-------------------------------------#
#-------------------------------------#
#---- Organisation de la playlist ----#
mpc rm last 2&>/dev/null
mpc save last 2&>/dev/null
#-Si on n'a pas encore reçu d'ordre :
if [[ -z ${action} ]]; then
#-Si une liste de lecture est déjà présente, on demande quoi faire :
if [[ -n $(mpc playlist) ]]; then
Choix="$(printf "Ajouter\nRemplacer\nMélanger\nJouer immédiatement\nSauver la playlist actuelle")"
hauteur=$(( 130 + 28*$( <<<"${Choix}" wc -l ) ));
action=$(<<<"${Choix}" zenity --list --multiple --separator=" " --text="Maintenez Ctrl enfoncé pour choisir plusieurs actions." --column="Action(s)" --height="${hauteur}" ) || fin 2;
#Choix="$(printf "Ajouter\nRemplacer")"
#hauteur=$(( 130 + 28*$( <<<"${Choix}" wc -l ) ));
#egrep -iv "(ajouter|remplacer)" <<<"${action}" && { action2=$(<<<"${Choix}" zenity --list --text="Vous souhaitez mélanger et ... ?" --column="Voulez vous" --height="${hauteur}" ) || fin 2; }
#action=${action}${action2}
#-Sinon s'il n'y a pas de playlist :
else
ajouter=true;
find ${MPDLINKS} ! -name ${TEMP##*/} -exec rm -f {} ;
fi;
fi;
#------------------------------------------------#
#label:analyse action
echo "Action=${action}";
case ${action,,} in
*ajouter*) ajouter=true;;&
*remplacer*) remplacer=true;;&
*mélanger*) melanger=true;;&
*jouer*) jouer=true;;&
*sauver*) sauver=true;;
#*) fin 2;;
esac
#------------------------------------------------#
#-Afficher les booléens vrais
for _action in ajouter remplacer melanger jouer mpcplay sauver in_database booldossier; do
${!_action} && echo "${_action}=true" || echo "${_action}=false";
done;
# L'option --wait permet d'attendre la fin de « mpc update » mais on gagne le temps "perdu" pendant l'utilisation de zenity.
echo "Attente update"
i=0;
while [[ $i -le 10 ]] && mpc | grep -oi 'Updating DB'; do
((i++));
printf "${i}\n#${i}\n";
sleep 0.9;
done | zenity --progress --pulsate --auto-close
echo "Continuons"
#-La base de données est mise à jour
#------------------------------------------------#
#-Gestion de la playlist :
#------------------------------------------------#
if ${remplacer} ; then
#- Suppression des temporaires.
find ${MPDLINKS} ! -name ${TEMP##*/} -exec rm -f {} ;
mpc | grep -q '^\[playing\]' && mpcplay=true;
mpc clear >/dev/null
fi;
#------------------------------------------------#
${jouer} && mpcplay=true;
#------------------------------------------------#
derniere=$( mpc playlist | wc -l );
if ${booldossier}; then
{ ${ajouter} || ${remplacer}; } && mpc ls "${TEMP_REL}" | mpc add ;
elif ${playlist}; then
{ ${ajouter} || ${remplacer}; } && mpc load "${TEMP_REL}";
else
{ ${ajouter} || ${remplacer}; } && mpc add "${TEMP_REL}" ;
fi;
echo "Ajouté : ${FICHIER_AUDIO}"
#Jouer immédiatement ?
${jouer} && mpc play $((${derniere}+1)) ;
${melanger} && mpc shuffle ;
#Lancer la lecture ?
${mpcplay} && mpc play;
if ${sauver}; then
#- Copie de la liste.
Copie_Playlist=$(zenity --entry --title="Sauvegarde de la liste de lecture précédente..." --entry-text="${aujourdhui}" --text="Entrez le nom de la sauvegarde ou annulez." );
if [[ -n ${Copie_Playlist} ]]; then
cp -v "${MPDPLAYLISTS}"/last.m3u "${MPDPLAYLISTS}/${Copie_Playlist}"
else
echo "Ancienne playlist sauvegardée ${MPDPLAYLISTS}/last.m3u"
fi;
fi;
J'ai enlevé le script de recherche, car je travail à une amélioration qui le rendra plus rapide, et avec moins de bugs...
Si vous avez d'éventuels aides, suggestions ou commentaires n'hésitez pas.
Dernière modification par nordinatueur (Le 02/02/2011, à 18:07)
Linux User #508094
Pour une meilleure coopération, utilisez des liens relatifs sur le forum !
Hors ligne
#2 Le 23/03/2010, à 15:16
- mikedafunk
Re : [ASTUCE] Script qui lit toute la musique d'un dossier avec mpd.
Merci nordinatueur
Lubuntu 22.04 sur Lenovo AX81 et pas mal d'Amiga
Mon blog : http://mikedafunk.over-blog.org
Hors ligne
#3 Le 30/03/2010, à 21:23
- nesthib
Re : [ASTUCE] Script qui lit toute la musique d'un dossier avec mpd.
(abonnement pour quand j'aurais du temps )
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#4 Le 02/02/2011, à 19:09
- nordinatueur
Re : [ASTUCE] Script qui lit toute la musique d'un dossier avec mpd.
Voilà quelques améliorations...
Linux User #508094
Pour une meilleure coopération, utilisez des liens relatifs sur le forum !
Hors ligne