Journal Taguer ses fichiers audio en ligne de commande avec beets

Posté par  (site web personnel, Mastodon) . Licence CC By‑SA.
Étiquettes :
26
4
fév.
2024

Sommaire

'lut les gens,

Le contexte général

Après avoir tagué ses fichiers audio via via une interface graphique et créer ses listes de lecture audio, je continue dans la série. J'ai découvert avec bonheur dans les commentaires l'outil beets qui permet de taguer les fichiers en ligne de commande et je me permets ici de partager cette découverte.

Présentation de l'outil beets

Présentation générale

Beets est un outil écrit en python qui tout comme MusicBrainz Picard permet de taguer automatiquement les fichiers audio à partir de la base de données musicales de MusicBrainz. Rappelons que MusicBrainz est une vaste bibliothèque musicale totalement libre qui collecte des métadonnées musicales que tout un chacun peut alimenter.

Import et saisie des métadatas

Beets va faire une passe sur vos fichiers audio, les identifie plus ou moins automatiquement, télécharge les métadatas, les inscrit dans sa base de données locale et peut les enregistrer directement dans chaque fichier. Il entre dans un mode interactif quand il n'arrive pas à identifier pleinement le fichier en faisant des propositions sur des pistes qu'il estime similaires et vraiment quand il n'y arrive pas, il faut aller faire un tour sur MusicBrainz pour relever et lui indiquer l'identifiant MBID du titre.

Cela va donner quelque chose comme ça lors d'une identification automatique

/anatole/musiques/classement par genre/rock/ACDC - hell bells.mp3
Tagging track: AC/DC - Hells Bells
URL:
    https://musicbrainz.org/recording/5da479ac-3b98-43f6-88d8-6afeb9ccfcc7
(Similarity: 100.0%)

/anatole/musiques/classement par genre/rock/ACDC - highway to hell.mp3
Tagging track: AC/DC - Highway to Hell
URL:
    https://musicbrainz.org/recording/5935ec91-8124-42ff-937f-f31a20ffe58f
(Similarity: 100.0%)

/anatole/musiques/classement par genre/rock/ACDC - Let Me Put My Love Into You.mp3
Tagging track: AC/DC - Let Me Put My Love Into You
URL:
    https://musicbrainz.org/recording/69de4ab7-bfce-424e-b109-d96b34801516
(Similarity: 100.0%)

Quand il n'est pas tout à fait sûr, il demande une confirmation

/anatole/musiques/classement par genre/rock/3 door's down - when I'm gone.mp3
Correcting track tags from:
    3 Doors Down - When I'm Gone
To:
    3 Doors Down - When I’m Gone
URL:
    https://musicbrainz.org/recording/aa82cd16-2777-4bd2-8068-851810fadae6
(Similarity: 93.6%) (length)
[A]pply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? A

Quand il trouve plusieurs candidats possibles, il entre encore en mode interactif

/anatole/musiques/classement par genre/rock/ACDC - Big Gun.mp3
Finding tags for track "AC/DC - Big Gun".
Candidates:
1. AC/DC - Big Gun (58.3%) (id)
2. AC/DC - Big Gun (58.3%) (id)
3. AC/DC - Big Gun (58.3%) (id)
4. AC/DC - Big Gun (54.9%) (id, length)
5. AC/DC - Big Gun (50.0%) (id)
# selection (default 1), Skip, Use as-is, Enter search, enter Id, aBort? 1
Tagging track: AC/DC - Big Gun
URL:
    https://musicbrainz.org/recording/0588b976-c15a-4ca4-89fc-46ca10dac2da
(Similarity: 58.3%) (id)
Apply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? A

Et quand il ne propose rien de valable, il reste à lui indiquer le MBID

/anatole/musiques/classement par genre/rock/Jimi Hendrix - hey joe.mp3
Tagging track: The Jimi Hendrix Experience - Hey Joe
URL:
    https://musicbrainz.org/recording/98839598-c702-4666-ba7f-1da11a1d6611
(Similarity: 83.3%) (length)
[A]pply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? m
Finding tags for track "The Jimi Hendrix Experience - Hey Joe".
Candidates:
1. The Jimi Hendrix Experience - Hey Joe (83.3%) (length)
2. The Jimi Hendrix Experience - Hey Joe (50.0%) (id)
3. The Jimi Hendrix Experience - Hey Joe (50.0%) (id)
4. The Jimi Hendrix Experience - Hey Joe (50.0%) (id)
5. The Jimi Hendrix Experience - Hey Joe (41.7%) (id, length)
6. The Jimi Hendrix Experience - Hey Joe (41.7%) (id, length)
# selection (default 1), Skip, Use as-is, Enter search, enter Id, aBort? e
Artist: Jimi Hendrix
Track: Hey Joe
Tagging track: The Jimi Hendrix Experience - Hey Joe
URL:
    https://musicbrainz.org/recording/98839598-c702-4666-ba7f-1da11a1d6611
(Similarity: 83.3%) (length)
[A]pply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? i
Enter recording ID: 0a0d07ea-2933-4b4c-8f7f-b68a68013bfd
Correcting track tags from:
    The Jimi Hendrix Experience - Hey Joe
To:
    Jimi Hendrix - Hey Joe
URL:
    https://musicbrainz.org/recording/0a0d07ea-2933-4b4c-8f7f-b68a68013bfd
(Similarity: 33.6%) (id, length, artist)
Apply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? a

Filtrer avec beets

Une fois que la base de donnée est constituée et les métadatas téléchargées, il est assez simple ensuite de filtrer les fichiers suivant divers critères pour générer des playlists de lecture. La commande suivante permettra ainsi de créer une liste de lecture années 70.

beet list -f '$path' year:1970..1980 > playlist-années70.m3u

Pour connaitre les champs sur lesquels on peut filtrer, il faudra activer le plugins info et un beet info zz top legs donnera

/anatole/musiques/classement par genre/rock/ZZ top - leggs.mp3
            album: Eliminator
      albumartist: ZZ Top
      albumstatus: official
        albumtype: album
       albumtypes: album
              art: True
           artist: ZZ Top
      artist_sort: ZZ Top
          artists: ZZ Top
         bitdepth: 0
          bitrate: 128000
     bitrate_mode: 
       catalognum: CD 23774
      catalognums: CD 23774
         channels: 2
          country: US
             date: 1983-03-23
              day: 23
             disc: 1
        disctotal: 1
     encoder_info: 
 encoder_settings: 
           format: MP3
            genre: Rock
           genres: Rock
             isrc: USWB10702822
            label: Warner Bros. Records
           length: 273.901875
 mb_albumartistid: a81259a0-a2f5-464b-866e-71220f2739f1
mb_albumartistids: a81259a0-a2f5-464b-866e-71220f2739f1
       mb_albumid: ac85b905-13c2-48f6-8951-d45612205fc2
      mb_artistid: a81259a0-a2f5-464b-866e-71220f2739f1
     mb_artistids: a81259a0-a2f5-464b-866e-71220f2739f1
mb_releasegroupid: c58b50f0-d7a4-322c-b281-d86ebe3b8acf
mb_releasetrackid: c1ced785-f7cb-3180-94f7-a9814419f949
       mb_trackid: b7072e8d-39f8-4e7c-8c30-4317ca590d2e
            media: CD
            month: 3
    original_date: 1983-01-01
    original_year: 1983
       samplerate: 44100
           script: Latn
            title: Legs
            track: 6
       tracktotal: 11
             year: 1983

Dans lequel on pourra piocher les critères de recherche utiles pour créer une playlist.

Configuration de beets

La configuration de beets peut être assez poussée, d'autant qu'elle s'enrichit d'un nombre conséquent de plugins. Sans entrer dans le détail, voici un florilège de fichiers de configuration qui illustrent assez bien la puissance de l'outil, ici, ou bien là encore.

Le plugin bpmanalyser

J'ai choisi pour illustrer les plugins de parler du plugin bpmanalyser qui permet de calculer le tempo d'un morceau et d'inscrire cette information dans un tag marqué bpm dans les métadatas. La commande beet bpmanalyser bpm:0 permettra de rajouter le tag à toutes les pistes de la base qui ne le possèdent pas.

Pour le fun, voici le script bash qui permet de créer une liste de lecture entre deux valeurs de BPM basé sur la commande ffprobe.

#!/bin/bash
read -p "Valeur tempo min (par défaut 0): " min 
read -p "Valeur tempo max (par défaut 200): " max
read -p "Chemin absolu ou relatif dans le fichier playlist (par défaut relatif): " chemin
if [ -z "$min" ]
then 
   min=0
fi
if [ -z "$max" ]
then
   max=200
fi
if [ "$chemin" = "absolu" ]
then
    path=$(pwd)
else
    path="."
fi
IFS=$'\n'
playlist="playlist/playlist-tempo-entre-$min-$max.m3u"
rm -f $playlist
for fichier in $(find $path type f | grep '/*.ogg\|/*.mp3\|/*.flac')
do
      tempo=$(ffprobe -loglevel quiet -hide_banner -show_entries format_tags=TBPM -of default=noprint_wrappers=1:nokey=1 $fichier 2>&1)
      if [ -n "$tempo" ]
      then
        if [ $tempo -gt $min ] && [ $tempo -lt $max ]
        then
            echo "Fichier trouvé $fichier tempo $tempo"
            echo $fichier>>$playlist
    fi
      fi
done;
unset IFS

et voilà la même chose en une seule ligne

beet list -f '$path' bpm:50..100 > playlist-tempo-50-100.m3u

Cela donne des résultats surprenants, rappelons que le tempo correspond au battement régulier qui rythme le morceau. Il s’exprime en battement ou pulsation par minute et on peut très bien avoir des chansons bien rythmés avec du bon gros son de guitares saturées avec un tempo plutôt lent.
Le tempo n’est sans doute pas la valeur miracle pour créer des playlists de musiques qui sonnent de manière similaire à l’oreille et il sera sans doute utile de le compléter avec d’autres caractéristiques audio comme le rythme qui correspond à la durée des notes.

Le plugin acousticbrainz

Sans entrer dans des complications de traitement du signal pour analyser chaque fichier audio, il existe le plugin acousticbrainz qui permet de récupérer l’ensemble un certain nombre de champs d’analyse audio disponibles dans la base MusicBrainz, dont le rythme, la tonalité, la « dançabilité » d’un morceau, etc.
Une fois qu'on a téléchargé ces nouvelles données, on pourra par exemple créer une playlist en filtrant les titres dont la "dançabilité" est comprise entre 0.8 et 1, en tapant
beet list -f ‘$path’ danceable:0.8..1 > playlist-danceable-0.8-1.m3u.

Scripts de classement

En bonus je vous offre deux scripts, pour classer les fichiers audio, l'un par année de sortie et l'autre par artiste. Ils vont créer une arborescence avec des liens vers les fichiers d’origine. Ils seront bien sûr à adapter en modifiant les chemins par défaut.

Classement par année

#!/bin/bash
IFS=$'\n'
chemin="/ultra/data/musiques"
rep_genre="classement par genre"
rep_annee="classement par année"
rep_sans_annee="_Titres non datés"
if [ -d "$chemin/$rep_annee" ];then
  rm -Rf $chemin/$rep_annee
fi
for fichier in $(find $chemin/$rep_genre type f | grep '/*.ogg\|/*.mp3\|/*.flac')
do
  annee=$(ffprobe -loglevel quiet -hide_banner -show_entries format_tags=originalyear -of default=noprint_wrappers=1:nokey=1 $fichier 2>&1)
  if [ -z "$annee" ]
  then
     if [ ! -d "$chemin/$rep_annee/$rep_sans_annee" ];then
         mkdir -p $chemin/$rep_annee/$rep_sans_annee
     fi
     ln -s $fichier $chemin/$rep_annee/$rep_sans_annee
  else
     if [ ! -d "$chemin/$rep_annee/$annee" ];then
        mkdir -p $chemin/$rep_annee/$annee
     fi
     ln -s $fichier $chemin/$rep_annee/$annee
   fi 
done;
unset IFS

Classement par artiste

#!/bin/bash
IFS=$'\n'
chemin="/ultra/data/musiques"
rep_genre="classement par genre"
rep_artiste="classement par artiste"
rep_sans_artiste="Artiste inconnu"
rm -Rf $chemin/$rep_artiste
for fichier in $(find $chemin type f | grep '/*.ogg\|/*.mp3\|/*.flac')
do
  artiste=$(ffprobe -loglevel quiet -hide_banner -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 $fichier 2>&1)
  if [ -z "$artiste" ]
  then
     if [ ! -d "$chemin/$rep_artiste/$rep_sans_artiste" ];then
         mkdir -p $chemin/$rep_artiste/$rep_sans_artiste
     fi
     ln -s $fichier $chemin/$rep_artiste/$rep_sans_artiste
  else
     if [ ! -d "$chemin/$rep_artiste/$artiste" ];then
        mkdir -p $chemin/$rep_artiste/$artiste
     fi
     ln -s $fichier $chemin/$rep_artiste/$artiste
   fi 
done;
unset IFS

Pour en savoir plus

Voilà un survol rapide de beets et je ne peux que vous inciter à aller faire un tour sur la page officielle pour en apprendre davantage.
Je vous invite également à visiter la page de mon blog qui rentre plus dans le détail de l'installation et de la configuration (basique) de beets.

  • # Petite erreur ?

    Posté par  (Mastodon) . Évalué à 6 (+3/-0).

    if [ -z "$min" ]
    then 
       $min=0
    fi
    if [ -z "$max" ]
    then
       $max=200
    fi

    T'es sûr de ton $min=0 et $max=200 ? C'est pas plutôt min=0 et max=200 ?

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # beets modify

    Posté par  (site web personnel) . Évalué à 5 (+3/-0).

    Même si l'appli est surtout vendue pour tout étiqueter "once & for all", j'aime bcp la fonctionnalité de pouvoir modifier une étiquette à la volée. Efficace pour retoucher sa base de données très rapidement.

    https://docs.beets.io/en/latest/reference/cli.html#modify

  • # Quelques commandes que j'utilise

    Posté par  (site web personnel) . Évalué à 3 (+2/-0).

    J'utilise également beets, ci-dessous quelques commandes que j'utilise :

    • à l'import je mets une note de 3, ce qui me permet ensuite avec la commande modify de la dégrader à deux, tout ça pour éliminer au besoin certain album de la commande random suivante:
    beet import -t --set rating=3 [suite des args]
    
    beet modify rating=2 [suite des args]
    
    • Cette commande utilise le plugin random pour générer une playlist d'une heure avec des morceaux faisant au moins 1 minute 30 et avec une note d'au moins 3 :
    beet random -e -t60 -p rating:3.. length:1:30..
    

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.