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 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 big_smile

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 smile

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 smile

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 smile)

"${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 sad

Hors ligne

#10 Le 11/12/2009, à 18:22

wido

Re : script de génération de playlists

Tu es sous BSD?

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 big_smile big_smile big_smile

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 sad sad sad

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 smile

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 big_smile

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 smile 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... sad sad sad

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 smile

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 wink

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