Finally, let us re-name the files based on their ID3 tags:
scribbu rename *.mp3
Will by default rename each file to “<artist> - <title>.mp3” with
<artist>
& <title>
each derived from the corresponding
ID3v2 frame (See Invoking scribbu rename
.) This can be
customized by providing a “template”: text interspersed with
replacement parameters to be filled in with tag contents. The
parameters begin with a ‘%’, and each parameter has a one-character
“short” form and a more descriptive “long” form. For instance,
“artist” can be represented as either %A or %(artist). So the
default template could be expressed as “%A - %T.mp3” or “%(artist)
- %(title).mp3”.
If the long form is used, the action of the replacement parameter may
optionally be modified by options given after the parameter name and a
colon in “query-style”: opt0&opt1&opt2...
where opti
is in the form name=value
or just name
. For instance, we
wanted the artist to always be taken from the ID3v1 tag, and that
field happens to use the ISO-8859-1 character encoding, we could
say:
%(artist:v1-only&v1-encoding=iso-8859-1)
Let us accept the default settings, but see what would happen without actually re-naming anything:
scribbu rename -n *.mp3 "lorca.mp3" => "Pogues, The - Lorca's Novena.mp3" "opium.mp3" => "Stephan Luke - Opium Chant Intro.mp3" "orlando.mp3" => "Bill LeFaive - Orlando.mp3"
Before we rename the files, there is a lot more hygiene that could be carried out. “lorca.mp3” has a number of empty text frames that should be removed, “opium.mp3” has a comment frame with no owner, and the ID3v1 genre in all three is set to “255”.
As I developed scribbu, and began using it to manage my personal music
collection, it became clear that providing a sub-command for every
conceivable operation was not feasible. Furthermore, many of the
things I wanted it to do were one-off tasks pertinent to a single
file, or a handful of files, that weren’t worth formally coding up as
sub-commands. What I really wanted was a way to “script”
libscribbu
(See Using libscribbu
.) I found my
solution in Guile (See The Guile Reference Manual.),
which is the topic of the next chapter.