* "Various artists" releases are handled much more gracefully. The
autotagger now sets the "comp" flag on albums whenever the album is
identified as a "various artists" release by MusicBrainz. Also,
there is now a distinction between the "album artist" and the "track
artist", the latter of which is never "Various Artists" or other such
bogus stand-in. (Thanks to Jonathan Buchanan for the bulk of the
* The directory hierarchy can now be customized based on release type.
In particular, the "path_format" setting in .beetsconfig has been
replaced with a new [paths] section, which allows you to specify
different path formats for normal releases, "compilation" releases,
and every release type (see below). The default path formats have
been changed to use $albumartist instead of $artist. More information
about this change is available on the wiki.
* A new "albumtype" field reflects the release type as specified by
* When deleting files, beets now appropriately "prunes" the directory
tree -- empty directories are automatically cleaned up. (Thanks to
wlof on GitHub for this!)
* When importing with the "delete" option and importing files that are
already at their destination, files could be deleted (leaving zero
copies afterward). This is fixed.
* Always show album directory in tagger output.
* "import -l" now logs duplicate albums.
* A new "import_resume" option can be used to disable the importer's
resuming feature or force it to resume without asking. This option
may be either "yes", "no", or "ask", with the obvious meanings. The
-p and -P command-line flags override this setting and correspond to
the "yes" and "no" settings.
* Resuming is automatically disabled when the importer is in quiet (-q)
mode. Progress is still saved, however, and the -p flag (above) can
be used to force resuming.
* The BEETSCONFIG environment variable can now be used to specify the
location of the config file that is at ~/.beetsconfig by default.
* A new "import_quiet_fallback" option specifies what should happen in
quiet mode when there is no strong recommendation. The options are
"skip" (the default) and "asis".
* The "version" command now lists all the loaded plugins.
* A new plugin, called "info", just prints out audio file metadata.
* Fix a bug where some files would be erroneously interpreted as MP4.
* Fix permission bits applied to album art files.
* Fix malformed MusicBrainz queries caused by null characters.
* Fix a bug with old versions of the Monkey's Audio format.
* Fix a crash on broken symbolic links.
* Retry in more cases when MusicBrainz servers are slow/overloaded.
* The old "albumify" plugin for upgrading databases was removed.
* A new "-q" command line switch for the import command suppresses all
prompts for input; it pessimistically skips all albums that the
importer is not completely confident about.
* Added support for the WavPack and Musepack formats. Unfortunately,
due to a limitation in the Mutagen library (used by beets for
metadata manipulation), Musepack SV8 is not yet supported. Here's
the upstream bug in question:
* BPD now uses a pure-Python socket library and no longer requires
eventlet/greenlet (the latter of which is a C extension). For the
curious, the socket library in question is called Bluelet:
* Non-autotagged imports are now resumable (just like autotagged
* Fix a terrible and long-standing bug where track orderings were never
applied. This manifested when the tagger appeared to be applying a
reasonable ordering to the tracks but, later, the database reflects a
completely wrong association of track names to files. The order
applied was always just alphabetical by filename, which is frequently
but not always what you want.
* We now use Windows' "long filename" support. Filenames on Windows now
also never end in spaces.
* Fix crash in lastid when the artist name is not available.
* Fixed a spurious crash when LANG or a related environment variable is
set to an invalid value (such as 'UTF-8' on some installations of Mac
* Fixed an error when trying to copy a file that is already at its
* When copying read-only files, the importer now tries to make the copy
writable. (Previously, this would just crash the import.)
* Fixed an UnboundLocalError when no matches are found during autotag.
* Fixed a Unicode encoding error when entering special characters into
the "manual search" prompt.
* New command "beet version" just shows the current version.
* A new plugin, "lastid", adds Last.fm acoustic fingerprinting support
to the autotagger. Similar to the PUIDs used by MusicBrainz Picard,
this system allows beets to recognize files that don't have any
metadata at all. You'll need to install some dependencies for this
plugin to work; a guide is available on the project wiki here:
* To support the above, there's also a new system for extending the
autotagger via plugins. Plugins can currently add components to the
track and album distance functions as well as augment the MusicBrainz
* String comparisons in the autotagger have been augmented to act more
intuitively. Previously, if your album had the title "Something (EP)"
and it was officially called "Something", then beets would think this
was a fairly significant change. It now checks for and appropriately
reweights certain parts of each string. As another example, the title
"The Great Album" is considered equal to "Great Album, The".
* New event system for plugins (thanks, Jeff!). Plugins can now get
callbacks from beets when certain events occur in the core.
* The BPD plugin is now disabled by default. This greatly simplifies
installation of the beets core, which is now 100% pure Python. To use
BPD, though, you'll need to set "plugins: bpd" in your .beetsconfig.
* The "import" command can now remove original files when it copies
items into your library. (This might be useful if you're low on disk
space.) Set the "import_delete" option in your .beetsconfig to "yes".
* Importing without autotagging ("beet import -A") now prints out album
names as it imports them to indicate progress.
* There's a new "mpdupdate" plugin that will automatically update your
MPD index whenever your beets library changes. Read the plugin's
documentation on the wiki:
* Efficiency tweak should reduce the number of MusicBrainz queries per
* A new "-v" command line switch enables debugging output.
* Fixed bug that completely broke non-autotagged imports ("import -A").
* Fixed bug that logged the wrong paths when using "import -l".
* Fixed autotagging for the creatively-named band !!!.
* Fixed normalization of relative paths.
* Fixed escaping of / characters in paths on Windows.
* Parallel tagger. The autotagger has been reimplemented to use
multiple threads. This means that it can concurrently read files
from disk, talk to the user, communicate with MusicBrainz, and
write data back to disk. Not only does this make the tagger much
faster because independent work may be performed in parallel, but it
makes the tagging process much more pleasant for large imports. The
user can let albums queue up in the background while making a
decision rather than waiting for beets between each question it asks.
The parallel tagger is on by default but a sequential (single-
threaded) version is still available by setting the "threaded"
config value to "no" (because the parallel version is still quite
* Colorized tagger output. The autotagger interface now makes it a
little easier to see what's going on at a glance by highlighting
changes with terminal colors. This feature is on by default, but you
can turn it off by setting "color" to "no" in your .beetsconfig (if,
for example, your terminal doesn't understand colors and garbles the
* Pause and resume imports. The "import" command now keeps track of its
progress, so if you're interrupted (beets crashes, you abort the
process, an alien devours your motherboard, etc.), beets will try to
resume from the point where you left off. The next time you run
"import" on the same directory, it will ask if you want to resume. It
accomplishes this by "fast-forwarding" through the albums in the
directory until it encounters the last one it saw. (This means it
might fail if that album can't be found.) Also, you can now abort the
tagging process by entering "B" (for aBort) at any of the prompts.
* Overhauled methods for handling fileystem paths to allow filenames
that have badly encoded special characters. These changes are pretty
fragile, so please report any bugs involving UnicodeErrors or SQLite
ProgrammingErrors with this version.
* The destination paths (the library directory structure) now respect
album-level metadata. This means that if you have an album in which
two tracks have different album-level attributes (like year, for
instance), they will still wind up in the same directory together.
(There's currently not a very smart method for picking the "correct"
album-level metadata, but we'll fix that later.)
* Fixed a bug where the CLI would fail completely if the LANG
environment variable was not set.
* Fixed removal of albums (beet remove -a): previously, the album
record would stay around although the items were deleted.
* The setup script now makes a beet.exe startup stub on Windows;
Windows users can now just type "beet" at the prompt to run beets.
* Fixed an occasional bug where Mutagen would complain that a tag was
* Fixed a bug with reading invalid integers from ID3 tags.
* The tagger should now be a little more reluctant to reorder tracks
that already have indices.
* Album art. The tagger now, by default, downloads album art from
Amazon that is referenced in the MusicBrainz database. It places the
album art alongside the audio files in a file called (for example)
"cover.jpg". The "import_art" config option controls this behavior,
as do the -r and -R options to the import command. You can set the
name (minus extension) of the album art file with the
"art_filename" config option.
* Plugin architecture. Add-on modules can now add new commands to the
beets command-line interface. The "bpd" and "dadd" commands were
removed from the beets core and turned into plugins; BPD is loaded
by default. To load the non-default plugins, use the "plugins" config
value (a space-separated list of plugin names). You can also set the
"pluginpath" config option to a colon-separated list of directories
to search for plugins. Plugins are just Python modules under the
"beetsplug" namespace package containing subclasses of
beets.plugins.BeetsPlugin. See the "beetsplug" directory for examples.
* Support for MusicBrainz ID tags. The autotagger now keeps track of the
MusicBrainz track, album, and artist IDs it matched for each file. It
also looks for album IDs in new files it's importing and uses those to
look up data in MusicBrainz. Furthermore, track IDs are used as a
component of the tagger's distance metric now. Tangentially, change
required the database code to support a lightweight form of migrations
so that new columns could be added to old databases--this is a
delicate feature, so it would be very wise to make a backup of your
database before upgrading to this version.
* As a consequence of adding album art, the database was significantly
refactored to keep track of some information at an album (rather than
item) granularity. Databases created with earlier versions of beets
should work fine, but they won't have any "albums" in them--they'll
just be a bag of items. This means that commands like "beet ls -a"
and "beet rm -a" won't match anything. To "upgrade" your database,
you can use the included "albumify" plugin. Running "beets albumify"
with the plugin activated will group all your items into albums,
making beets behave more or less as it did before.
* Fixed some bugs with encoding paths on Windows. Also, : is now
replaced with - in path names (instead of _) for readability.
* MediaFiles now have a "format" attribute, so you can use $format in
your library path format strings like "$artist - $album ($format)"
to get directories with names like "Paul Simon - Graceland (FLAC)".
* Support for Ogg Vorbis and Monkey's Audio files and their tags.
(This support should be considered preliminary: I haven't tested it
heavily because I don't use either of these formats regularly.)
* An option to the "beet import" command for logging albums that
are untaggable (i.e., are skipped or taken "as-is"). Use
"beet import -l LOGFILE PATHS". The log format is very simple: it's
just a status (either "skip" or "asis") followed by the path to the
album in question. The idea is that you can tag a large collection
and automatically keep track of the albums that weren't found in
MusicBrainz so you can come back and look at them later.
* Fixed UnicodeEncodeError on terminals that don't (or don't claim to)
* Importing without autotagging ("beet import -A") is now faster and
doesn't print out a bunch of whitespace. It also lets you specify
single files on the command line (rather than just directories).
* Fixed importer crash when attempting to read a corrupt file.
* Reorganized code for CLI in preparation for adding pluggable
subcommands. Also removed dependency on the aging "cmdln" module.
First public release.