Picard : Script nom de fichier

2023-04-13

Picard est un logiciel visant à faciliter la gestion d'une bibliothèque audio, entre autres, via la communication avec la base de données MusicBrainz. Une fonction intéressante en plus de l'import de métadonnées est le renommage automatique des fichiers locaux. Pour cela, est proposé une fonction de script rudimentaire mais fichtrement efficace. Une introduction basique officielle existe[1], mais ne permettait pas de résoudre un léger problème de diacritique – wink wink – que j'ai rencontré, idem pour ce que je trouvais ailleurs sur le net.

Usage basique

J'ai mes propres conventions pour nommer un fichier[2], l'ordre des éléments étant un équilibre me permettant de généralement les retrouver avec facilité et un tri ordonné. Pour les fichiers audio, je disgresse et me permet l'ajout de quelques métadonnées, au final l'ordre est le suivant :






À l'aide des variables par défaut, ce résultat peut être approché via `%date%_%albumartist%_%album%_%tracknumber%_%title%`. Je dis bien approché puisque différents problèmes apparaissent :





Je souligne que la pertinence de ce format repose essentiellement sur la prise en charge des métadonnées audio par des lecteurs. À défaut de quoi c'est la fonction de tri de la machine qui prendrait le relais. Mettre en avant l'année pour des fichiers audio ne m'est absolument pas intuitif, aussi je continue de regrouper les morceaux par album au sein d'un dossier nommé d'après l'artiste et le nom d'album uniquement.

Affinement

L'année peut être obtenue à l'aide de `$left$` qui tronque les X premiers caratères d'une séquence : `$left(%date%,4)`.

Outre les albums, il m'arrive de mettre la main sur des pistes uniquement et via des sources rendant difficile l'affiliation à un album, en quel cas on peut se rabattre `$if2` sur le nom de l'artiste : `$set(_fileArtist, $if2(%albumartist%, %artist%))`. En général, ces pistes vont tout de même nécessiter un traitement manuel, soulignant leur rôle marginal dans ma collection.

La fonction `$num` permet de définir un nombre de chiffres minimal en préfixant via des zéros : `$num(%tracknumber%,2)`.

La fonction `$rreplace` (ou `$replace`, sans expressions régulières) permet d'éliminer les caractères indésirables. Par facilité de maintenance, ces-derniers sont définis par des variables qui pourront être étendues par la suite :

$set(_separators,[\\.\,\\-:!?"*\\/\(\)\\[\\]&#'])

$set(_accentAM,[ĀÁǍÀ])
$set(_accentAm,[āáǎà])
$set(_accentEM,[ĒÉĚÈ])
$set(_accentEm,[ēéěè])
$set(_accentIM,[ĪÍÌ])
$set(_accentIm,[īíǐì])
$set(_accentOM,[ŌÓÒ])
$set(_accentOm,[ōóǒò])
$set(_accentUM,[ŪÚǓÙǕǗǙǛ])
$set(_accentUm,[ūúǔùǖǘǚǜ])

À défaut de méthode évidente pour appliquer les différents filtres, ceux-ci doivent malheureusement être appliqués successivement. Aussi, on facilitera la lecture et les maintenances en aval, en définissant une variable de sortie plutôt qu'un grand embriquage. Le résultat final est donc le script suivant :

$set(_fileArtist, $if2(%albumartist%, %artist%))
$set(_fileName, $left(%date%,4)_%_fileArtist%_%album%_$num(%tracknumber%,2)_%title%)

$rreplace(%_fileName%,\\s+,)
$rreplace(%_fileName%,%_separators%,)

$set(_fileName, $rreplace(%_fileName%,%_accentAM%,A))
…
$set(_fileName, $rreplace(%_fileName%,%_accentUm%,u))

%_fileName%

À noter que l'underscore permet de définir une variable qui n'est pas une métadonnée, celle-ci étant autrement associée automatiquement aux fichiers. La succession de filtres pourrait potentiellement être compressée à l'aide d'une boucle, dans le doute, et ne cherchant pas la micro-optimisation, je laisse le code ainsi. Idem pour le camelCase, je garde ça pour une prochaine fois.

Référence

[1] Writing a File Naming Script, MusicBrainz 2023

[2] Nom de fichier


Source