Rolinh

Rolinh' release

Convertir Simplement Ses M4A en MP3 via Un Script

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash
# converts m4a files to mp3
# song tags should be preserved

if ! which faad >/dev/null; then
  echo "faad executable not found." >&2;
  exit 1;
fi
if ! which lame >/dev/null; then
  echo "lame executable not found." >&2;
  exit 1;
fi
if ! which id3v2 >/dev/null; then
  echo "id3v2 executable not found." >&2;
  exit 1;
fi

echo -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."
      ;;
esac

echo -e "\nBe patient if you convert lots of file."

while read m4afile; do

  mp3file=$(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} ]]; then
      rm -v "$m4afile"
  fi

done < <(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.