#1 Le 13/09/2009, à 11:31
- Marzikill
[ MPD ] Récupérer les paroles.
Bonjour à tous !
Voilà, depuis quelques temps, j'avais remarqué que Sonata ne permettait plus la recherche automatique des paroles des chansons. Bien dommage, car c'est toujours agréable de les connaitres.
Je me suis dit qu'il ne devait pas s'agir d'un exercice trop difficile (total noob en bash , mais j'ai appris pas mal de choses sur les manipulations de chaines grâce à cela !), alors je me suis mit à la tâche, et voici ce que je suis parvenu à faire (le script est opérationnel, du moins, je n'ai pas encore trouvé d'erreur) :
#!/bin/bash
# Necessite mpd, mpc, wget.
# On récupère le titre et l'autre de la chanson grace à mpc, que l'on formatte proprement grace à sed.
CurrentSong=$(mpc current | sed "s/ - /:/g" | sed "s/ /_/g")
# On télécharge les paroles, et on bazarde la sortie de wget, qui ne nous interresse pas.
wget http://lyrics.wikia.com/lyrics/$CurrentSong 2> /dev/null
# Cette ligne est là pour avoir le titre de la musique au sommet du fichier généré. Il doit y avoir une autre méthode un peu plus propre ?
echo $(mpc current) > "$(mpc current).txt"
# On débroussaille le fichier html téléchargé à coups de grep, sed, et cut, et on enregistre la sortie dans un fichier texte.
grep lyricbox $CurrentSong | sed -e "s/<[^<>]*>/\n /g" | sed -n "10,$ p" | cut -d "<" -f 1 | sed -e s/.lyricbox// >> "$(mpc current).txt"
# On affiche les paroles.
cat "$(mpc current).txt"
# On supprime le fichier temporaire.
rm $CurrentSong
J'aimerais avoir votre avis quand à ce code, car j'entend souvent parler de code crade (d'ailleurs, tout le monde semble dire qu'un code bash est "crade"...). Et j'avoue que j'aimerai bien savoir ce dont il s'agit.
Y voyez vous des fautes importantes ? Des idées d'amélioration ? D'optimisation ?
Amicalement
Marzikill.
Edit : après quelques tests supplémentaires de mon script, j'ai trouve une idée d'amélioration notable ! Le gestion des erreurs... je verrai ça un peu plus tard, et posterai ici le résultat.
Dernière modification par Marzikill (Le 13/09/2009, à 11:39)
Hors ligne
#2 Le 20/09/2009, à 17:19
- informaticous
Re : [ MPD ] Récupérer les paroles.
ALORS MERCI, j'allais en faire un pour mon conky, mais tu ma devance.
Ce qui ne me dérange pas !!!
Super travaille juste un petit bémol.
c'est que j'ai $('').each(function (i){ qui s'affiche a la fin
voici le log
fred@inf:~$ sh mpd.sh
Linkin Park - Runaway
Graffiti decorations under a sky of dust
A constant wave of tension on top of broken trust
The lessons that you taught me, I learned were never true
Now I find myself in question, they point the finger at me again
Guilty by association, you point the finger at me again
I want to run away, never say good bye
I want to know the truth instead of wondering why
I want to know the answers, no more lies
$('').each(function (i){
j'y suis, j'y reste
Hors ligne
#3 Le 20/09/2009, à 21:07
- AnsuzPeorth
Re : [ MPD ] Récupérer les paroles.
Bjr,
Juste un petit truc en passant ...!
Tu utilise la commande mpc plusieurs fois, ce qui est inutile je pense.
Mets le retour de mpc dans une variable et travaille sur cette variable, ca sera moins gourmand en ressource donc plus rapide.
Je ferais un truc du genre : (mais je suis pas parole d'évangile non plus !)
VAR_MPC=$(mpc current)
FICHIER="${VAR_MPC}.txt"
CurrentSong=$(sed 's/ - /:/g;s/ /_/g' <<< "${VAR_MPC}")
echo "${VAR_MPC}" > "${FICHIER}"
Edit: J'avais pas vraiment regardé le script, je vois aussi que tu utilise "$CurrentSong" (via une commande sed) uniquement pour avoir le nom du fichier téléchargé par wget. Ne serait-il pas mieux d'utiliser l'option -O de wget pour indiquer un fichier (dans /tmp par exemple), ca ferait une commande moins ! Voir même 2, le rm ne serait plus nécessaire non plus (réécriture dessus a chaque fois et suppression auto dans /tmp )
Dernière modification par AnsuzPeorth (Le 20/09/2009, à 21:16)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#4 Le 21/09/2009, à 18:10
- Marzikill
Re : [ MPD ] Récupérer les paroles.
Merci pour vos commentaires !
Alors, j'ai essayé d'en tenir compte dans la nouvelle version du script. ("version" étant un bien grand mot, j'ai juste rajouté un "if", hein.. . Pour le coup du "$('').each(function (i){", je vais voir ça. C'est disposition de la page de LyricWiki qui a changé entre temps. Va falloir que j'adapte un peu..
Pour le coup du wget -O, je l'avais fait, mais la flemme de reposter un nouveau message...
Donc, voici la nouvelle version (qui normallement fonctionne):
#!/bin/bash
# Necessite mpd, mpc, wget.
# Gestion des recherches. --> DONE
# Gestion des erreurs.
function GetSong() {
wget http://lyrics.wikia.com/lyrics/$CurrentSong -O /tmp/$CurrentSong 2> /dev/null
# Insérer ici une condition ? Si le téléchargement des paroles échoues.
grep lyricbox /tmp/$CurrentSong 2> /dev/null | sed -e "s/<[^<>]*>/\n /g" | sed -n "10,$ p" | cut -d "<" -f 1 | sed -e s/.lyricbox// | sed '$d' >> "${Song}".txt
# Facultatif :
# rm $CurrentSong
}
function DisplayLyrics() {
echo "Voulez vous afficher les paroles précédement téléchargées ? O/N" ; read Answer
case $Answer in
o|O ) cat "${Song}.txt" ;;
n|N ) echo "Au plaisir !"
esac
}
if [[ $1 = "-g" ]]
then
echo "Entrez le nom de l'artiste : " ; read ArtistName
echo "Entre le nom de la chanson : " ; read SongName
Song=$(echo $ArtistName $SongName)
CurrentSong=$(echo $Song | sed "s/ - /:/g" | sed "s/ /_/g")
GetSong
DisplayLyrics
else
Song=$(mpc current)
CurrentSong=$(echo $Song | sed "s/ - /:/g" | sed "s/ /_/g")
echo $Song > "${Song}.txt"
GetSong
DisplayLyrics
fi
Pour la prochaine fois, vous aurez le droit à un mode démon (bah... juste une boucle while, en fait, rêvez pas... ) et aussi à une gestion des erreurs (parce que vous en aurez à mon avis.. ).
N'hésitez pas à me faire part des problèmes que vous auriez pu rencontrer.
Amicalement
Marzikill.
Edit : Voilà ! Le petit problème du "$('').each(function (i){" est résolu.
Dernière modification par Marzikill (Le 21/09/2009, à 18:17)
Hors ligne