In this release, we refactored the logging system to be more flexible and more useful. There are more granular levels of verbosity, the output from plugins should be more consistent, and several kinds of logging bugs should be impossible in the future.
There are also two new plugins: one for filtering the files you import and an evolved plugin for using album art as directory thumbnails in file managers. There's a new source for album art, and the importer now records the source of match data. This is a particularly huge release---there's lots more below.
There's one big change with this release: **Python 2.6 is no longer supported**. You'll need Python 2.7. Please trust us when we say this let us remove a surprising number of ugly hacks throughout the code.
Major new features and bigger changes:
- There are now **multiple levels of output verbosity**. On the command line, you can make beets somewhat verbose with `-v` or very verbose with `-vv`. For the importer especially, this makes the first verbose mode much more manageable, while still preserving an option for overwhelmingly verbose debug output. 1244
- A new `filefilter` plugin lets you write regular expressions to automatically **avoid importing** certain files. Thanks to mried. 1186
- A new `thumbnails` plugin generates cover-art **thumbnails for album folders** for Freedesktop.org-compliant file managers. (This replaces the `freedesktop`, which only worked with the Dolphin file manager.)
- `replaygain`: There is a new backend that uses the [bs1770gain](http://bs1770gain.sourceforge.net) analysis tool. Thanks to jmwatte. #1343
- A new `filesize` field on items indicates the number of bytes in the file. 1291
- A new `searchlimit` configuration option allows you to specify how many search results you wish to see when looking up releases at MusicBrainz during import. 1245
- The importer now records the data source for a match in a new flexible attribute `data_source` on items and albums. 1311
- The colors used in the terminal interface are now configurable via the new config option `colors`, nested under the option `ui`. (Also, the `color` config option has been moved from top-level to under `ui`. Beets will respect the old color setting, but will warn the user with a deprecation message.) 1238
- `fetchart`: There's a new Wikipedia image source that uses DBpedia to find albums. Thanks to Tom Jaspers. 1194
- In the `config` command, the output is now redacted by default. Sensitive information like passwords and API keys is not included. The new `--clear` option disables redaction. 1376
You should probably also know about these core changes to the way beets works:
- As mentioned above, Python 2.6 is no longer supported.
- The `tracktotal` attribute is now a _track-level field_ instead of an album-level one. This field stores the total number of tracks on the album, or if the per_disc_numbering config option is set, the total number of tracks on a particular medium (i.e., disc). The field was causing problems with that per_disc_numbering mode: different discs on the same album needed different track totals. The field can now work correctly in either mode.
- To replace `tracktotal` as an album-level field, there is a new `albumtotal` computed attribute that provides the total number of tracks on the album. (The per_disc_numbering option has no influence on this field.)
- The `list_format_album` and `list_format_item` configuration keys now affect (almost) every place where objects are printed and logged. (Previously, they only controlled the `list` command and a few other scattered pieces.) 1269
- Relatedly, the `beet` program now accept top-level options `--format-item` and `--format-album` before any subcommand to control how items and albums are displayed. 1271
- `list_format_album` and `list_format_album` have respectively been renamed format_album and format_item. The old names still work but each triggers a warning message. 1271
- Path queries are automatically triggered only if the
path targeted by the query exists. Previously, just having a slash somewhere
in the query was enough, so beet ls AC/DC` wouldn't work to refer to the artist.
There are also lots of medium-sized features in this update:
- `duplicates`: The command has a new `--strict` option that will only report duplicates if all attributes are explicitly set. 1000
- `smartplaylist`: Playlist updating should now be faster: the plugin detects, for each playlist, whether it needs to be regenerated, instead of obliviously regenerating all of them. The `splupdate` command can now also take additional parameters that indicate the names of the playlists to regenerate.
- `play`: The command shows the output of the underlying player command and lets you interact with it. 1321
- The summary shown to compare duplicate albums during import now displays the old and new filesizes. 1291
- `lastgenre`: Add _comedy_, _humor_, and _stand-up_ as well as a longer list of classical music genre tags to the built-in whitelist and canonicalization tree. 1206 1239 1240
- `web`: Add support for _cross-origin resource sharing_ for more flexible in-browser clients. Thanks to Andre Miller. 1236 1237
- plugins/mbsync: A new `-f/--format` option controls the output format when listing unrecognized items. The output is also now more helpful by default. 1246
- `fetchart`: A new option, `-n`, extracts the cover art of all matched albums into their respective directories. Another new flag, `-a`, associates the extracted files with the albums in the database. 1261
- `info`: A new option, `-i`, can display only a specified subset of properties. 1287
- The number of missing/unmatched tracks is shown during import. 1088
- `permissions`: The plugin now also adjusts the permissions of the directories. (Previously, it only affected files.) 1308 1324
- `ftintitle`: You can now configure the format that the plugin uses to add the artist to the title. Thanks to amishb. 1377
And many little fixes and improvements:
- `replaygain`: Stop applying replaygain directly to source files when using the mp3gain backend. 1316
- Path queries are case-sensitive on non-Windows OSes. 1165
- `lyrics`: Silence a warning about insecure requests in the new MusixMatch backend. 1204
- Fix a crash when `beet` is invoked without arguments. 1205 1207
- `fetchart`: Do not attempt to import directories as album art. 1177 1211
- `mpdstats`: Avoid double-counting some play events. 773 1212
- Fix a crash when the importer deals with Unicode metadata in `--pretend` mode. 1214
- `smartplaylist`: Fix `album_query` so that individual files are added to the playlist instead of directories. 1225
- Remove the `beatport` plugin. Beatport_ has shut off public access to their API and denied our request for an account. We have not heard from the company since 2013, so we are assuming access will not be restored.
- Incremental imports now (once again) show a "skipped N directories" message.
- `embedart`: Handle errors in ImageMagick's output. 1241
- `keyfinder`: Parse the underlying tool's output more robustly. 1248
- `embedart`: We now show a comprehensible error message when `beet embedart -f FILE` is given a non-existent path. 1252
- Fix a crash when a file has an unrecognized image type tag. Thanks to Matthias Kiefer. 1260
- `importfeeds` and `smartplaylist`: Automatically create parent directories for playlist files (instead of crashing when the parent directory does not exist). 1266
- The write-cmd` command no longer tries to "write" non-writable fields, such as the bitrate. 1268
- The error message when MusicBrainz is not reachable on the network is now much clearer. Thanks to Tom Jaspers. 1190 1272
- Improve error messages when parsing query strings with shlex. 1290
- `embedart`: Fix a crash that occured when used together with the _check_ plugin. 1241
- `scrub`: Log an error instead of stopping when the `beet scrub` command cannot write a file. Also, avoid problems on Windows with Unicode filenames. 1297
- `discogs`: Handle and log more kinds of communication errors. 1299 1305
- `lastgenre`: Bugs in the `pylast` library can no longer crash beets.
- `convert`: You can now configure the temporary directory for conversions. Thanks to autochthe. 1382 1383
- `rewrite`: Fix a regression that prevented the plugin's rewriting from applying to album-level fields like `$albumartist`. 1393
- `play`: The plugin now sorts items according to the configuration in album mode.
- `fetchart`: The name for extracted art files is taken from the `art_filename` configuration option. 1258
- When there's a parse error in a query (for example, when you type a malformed date in a date query), beets now stops with an error instead of silently ignoring the query component.
For developers:
- The `database_change` event now sends the item or album that is subject to a change.
- The `OptionParser` is now a `CommonOptionsParser` that offers facilities for adding usual options (`--album`, `--path` and `--format`). See add_subcommands. 1271
- The logging system in beets has been overhauled. Plugins now each have their own logger, which helps by automatically adjusting the verbosity level in import mode and by prefixing the plugin's name. Logging levels are dynamically set when a plugin is called, depending on how it is called (import stage, event or direct command). Finally, logging calls can (and should!) use modern `{}`-style string formatting lazily. See plugin-logging in the plugin API docs.
- A new `import_task_created` event lets you manipulate import tasks immediately after they are initialized. It's also possible to replace the originally created tasks by returning new ones using this event.