Quod Libet allows you to rename files based on their tags. In some cases you may wish to alter the filename depending on whether some tags are present or missing, in addition to their values.
Quod Libet uses _pattern_ syntax for this interaction. A pattern is some text surrounded by angle brackets, typically containing tags.
A common pattern might be:
You can use a
| to only insert text when a tag is present:
You can also specify literal text to use if the tag is missing by adding another |:
<album|<album>|No Album> - <title>
A reasonable use of albumartist would be:
..which uses the first of the following: Albumartist, Artist or “No artist”.
You can of course also move files across your filesystem to another
directory by mixing path elements and
Like tagging by filename, renaming by tags uses tag names enclosed by
<...> to substitute values. To rename songs as their artist followed
by their title, use
<artist> - <title> (The file extension, .ogg, .mpc,
and so on, is automatically added). Other common patterns include
<tracknumber>. <artist> - <title>
~/music/<artist> - <album>/<tracknumber>. <title>
You can also use tied tags to rename, e.g.
Note that if you use
/ (a directory separator) in your filename, you
‘’must’’ start the pattern with a
/ (or a
~/, which expands to your
home directory). To see why, consider what would happen if you tried to
rename the same file twice with
<artist>/<title>. The first time it
would go under
Artist/Title.ogg, the second time,
Artist/Artist/Title.ogg. When you specify the full path, this can’t
If you don’t use a / in the pattern, the file gets put in the same directory.
<tracknumber>. <title> pattern.
When the file is missing a track number, you get a filename that starts with ., which isn’t good. So Quod Libet lets you use ‘’conditional renaming’’ to avoid that.
To use conditional text, after the tag name (but inside the
| (a pipe). Then after the pipe, place all the text you want,
including other tag names inside
<...>. That text will only be added when
that tag isn’t empty.
To avoid the original problem, only display the track number, period, and space when the track number tag exists:
Quod Libet also lets you change the text if a tag ‘’doesn’t’’ exist: Use a
<tracknumber|<tracknumber>|00>. <title> will use the
track number at the start of the filename if it exists, or 00 if it
Go crazy with conditions / More examples¶
So you basically want to remember that it goes
tag>|<else tag>> You can however even put conditions inside each other.
Here’s an example that I just created, and so far it seems to work:
I first had:
/mnt/musik/<genre|<genre>/><artist|<artist>|Unknown>/<album|<album>/><tracknumber|<tracknumber> - ><title>
Let’s dissect this:
/mnt/musik: My basic music partition
<genre|<genre>/>: If there is a tag “genre”, put the song into that folder (creating the folder if necessary). If there is no tag genre, skip this level in the folder hierarchy (note that the trailing slash of
<genre>/is inside the < > that delineate the conditional “block”.
<artist>|<artist>|Unknown>/: If there’s a tag artist, put everything into that folder, else put into a folder called “Unknown”. Not that the trailing slash is outside the < > that delineate the conditional block, since we always want that folder level.
<album|<album>/>: Album folder as needed, else skip
<tracknumber|<tracknumber> - >: Prepend tracknumber if it exists
However, for songs that don’t have a genre tag, I wanted to use a tag I use called “language” and sort into that folder instead. But I have some songs that have a genre tag and also a language tag, and those songs should only go into the genre folder; the language folder should be ignored.
Turns out QL can do this just fine, by expanding the
block in the expression above to
Basically, the pipe after the second
<genre>/ introduces what should be
done if the first condition isn’t met (i.e. no genre tag), but here instead
of putting straightforward text or another label we then introduce a second
<language|<language/>>, which puts in a language tag
folder, if the song has a tag “language”.
The full expression now looks like this:
/mnt/musik/<genre|<genre>/|<language|<language>/>><artist|<artist>|Unknown>/<album|<album>/><tracknumber|<tracknumber> - ><title>