En faisant un tri dans ~/Music, je me suis aperçu qu’un certain nombre de
mes fichiers audio étaient en format M4A. Cela ne me plaisant pas trop et
afin notamment d’uniformiser ma médiathèque, j’ai cherché une solution me
permettant de les convertir en MP3.
Seulement, je ne voulais pas perdre les tags ID3v2 associés.
Après avoir un peu parcouru la toile, je suis tombé sur un script de conversion
conservant ces tags et basé sur les outils faad, lame et id3v2.
Je l’ai adapté à ma sauce afin notamment de supprimer les fichiers M4A originaux
une fois la conversion effectuée. Lame n’étant pas optimisé pour les processeurs
multicoeurs, l’opération de conversion peut prendre un certain temps en fonction
du nombre de fichiers à convertir. Bref, il faut être patient.
Le script cherchant les fichiers M4A dans le dossier courant, il est
préférable de le lancer à partir du dossier contenant votre collection de
fichiers musicaux.
Alors oui, c’est du bash donc moche et lent mais je l’ai utilisé pour convertir
pas moins d’une centaine de morceaux et j’ai été vraiment content du
résultat. Bref, je partage car ça peut toujours servir.
#!/bin/bash# converts m4a files to mp3# song tags should be preservedif ! which faad >/dev/null; thenecho"faad executable not found." >&2;
exit 1;
fiif ! which lame >/dev/null; thenecho"lame executable not found." >&2;
exit 1;
fiif ! which id3v2 >/dev/null; thenecho"id3v2 executable not found." >&2;
exit 1;
fiecho -n "Delete m4a file(s) after conversion?(y/n) "read yn
case$yn in
y|yes)echo -e "All right $USER, m4a files will be removed."del=0
;;
*)echo -e "Ok $USER, m4a files will be preserved." ;;
esacecho -e "\nBe patient if you convert lots of file."while read m4afile; domp3file=$(echo"$m4afile" | sed s/\.m4a/.mp3/g)ARTIST=$(faad -i "$m4afile" 2>&1 | grep '^artist: ' | sed 's/^artist: //')TITLE=$(faad -i "$m4afile" 2>&1 | grep '^title: ' | sed 's/^title: //')ALBUM=$(faad -i "$m4afile" 2>&1 | grep '^album: ' | sed 's/^album: //')GENRE=$(faad -i "$m4afile" 2>&1 | grep '^genre: ' | sed 's/^genre: //')TRACKNUMBER=$(faad -i "$m4afile" 2>&1 | grep '^track: ' | sed 's/^track: //')DATE=$(faad -i "$m4afile" 2>&1 | grep '^date: ' | sed 's/^date: //')COMMENT=$(faad -i "$m4afile" 2>&1 | grep '^comment: ' | sed 's/^comment: //')CONGROUP=$(faad -i "$m4afile" 2>&1 | grep '^contentgroup: ' | sed 's/^contentgroup: //')COMPOSER=$(faad -i "$m4afile" 2>&1 | grep '^writer: ' | sed 's/^writer: //')PERFORMER=$(faad -i "$m4afile" 2>&1 | grep '^performer: ' | sed 's/^performer: //')ALBARTIST=$(faad -i "$m4afile" 2>&1 | grep '^album_artist: ' | sed 's/^album_artist: //')echo -en "\n$ARTIST / $ALBUM [$DATE] / $TRACKNUMBER - $TITLE"echo -en "\nConverting *$(basename "$m4afile")* to *$(basename "$mp3file")* ..." faad -q -o - "$m4afile" 2>/dev/null | lame -m j -q 0 --vbr-new -V 0 -s 44.1 - "$mp3file" 2>/dev/null
id3v2 -t "$TITLE" -T "${TRACKNUMBER:-0}" -a "$ARTIST" -A "$ALBUM" -y "$DATE" -g "${GENRE:-12}" -c "$COMMENT" --TORY "$DATE" --IPLS "$ALBARTIST" --TCOM "$COMPOSER" --TIT1 "$CONGROUP" --TIT2 "$TITLE" --TOPE "$PERFORMER" --TPE1 "$ARTIST" --TPE2 "$ALBARTIST" --TRCK "$TRACKNUMBER""$mp3file" 2>/dev/null
if[[${del}]]; thenrm -v "$m4afile"fidone < <(find . -iname '*.m4a' -or -iname '*.M4A')echo -e "\nConversion complete!"
PS: j’ai trouvé un workaround pour mes soucis de coloration syntaxique.
C’est pour l’instant assez moche mais mieux que rien… en attendant la résolution
du bug upstream.