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 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 tongue, 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... tongue 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 ! wink
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.. wink. 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.. big_smile

Pour le coup du wget -O, je l'avais fait, mais la flemme de reposter un nouveau message... big_smile

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... big_smile) et aussi à une gestion des erreurs (parce que vous en aurez à mon avis.. big_smile).

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