Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/03/2010, à 15: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... big_smile (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, à 19:07)


Linux User #508094
Pour une meilleure coopération, utilisez des liens relatifs sur le forum !

Hors ligne

#2 Le 23/03/2010, à 16:16

mikedafunk

Re : [ASTUCE] Script qui lit toute la musique d'un dossier avec mpd.

Merci nordinatueur wink


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, à 22:23

nesthib

Re : [ASTUCE] Script qui lit toute la musique d'un dossier avec mpd.

(abonnement pour quand j'aurais du temps wink)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#4 Le 02/02/2011, à 20: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