Le Blog du Geek Joyeux

Plus moins vite tu codes, moins plus vite ça plante

Automatiser les tags ID3 de vos mp3

| Commentaires

Cet article présente trois petits scripts ayant pour but d’appliquer automatiquement les tags ID3 sur vos mp3.

Prerequis

Ces scripts se servent des programmes suivants :

  • eyeD3 : permet l’édition des tags ID3
  • jpegoptim : optimisation des images
    (suppression des infos inutiles, pratique aussi pour les images web)

Sous Debian, il existe un package pour eyeD3 ainsi que pour jpegoptim.

Conventions de nommage des fichiers

Ces scripts se basent sur des conventions de nommage que j’ai établi pour mes mp3. Mais elles peuvent ne pas être du gout de tout le monde.

Il suffit donc d’adapter les expressions régulières a vos conventions de nommage. Si vous n’en avez pas, ces scripts n’auront aucune utilité pour vous ;)

~/Music
└── Nom_Artist
    ├── Titre_Album
    │   └── 01___Titre_Du_Morceau
    └── Autre_Album
        ├── CD_1
        │   └── 01___Titre_Du_Morceau
        └── CD_2
            └── 01___Titre_Du_Morceau

Le script tag_tracks

Ce script se charge d’appliquer les tags ID3 sur chaque mp3 du dossier.

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
59
60
61
62
63
64
65
#!/usr/bin/env bash

#
# expressions regulieres utilisees pour obtenir les informations
#
reg_name="s/^\([0-9]\{2\}\)___\(.\*\)\.\(mp3\|ogg\)/\2/"
reg_artist="([^/]+)/[^/]+(/CD_[0-9]+)?$"
reg_album="[^/]+(/CD_[0-9]+)?$"

#
# Si on est en dans un album compose d'un seul CD,
# on recupere l'image Folder.jpg du dossier courant.
# Dans le cas contraire, c'est celle du dossier parent.
#
if [ -f ./Folder.jpg ]; then
  img='./Folder.jpg'
else
  if [ -f ../Folder.jpg ]; then
    img='../Folder.jpg'
  fi
fi

#
# Optimisation de l'image pour qu'elle prenne moins de place
#
jpegoptim --strip-all $img

#
# On effectue le traitement pour chaque fichier mp3 du dossier
#
for fic in *.mp3
do
  if [ -f $fic ]; then
    #
    # Recuperation des informations du fichier
    #
    num=`echo $fic | sed "s/\([0-9]\{1,3\}\).\*/\1/"`
    name=`echo $fic | sed $reg_name | tr -s "_"""`
    artist=`pwd | grep -o $reg_artist | cut -d'/' -f1 | tr -s '_'`
    album=`pwd | grep -o $reg_album | cut -d'/' -f1 | tr -s '_'`
    album_num=`pwd | grep -o "CD_[0-9]+$" | cut -d'_' -f2`

    #
    # Si l'album ne contient qu'un seul CD
    #
    if [ -z $album_num ]; then
      album_num='1'
    fi

    #
    # Application du tag ID3.
    # Si un tag existait avant, il est supprime.
    # Cela permet d'eviter l'accumulation de la meme image
    # dans le tag.
    #
    eyeD3 --remove-all --to-v2.4 \
          -t"$name" \
          -a"$artist" \
          -A"$album" \
          -n$num \
          --add-image=$img:FRONT_COVER \
          --set-text-frame=TPOS:$album_num \
          $fic 1> /dev/null
  fi
done

Le script tag_album

Ce script se charge te d’appeler le script tag_tracks sur chaque album d’un artiste.

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
#!/usr/bin/env bash

#
# Pour chaque album
#
for d in `ls -x`
do
  if [ -d $d ]; then
    cd $d
    line="$d"

    #
    # Si c'est un album compose de plusieurs CDs,
    # pour chaque CD on appel le script tag_tracks
    #
    if [ -d ./CD_* ]; then
      for cd in ./CD_*
      do
        cd $cd && /chemin/vers/tag_tracks 2>&1 && line="$line [OK]"
        cd ..
      done
      cd ..

    #
    # Si l'album ne contient qu'un seul CD,
    # on appele directement le script tag_tracks
    #
    else
      /chemin/vers/tag_tracks 2>&1 && line="$line [OK]"
      cd ..
    fi
    echo $line
  fi
done

Le script tag_artists

Ce dernier script appel tag_albums pour chaque artiste de votre dossier de musique.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env bash

#
# Pour chaque artiste (1 artiste = 1 dossier)
#
for d in `ls -x`
do
  #
  # On entre dans le dossier
  # et on fait appel au script tag_albums
  #
  if [ -d $d ]; then
    cd $d
    line="------------------- $d"
    /chemin/vers/tag_albums && line="$line [OK]"
    echo $line
    cd ..
  fi
done

En résumé

Vous avez donc maintenant trois scripts qui vous permettent d’intervenir à différents niveaux de votre arborescence ;)

Commentaires