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 04/07/2013, à 11:22

Fred-Prague

Script: exporter des mp3 vers un répertoire depuis une playlist pls

Bonjour à tous

Certains d'entre vous connaissent sans doute la problématique: de nos jours, une quantité d'appareils (autoradio, mini-chaînes, sèche-cheveux ...) sont capable de lire les fichiers mp3 depuis un CD, une clé USB ou carte mémoire. Hélas, la lecture des fichiers ogg ou flac est rarissime (et une partie de plus en plus importante de ma collection est dans ces formats) et d'autre part la lecture est généralement séquentielle selon l'ordre alphabétique des noms de fichiers (pas super quand on aime les petites compilations ciselées).

Depuis déjà plusieurs années, je pense me pencher sur un script qui permettrait, à partir d'une liste de lecture, d'exporter vers un répertoire des fichiers musicaux, en convertissant en mp3 ceux qui sont à un autre format et en numérotant les fichiers selon l'ordre de la liste de lecture.
À l'allure où ça va, je sens que je m'y mettrai à la retraite (ou au moins quand mes enfants auront l'âge de me laisser un peu de temps), alors je me permets de solliciter l'intervention de vous, pour qui ce sera sûrement un jeu d'enfant. Merci d'avance.

Voici le contenu d'une liste au format pls à titre d'exemple: trois fichiers (un en mp3, un en ogg et un en flac).

[playlist]
X-GNOME-Title=Liste1
NumberOfEntries=3
File1=file:///home/magdafred/Musique/Crowded%20House/Recurring%20Dream%20-%20The%20Very%20Best%20Of%20Crowded%20House/5.%20Don't%20Dream%20It's%20Over%20-%20Crowded%20House.mp3
Title1=Don't Dream It's Over
File2=file:///home/magdafred/Musique/Dave%20Brubeck/Columbia%20Jazz%20Profiles/01.%20Dave%20Brubeck%20-%20Take%20Five.ogg
Title2=Take Five
File3=file:///home/magdafred/Musique/Deep%20Purple/Singles%20A's%20and%20B's/08%20-%20Black%20Night.flac
Title3=Black Night

J'imaginerais le fonctionnement suivant:

  1. Lire le nombre de morceaux à partir de la ligne «NumberOfEntries», puis répéter autant de fois que nécessaire les opérations suivantes.

  2. À partir de chaque ligne «File#», déterminer le type de fichier.

  3. Si le fichier n'est pas au format mp3, le convertir à l'aide d'un outil adéquat (sox?).

  4. Recopier le fichier mp3 (d'origine ou converti) vers le répertoire (courant?), en rajoutant au début du nom de fichier un numéro ### (001,002 etc.) correspondant au rang du fichier dans la liste de lecture.

Peut-on faire ça avec script bash? Merci de vos conseils et de votre aide.
Si quelqu'un trouve ça tellement facile qu'il peut poster un script «tout cuit», je ne protesterai pas mais, alors, j'apprécierais beaucoup des petits commentaires dans le script expliquant ce qui fait quoi, histoire de mieux me lancer moi-même.

Frédéric

Dernière modification par Fred-Prague (Le 04/07/2013, à 22:40)


Ubuntero depuis février 2007
01/2017: Poste principal+portable+mes gamins: Ubuntu 16.04 LTS avec Unity ou Gnome Classic

Hors ligne

#2 Le 05/07/2013, à 08:21

pingouinux

Re : Script: exporter des mp3 vers un répertoire depuis une playlist pls

Bonjour,
Voici un canevas pour faire ce que tu veux :

#!/bin/bash

# On n'a pas besoin de "NumberOfEntries"
# Boucle sur toutes les lignes contenant "File#=file:///"
while read lig
do
 # num = Numéro de "File#"
   num=$(sed -rn 's#^File([0-9]+).*$#\1#p' <<<"$lig")

 # nom = Nom complet du fichier (avec le chemin)
   nom=$(sed -rn 's#^.*=file://(/.*)$#\1#p' <<<"$lig")

 # typ = Type du fichier (extension)
   typ=$(sed -rn 's#^.*=file:///.*\.([^./]+)$#\1#p' <<<"$lig")

 # new_num = Numéro sur 3 chiffres (num=15 => new_num=015)
   new_num=$(printf "%03d" "$num")

 # mp3_nom = L'extension est remplacée par "mp3"
 # (nom=/chemin/fic.ogg => mp3_nom=/chemin/fic.mp3)
   mp3_nom="${nom%.*}.mp3"

 # new_nom = Nom du fichier (sans le chemin)
 # (mp3_nom=/chemin/fic.mp3 => new_nom=fic.mp3)
   new_nom="${new_num}_$(basename "$mp3_nom")"

 # Conversions à faire s'il y a lieu
   ok=1
   case $typ in
      mp3)  echo -e "Pas de conversion mp3 -> mp3\n";;
      ogg)  echo -e "Faire conversion \n$nom -> \n$mp3_nom\n";;
      flac) echo -e "Faire conversion \n$nom -> \n$mp3_nom\n";;
      *)    echo "Type inconnu : $typ"; ok=;;
   esac

 # Copie du fichier à faire s'il y a lieu (dans le répertoire courant)
   [ "$ok" ] && echo cp "$mp3_nom" ./"$new_nom"
   echo
done < <(egrep 'File[0-9]+=file:///' "$1")

Utilisation :

mon_script ma_liste

Ce script ne modifie rien actuellement, et peut être lancé sans problème.
Il reste à faire les conversions en fonction du type, et à enlever le echo devant la commande cp si le résultat est correct.

Hors ligne

#3 Le 05/07/2013, à 13:02

Fred-Prague

Re : Script: exporter des mp3 vers un répertoire depuis une playlist pls

Merci beaucoup pingouinux

Pour la partie conversion, je devrais m'en sortir avec sox (entre temps j'ai fait un petit script capable dans un répertoire de convertir en mp3 tous les ogg et flac puis de les effacer).
Cependant, ton script "à blanc" (je l'ai baptisé "plstomp3") me sort une erreur:

magdafred@magdafred-desktop:~/Bureau$ sh plstomp3 Voyage.pls
plstomp3: 10: plstomp3: Syntax error: redirection unexpected

Même si ce n'est pas a priori nécessaire, le script et la liste de lecture sont dans le répertoire courant.
Est-ce dû au chemin d'un fichier son dans la liste?

[playlist]
X-GNOME-Title=Voyage
NumberOfEntries=7
File1=/home/magdafred/Musique/Buty/PPOOMMAALLUU/Buty\ -\ Mam\ Jednu\ Ruku\ Dlouhou.mp3
Title1=Mam Jednu Ruku Dlouhou
File2=/home/magdafred/Musique/Cechomor/To\ nejlepsi\ (Vanocni\ edice)/Cechomor\ -\ Promeny.mp3
Title2=Promeny
File3=/home/magdafred/Musique/Eric\ Clapton/From\ the\ Cradle/01.\ Eric\ Clapton\ -\ Blues\ Before\ Sunrise.ogg
Title3=Blues Before Sunrise
File4=/home/magdafred/Musique/Crowded\ House/Recurring\ Dream\ -\ The\ Very\ Best\ Of\ Crowded\ House/5.\ Don't\ Dream\ It's\ Over\ -\ Crowded\ House.mp3
Title4=Don't Dream It's Over
File5=/home/magdafred/Musique/Dave\ Brubeck/Columbia\ Jazz\ Profiles/01.\ Dave\ Brubeck\ -\ Take\ Five.ogg
Title5=Take Five
File6=/home/magdafred/Musique/Various\ Artists/Rock\ Line\ 3/d2t08.\ Deep\ Purple\ -\ Smoke\ on\ the\ Water.ogg
Title6=Smoke on the Water
File7=/home/magdafred/Musique/Elvis\ Presley/Elv1s:\ 30\ %231\ Hits/31.\ Elvis\ vs.\ JXL\ -\ A\ Little\ Less\ Conversation\ (JXL\ radio\ edit\ remix).ogg
Title7=A Little Less Conversation (JXL radio edit remix)

Merci


Ubuntero depuis février 2007
01/2017: Poste principal+portable+mes gamins: Ubuntu 16.04 LTS avec Unity ou Gnome Classic

Hors ligne

#4 Le 05/07/2013, à 14:18

pingouinux

Re : Script: exporter des mp3 vers un répertoire depuis une playlist pls

C'est un script bash, il faut l'appeler ainsi :

./plstomp3 Voyage.pls

ou bien

bash plstomp3 Voyage.pls

Voici une version corrigée, pour tenir compte du fait que tu as changé le format du fichier (File1=file:///home… -> File1=/home/…) :

#!/bin/bash

# On n'a pas besoin de "NumberOfEntries"
# Boucle sur toutes les lignes contenant "File#=file:///"
while read lig
do
 # num = Numéro de "File#"
   num=$(sed -rn 's#^File([0-9]+).*$#\1#p' <<<"$lig")

 # nom = Nom complet du fichier (avec le chemin)
   nom=$(sed -rn 's#^.*=(file://)?(/.*)$#\2#p' <<<"$lig")

 # typ = Type du fichier (extension)
   typ=$(sed -rn 's#^.*=(file://)?/.*\.([^./]+)$#\2#p' <<<"$lig")

 # new_num = Numéro sur 3 chiffres (num=15 => new_num=015)
   new_num=$(printf "%03d" "$num")

 # mp3_nom = L'extension est remplacée par "mp3"
 # (nom=/chemin/fic.ogg => mp3_nom=/chemin/fic.mp3)
   mp3_nom="${nom%.*}.mp3"

 # new_nom = Nom du fichier (sans le chemin)
 # (mp3_nom=/chemin/fic.mp3 => new_nom=fic.mp3)
   new_nom="${new_num}_$(basename "$mp3_nom")"

 # Conversions à faire s'il y a lieu
   ok=1
   case $typ in
      mp3)  echo -e "Pas de conversion mp3 -> mp3\n";;
      ogg)  echo -e "Faire conversion \n$nom -> \n$mp3_nom\n";;
      flac) echo -e "Faire conversion \n$nom -> \n$mp3_nom\n";;
      *)    echo "Type inconnu : $typ"; ok=;;
   esac

 # Copie du fichier à faire s'il y a lieu (dans le répertoire courant)
   [ "$ok" ] && echo cp "$mp3_nom" ./"$new_nom"
   echo
done < <(egrep 'File[0-9]+=(file://)?/' "$1")

Hors ligne