#1 Le 03/12/2009, à 21:09
- jimmy64
script de génération de playlists
Bonjour à tous,
Je suis débutant en scripting et j'avoue que je galère à fond....
J'essaye de faire un script qui me génère des playlists particulières....
Ma musique se trouve dans /volume1/music/
J'aimerais créer un script qui génère une playlist pour chaque dossier (= artistes) dans le dossier music...
---- Exemple ---
Je veux créer les playlists de mon dossier Variétés.
Le script va dans /volume1/music/Varietes/ et à cette racine, crée autant de fichier .m3u qu'il y a d'artistes... exemple :
ls /volume1/music/Varietes/
Alain Souchon.m3u
Nirvana.m3u
ect....
Pouvez vous m'aider svp ?
Hors ligne
#2 Le 03/12/2009, à 21:19
- wido
Re : script de génération de playlists
Hors ligne
#3 Le 03/12/2009, à 21:47
- jimmy64
Re : script de génération de playlists
lool merci !!!
je vais analyser son script, ca a l'air costaud.... !
Hors ligne
#4 Le 03/12/2009, à 23:43
- jimmy64
Re : script de génération de playlists
alors le script du lien est assez compliqué et j'ai donc pensé faire plus simple, le but étant aussi d'apprendre et m'exercer
Seul soucis dans mon script : le script gère très mal les espaces dans les noms de fichiers et je ne sais pas comment résoudre ça....
#!/bin/bash
music="/home/$USER/Musique/"
playlist="/home/$USER/playlists/"
cd $music
for artiste in `ls`
do
playlist_courant="$playlist$artiste.m3u"
artiste_courant="$music$artiste/"
echo > $playlist_courant
for fichier in `find $artiste_courant -name "*.mp3"`
do
echo "$fichier" >> $playlist_courant
done
done
Hors ligne
#5 Le 04/12/2009, à 00:15
- jimmy64
Re : script de génération de playlists
J'ai résolu le problème avec la modification de la var IFS... mais j'aurais aimé trouvé d'autres moyens comme l'utilisation des " " mais cela ne marche pas...
je laisse ce thread ouvert pour toute suggestion
Hors ligne
#6 Le 04/12/2009, à 00:51
- AnsuzPeorth
Re : script de génération de playlists
Bjr,
Tu as lu le thread du lien de wido jusqu'au bout ? Je donne une simple ligne pour faire le travail avec awk (dernier post)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#7 Le 05/12/2009, à 17:46
- jimmy64
Re : script de génération de playlists
@AnsuzPeorth :
oui j'ai lu le post jusqu'au bout mais je souhaitais quand meme apprendre à faire un script moi même
je me suis dit qu'ensuite j'essayerais des "one line" comme ta solution mais j'avoue ne pas l'avoir comprise....
find "$DOSSIER" -type f -printf "\"%p\"@\"%h\"" | egrep "(\.mp3|\.ogg|\.wma)" | awk -F@ '{fichier=$1 ; chemin=$2} {string=sprintf("echo %s >> %s/00-$(basename %s).m3u", fichier, chemin, chemin)}{system(string)}'
si tu es partant, puis je te contacter en MP ou ici pour avoir des explications stp ?
ce qui me rend fou c'est que je sais programmé en Java mais je suis incapable de comprendre les caractères spéciaux de tes commndes !!!!
Hors ligne
#8 Le 06/12/2009, à 03:31
- AnsuzPeorth
Re : script de génération de playlists
Bjr,
Quand il y a des problèmes d'espaces, il est préférable d'écrire les variables comme suit : (entourée de guillemets, logiquement, il n'y a plus de problèmes...enfin, ca dépends des commandes )
"${var}"
Je vais tenté une explication pour la commande oneline.
find "$DOSSIER" -type f -printf "\"%p\"@\"%h\"" | egrep "(\.mp3|\.ogg|\.wma)" | awk -F@ '{fichier=$1 ; chemin=$2} {string=sprintf("echo %s >> %s/00-$(basename %s).m3u", fichier, chemin, chemin)}{system(string)}'
Commande find:
-type f rechercher que les fichiers
-printf %p nom du fichier complet avec chemin
%h chemin du fichier
@ utilisé comme séparateur
Tu remarqueras que j'ai ajouté des guillemets échappées, pour les problèmes d'espaces justement.
Donc la sortie de find sera du type
"/home/chemin/fichier/nom_fichier"@"/home/chemin/fichier"
egrep
Facile à comprendre (idem à grep -E)
J'aurais pu ajouté une commande à find pour exécuter ce travail, mais je n'ai pas cherché à l'epoque... Si tu as beaucoup de playlist à créer, il serait peut être utile de l'utiliser.
Par exemple:
find "$DOSSIER" -type f -iregex ".*\.\(mp3\|ogg\|wma)" -printf "\"%p\"@\"%h\""
awk
-F@ utiliser @ comme séparateur de champs
{fichier=$1 ; chemin=$2} on affecte les variables avec le premier et le second champs.
%s même principe que le C (d'après ce qu'on m'a dit), c'est pour utiliser les variables nommées à la fin.
donc
echo %s >> %s/00-$(basename %s).m3u", fichier, chemin, chemin
reviendrait en bash à:
echo ${fichier} >> ${chemin}/00-$(basename ${chemin}).m3u
Pour la commande basename, je suppose que tu connais !
Pour plus de détailles, voir les man respectifs.
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#9 Le 11/12/2009, à 18:09
- jimmy64
Re : script de génération de playlists
merciiiii, j'avais déj analyser ton post mais pas encore testé les commandes !!
aut fait tu sais programmé en Ash ?? Je dois adapter mes scripts en ash au lieu de bash et je trouve aucune doc sur le net
Hors ligne
#10 Le 11/12/2009, à 18:22
- wido
Hors ligne
#11 Le 13/12/2009, à 04:53
- jimmy64
Re : script de génération de playlists
nop, c'est pour mon Nas (Synology D409+) qui tourne sous une busybox et j'avoue que c'est déroutant quand on passe des possibilités d'une distrib comme Ubuntu à cet environnement la !
et le script que j'ai effectué ne marche pas bien du tout sur Ash... je pense que c'est à cause des espaces dans les noms... je vais donc tester les commandes de AnsuzPeorth qui ont plus de chances de marcher mais je n'ai pas encore eu le temps...
@AnsuzPeorth : on peut rester en contact stp ? tes commandes c'est de l'or en barres
Hors ligne
#12 Le 17/12/2009, à 01:17
- jimmy64
Re : script de génération de playlists
bon j'ai encore passé la soirée à essayer de faire marcher mon script mais je crois que j'ai définitivement un problème pour gérer les espaces dans les noms. J'ai vraiment du mal je pense à bien placer les guillemets...
==> Pouvez-vous m'aider à corriger le problème des "" ? Je pense qu'ainsi je pigerais mes erreurs et je pourrais enfin comprendre la oneLine d'AnsuzPeorth !!
#!/bin/sh
music="../Dancehall/_Artistes/"
playlistsRep="/volume1/music/playlists/"
cd "$playlistsRep"
for artiste in `"ls "$music""`
do
playlist_courant="Dancehall > "$artiste".m3u"
artiste_courant=""$music""$artiste"/"
touch "$playlist_courant"
for fichier in `"find "$artiste_courant" -name "*.mp3""`
do
echo "$fichier" >> "$playlist_courant"
done
done
Hors ligne
#13 Le 20/12/2009, à 23:03
- jimmy64
Re : script de génération de playlists
up help s'il vous plait... je dois finir ce script avant mardi matin
Hors ligne
#14 Le 20/12/2009, à 23:14
- wido
Re : script de génération de playlists
tu mets des guillemets à des commandes c'est pour cela que ça ne fonctionne pas.
`"ls "$music""`
par
`ls "$music"`
etc..
Hors ligne
#15 Le 20/12/2009, à 23:27
- Hizoka
Re : script de génération de playlists
les " sont utiles si la variable contient des espaces ou des caractères spéciaux, mais il est plus facile au final de traiter toutes les variables de la même façon.
Il est également conseillé d'appeler les variables entre {} afin d'éviter certaines interprétations par bash
De même, il vaut mieux remplacer `` par $().
donc :
#!/bin/sh
music="../Dancehall/_Artistes/"
playlistsRep="/volume1/music/playlists/"
cd "${playlistsRep}"
for artiste in $(ls "${music}")
do
playlist_courant="Dancehall > "${artiste}".m3u"
artiste_courant=""${music}""${artiste}"/"
touch "${playlist_courant}"
for fichier in $(find "${artiste_courant}" -name "*.mp3")
do
echo "${fichier}" >> "${playlist_courant}"
done
done
je n'ai pas touché au code, juste fait les modifs ci-dessus.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#16 Le 21/12/2009, à 00:11
- jimmy64
Re : script de génération de playlists
Merci bcp pour vos réponses
Hizoka, j'adore tes conseils, c'est exactement ce qu'il me manqué pour structurer correctement le code !! Quand j'ai relis mon script, je me suis fait peur en comprenant enfin les guillemets -> j'avais fait pas mal de boulettes
Par contre, j'ai tjr une erreur en sortie, avec les espaces (j'ai repris le script modifié de Hizoka) :
Pour un dossier s'appelant "album 2006" j'ai eu ça :
find: ../Dancehall/_Artistes/album/: No such file or directory
find: ../Dancehall/_Artistes/2006/: No such file or directory
Grrr je vois pas l'erreur pourtant
Hors ligne
#17 Le 21/12/2009, à 01:18
- Hizoka
Re : script de génération de playlists
a mon avis c'est un problème avec la boucle for (essai d'utiliser une boucle while qui lit les lignes).
remplace ta boucle for par une while :
while read fichier
do
echo "${fichier}" >> "${playlist_courant}"
done < <(find "${artiste_courant}" -name "*.mp3")
Pour faire fonctionner ta boucle for, il faudrait peut-être :
- modifier IFS en IFS=$'\n'
- mettre des " autour de $(find "${artiste_courant}" -name "*.mp3")
donc :
IFS=$'\n'
for fichier in "$(find "${artiste_courant}" -name "*.mp3")"
do
echo "${fichier}" >> "${playlist_courant}"
done
a tester mais while est plus adapté je pense.
Dernière modification par Hizoka (Le 21/12/2009, à 01:23)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#18 Le 21/12/2009, à 21:38
- jimmy64
Re : script de génération de playlists
Merci encore Hizoka Petite précision, j'utilise une Busybox et que ce soit avec la boucle while corrigée ou avec le for, cela ne fonctionne toujours pas...
la boucle while était incorrect c'était plutot :
done < "$(find "${artiste_courant}" -name "*.mp3")"
Mais cela ne fonctionne pas... j'ai remarqué que les fichier .m3u créé (donc $playlist_courant) bug aussi avec les espaces dans les noms donc dès le début il y a un souci avec le script...
Quelques indices : les fichiers m3u créés sont vides, le terminal m'affiche chaque fichier mp3 trouvé avec pas mal de "can't open directory" ou "no such file"
erf je m'en sors pas je dois dire... et toucher à l'IFS ne m'enchante pas vraiment...
Hors ligne
#19 Le 22/12/2009, à 08:56
- Hizoka
Re : script de génération de playlists
j'ai du mal à piger ça :
playlist_courant="Dancehall > "${artiste}".m3u"
touch "${playlist_courant}"
tu veux faire quoi ?
Comment vois tu tes m3u ?
un m3u par artiste contenant tous ses mp3 ?
un m3u par album contenant ses mp3 ?
Comment sont rangés tes dossiers mp3 ?
car là, j'ai la solution mais faut juste piger comment sont rangé tes dossiers et ce que tu veux comme m3u et leur contenu.
Perso :
Artiste : Sinsemilia
=> Album : Résistence
=> *.mp3 : la flamme.mp3....
=> Album : Tout c'qu'on a
=> *.mp3 : Comme dans une course.mp3...
music="/home/hizoka/Multimedia/Musiques/As de Trefle/"
playlistsRep="/home/hizoka/Multimedia/"
cd "${playlistsRep}"
while read artiste
do
nom_artiste=${artiste##*/}
if [[ ! -e "${nom_artiste}.m3u" ]]
then
echo "Dancehall" > "${nom_artiste}.m3u"
fi
while read fichier
do
echo "${fichier}" >> "${playlist_courant}"
done < <(find "${artiste}" -name "*.mp3")
done < <(find "${music}" -maxdepth 1 -mindepth 1 -type d)
un truc de ce genre
Dernière modification par Hizoka (Le 22/12/2009, à 19:02)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#20 Le 23/12/2009, à 09:08
- Hizoka
Re : script de génération de playlists
voici un script qui fonctionne chez moi :
#! /bin/bash
groupe="/home/hizoka/Multimedia/Musiques/Tryo/"
playlistsRep="/home/hizoka/Scripts_et_logiciels/scripts/"
cd "${playlistsRep}"
while read album
do
nom_album=${album##*/}
if [[ ! -e "${nom_album}.m3u" ]]
then
touch "${nom_album}.m3u"
fi
while read mp3
do
echo "${mp3}" >> "${nom_album}.m3u"
done < <(find "${album}" -name "*.mp3")
done < <(find "${groupe}" -maxdepth 1 -mindepth 1 -type d)
Il me créé les playlist pour chaque album et ils contiennent bien la liste des mp3.
Le code pour avoir tous les mp3 dans un m3u par artiste
#! /bin/bash
dossier_zic="/home/hizoka/Multimedia/Musiques/"
playlistsRep="/home/hizoka/Scripts_et_logiciels/scripts/"
cd "${playlistsRep}"
while read groupe
do
nom_groupe=${groupe##*/}
if [[ ! -e "${nom_groupe}.m3u" ]]
then
touch "${nom_groupe}.m3u"
fi
while read mp3
do
echo "${mp3}" >> "${nom_groupe}.m3u"
done < <(find "${groupe}" -name "*.mp3")
done < <(find "${dossier_zic}" -maxdepth 1 -mindepth 1 -type d)
Dernière modification par Hizoka (Le 24/12/2009, à 11:13)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#21 Le 24/12/2009, à 11:09
- Hizoka
Re : script de génération de playlists
un petit retour ?
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#22 Le 22/03/2010, à 00:28
- jimmy64
Re : script de génération de playlists
oups je vois que ca fait un long moment que j'étais pas revenu sur le sujet... j'avais un peu laché l'affaire... mais je suis de retour !!
Le problème dans ma version du script, c'est les espaces noms dans la boucle for.
Je pense qu'il existe un moyen pour la faire fonctionner sans toucher à l'IFS mais lequel?
Sinon j'utiliserais une boucle read mais je ne la métrise pas.
Voici un exemple du problème essentiel :
#!/bin/sh
music="../Dancehall/_Artistes/"
playlistsRep="/volume1/music/playlists/"
cd "${playlistsRep}"
for artiste in $(ls "${music}")
do
echo "${artiste}"
done
Pour un dossier "Album 2006" dans le dossier "music" ce script m'affiche :
Album
2006
==> Mon but c'est pour chaque artiste, créer un fichier unique artiste.m3u qui contiendra sa discographie complète
Hors ligne
#23 Le 22/03/2010, à 08:17
- Hizoka
Re : script de génération de playlists
Salut,
Pour ton mail :
- je n'utilise plus msn ni ric, je n'en ai plus le temps.
- l'utilisation du forum permet à d'autres personne de voir le cheminement
alors donne nous l'arobresence de 2-3 albums complets, histoire qu'on voit bien comment c'est et comment tu veux que ce soit.
pour for, de ce que je sais tu es obligé de changer l'IFS pour faire ce que tu veux, de base il considére l'espace comme element separateur.
while read lui considere le saut de ligne comme separateur.
donc dans ton exemple :
for artiste in $(ls "${music}")
do
echo "${artiste}"
done
donne
ls "${music}" | while read artiste
do
echo "${artiste}"
done
afin d'eviter le pipe ( le | )
while read artiste
do
echo "${artiste}"
done < <(ls "${music}")
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne