tagutil: gérer vos tags audio en CLI 5
tagutil koi-est-ce ?
En cherchant un outil puissant pour gérer les tags et les noms de mes fichiers de musique. j’ai trouvé … Rien.
Amarok ou quelques outils graphiques font ça pas trop mal, mais jamais tout ce que j’avais besoin. De plus je voulais un truc en ligne de commande, histoire de pouvoir le planter dans des scripts, éviter les click, abuser de la completion ZSH et toussa.
Comme j’ai rien trouvé je l’ai codé (CLAP CLAP monself). C’est codé en C (un vrai langage d’homme), ça utilise taglib pour modifier et lire les tags des fichiers audios.
Ze FM
Comme je suis chic (et que comme je pond un article tout les six mois, faut bien que je les remplisse un peu) voici le FM aka le __Fuc^WFriendly Manual__. lorsque l’on lance tagutil sans arguments ça donne ça:
TagUtil v1.1 by kAworu.
usage: ./tagutil <opt> [optarg] <files>
Modify or output music file's tag.
Options:
-- <files> : only show files tag. -- is not needed but useful if the first file
argument may be a file that could match an option.
-e <files> : show tag and prompt for editing (need $EDITOR environment variable)
-r <PATTERN> <files> : rename files with the given PATTERN. you can use keywords in PATTERN:
title(%t), album(%a), artist(%A), year(%y), track(%T), comment(%c),
and genre(%g). example: "%A - %a - (%T) - %t"
-t <TITLE> <files> : change title tag to TITLE for all given files
-a <ALBUM> <files> : change album tag to ALBUM for all given files
-A <ARTIST> <files> : change artist tag to ARTIST for all given files
-y <YEAR> <files> : change year tag to YEAR for all given files
-T <TRACK> <files> : change track tag to TRACK for all given files
-c <COMMENT> <files> : change comment tag to COMMENT for all given files
-g <GENRE> <files> : change genre tag to GENRE for all given files
afficher
lorsque l’on apelle tagutil avec seulement des fichiers en arguments (pas d’option) il va afficher les tags du/des fichiers (dans l’ordre donné). Attention, si un fichier en argument n’existe pas ou n’est pas un fichier tagutil affichera une erreur et se terminera.
% ./tagutil music/JOHNNY_CASH_-_at_san_quentin_-_13_-_folsom_prison_blues.ogg
FILE: "music/JOHNNY_CASH_-_at_san_quentin_-_13_-_folsom_prison_blues.ogg"
title - "Folsom Prison blues"
album - "At San Quentin"
artist - "Johnny Cash"
year - "1969"
track - "13"
comment - ""
genre - "Country"editer
Pour éditer en masse ou par script, les options -t|-a|-A|-y|-T|-c|-g servent à éditer le champ correspondant de tous les fichiers donnés en argument (c’est rarement utile pour -t et -T d’avoir plus d’un fichier, mais bon). par exemple:
% tagutil -A "Johnny Cash" music/JOHNNY_CASH*pour éditer en mode interactif, on peut utiliser l’option -e. Pour chaque fichier donné en argument tagutil va afficher les tags, puis demander à l’utilisateur s’il veut éditer les tags. Si l’utilisateur répond y|yes $EDITOR est lancé pour éditer les tags (très convi d’éditer avec son éditeur favori). Exemple:
% tagutil -e music/JOHNNY_CASH*renommer
tagutil sait renommer un fichier en fonction de ses tags (c’est en faite la fonctionalité principale dont j’avais besoin qui m’a poussé à écrire tagutil). pour chaque fichier donné en argument, tagutil va le renommer suivant le “template” donné à l’option -r. Si l’ancien nom et le nouveau sont pareil, il ne fait rien, sinon il affiche l’ancien nom et le nouveau puis demande une confirmation de l’utilisateur. Si un fichier existe déjà avec le nom de destination, tagutil va abandonner et ne pas renommer le fichier pour éviter d’effacer un fichier existant. Un petit exemple si on veut renommer notre fichier avec le template “<artist> - <album> - <title>”:
% ./tagutil -r '%A - %a - %t' JOHNNY_CASH_-_at_san_quentin_-_13_-_folsom_prison_blues.ogg
rename "JOHNNY_CASH_-_at_san_quentin_-_13_-_folsom_prison_blues.ogg" to "Johnny Cash - At San Quentin - Folsom Prison blues.ogg" ? [y/n] y
% ls "Johnny Cash - At San Quentin - Folsom Prison blues.ogg"
Johnny Cash - At San Quentin - Folsom Prison blues.oggInstallation
tagutil est géré avec un repository mercurial. l’adresse est https://hg.kaworu.ch/tagutil/. C’est donc possible soit de faire un clone du repository:
% hg clone https://hg.kaworu.ch/tagutil/ou de se rendre sur l’url et de télécharger une archive (gz, zip, ou bz2).
Faite attention de prendre une version “tag” (genre v1.1) si vous voulez avoir une chance de pouvoir compiler car il est fort possible tip (le dernier commit dans le jargon mercurial) ne compile pas sur certains OS, voir pas tout court.
Pour la compilation voici ce qui est conseillé par la team de développement officielle (aka moi). N’oubliez pas d’installer la taglib avant de compiler tagutil :
# pour GNU/Linux
% cc -o tagutil -Wall -std=c99 -O2 -pipe -D_XOPEN_SOURCE=500 -ltag_c tagutil.c
# pour *BSD
% cc -o tagutil -Wall -std=c99 -O2 -pipe -I/usr/local/include -L/usr/local/lib/ -ltag_c tagutil.cEDIT: il y’a maintenant deux Makefile (merci bapt), choisissez le bon suivant votre OS et lancez make tagutil.
ToDo
Il y’aurait deux trois truc à faire (mais j’ai la flemme) comme gérer les
option avec getop() pour être plus “UNIX friendly”, utiliser les autohell pour le build. Il y certainement aussi
d’autres fonctionalité ou option qui pourraient être utile mais que j’utilise
pas donc n’hésitez pas à m’envoyer un mail si vous voulez ajouter une
fonctionalité etc.
Si y’en a qui ont le courage (des couilles quoi) n’hésitez pas à modifier
le code et mettre pleins de bugs dedans (j’ai l’habitude) ;)
tagutil est sous licence BSD, donc n’hésitez pas non plus à faire pleins
d’argent avec.