beets 1.3.11
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 thefreedesktop
, which only worked with the Dolphin file manager.) replaygain
: There is a new backend that uses the bs1770gain 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 optionui
. (Also, thecolor
config option has been moved from top-level to underui
. 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 newalbumtotal
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
andlist_format_item
configuration keys now affect (almost) every place where objects are printed and logged. (Previously, they only controlled thelist
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
andlist_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. #1000smartplaylist
: 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. Thesplupdate
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 #1240web
: 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. #1261info
: 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 #1324ftintitle
: 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 #1211mpdstats
: Avoid double-counting some play events. #773 #1212- Fix a crash when the importer deals with Unicode metadata in
--pretend
mode. #1214 smartplaylist
: Fixalbum_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. #1241keyfinder
: Parse the underlying tool's output more robustly. #1248embedart
: We now show a comprehensible error message whenbeet 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
andsmartplaylist
: 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. #1241scrub
: Log an error instead of stopping when thebeet scrub
command cannot write a file. Also, avoid problems on Windows with Unicode filenames. #1297discogs
: Handle and log more kinds of communication errors. #1299 #1305lastgenre
: Bugs in thepylast
library can no longer crash beets.convert
: You can now configure the temporary directory for conversions. Thanks to @autochthe. #1382 #1383rewrite
: Fix a regression that prevented the plugin's rewriting from applying to album-level fields like$albumartist
. #1393play
: The plugin now sorts items according to the configuration in album mode.fetchart
: The name for extracted art files is taken from theart_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 aCommonOptionsParser
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.