----------------------
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. :bug:`1244`
* A new :doc:`/plugins/filefilter` lets you write regular expressions to
automatically **avoid importing** certain files. Thanks to :user:`mried`.
:bug:`1186`
* A new :doc:`/plugins/thumbnails` generates cover-art **thumbnails for
album folders** for Freedesktop.org-compliant file managers. (This replaces
the :doc:`/plugins/freedesktop`, which only worked with the Dolphin file
manager.)
* :doc:`/plugins/replaygain`: There is a new backend that uses the
`bs1770gain`_ analysis tool. Thanks to :user:`jmwatte`. :bug:`1343`
* A new ``filesize`` field on items indicates the number of bytes in the file.
:bug:`1291`
* A new :ref:`searchlimit` configuration option allows you to specify how many
search results you wish to see when looking up releases at MusicBrainz
during import. :bug:`1245`
* The importer now records the data source for a match in a new
flexible attribute ``data_source`` on items and albums. :bug:`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.) :bug:`1238`
* :doc:`/plugins/fetchart`: There's a new Wikipedia image source that uses
DBpedia to find albums. Thanks to Tom Jaspers. :bug:`1194`
* In the :ref:`config-cmd` command, the output is now redacted by default.
Sensitive information like passwords and API keys is not included. The new
``--clear`` option disables redaction. :bug:`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 :ref:`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 :ref:`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 :ref:`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 :ref:`list-cmd` command and a few
other scattered pieces.) :bug:`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. :bug:`1271`
* `list_format_album` and `list_format_album` have respectively been
renamed :ref:`format_album` and :ref:`format_item`. The old names still work
but each triggers a warning message. :bug:`1271`
* :ref:`Path queries <pathquery>` 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:
* :doc:`/plugins/duplicates`: The command has a new ``--strict`` option
that will only report duplicates if all attributes are explicitly set.
:bug:`1000`
* :doc:`/plugins/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.
* :doc:`/plugins/play`: The command shows the output of the underlying player
command and lets you interact with it. :bug:`1321`
* The summary shown to compare duplicate albums during import now displays
the old and new filesizes. :bug:`1291`
* :doc:`/plugins/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. :bug:`1206` :bug:`1239` :bug:`1240`
* :doc:`/plugins/web`: Add support for *cross-origin resource sharing* for
more flexible in-browser clients. Thanks to Andre Miller. :bug:`1236`
:bug:`1237`
* :doc:`plugins/mbsync`: A new ``-f/--format`` option controls the output
format when listing unrecognized items. The output is also now more helpful
by default. :bug:`1246`
* :doc:`/plugins/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.
:bug:`1261`
* :doc:`/plugins/info`: A new option, ``-i``, can display only a specified
subset of properties. :bug:`1287`
* The number of missing/unmatched tracks is shown during import. :bug:`1088`
* :doc:`/plugins/permissions`: The plugin now also adjusts the permissions of
the directories. (Previously, it only affected files.) :bug:`1308` :bug:`1324`
* :doc:`/plugins/ftintitle`: You can now configure the format that the plugin
uses to add the artist to the title. Thanks to :user:`amishb`. :bug:`1377`
And many little fixes and improvements:
* :doc:`/plugins/replaygain`: Stop applying replaygain directly to source files
when using the mp3gain backend. :bug:`1316`
* Path queries are case-sensitive on non-Windows OSes. :bug:`1165`
* :doc:`/plugins/lyrics`: Silence a warning about insecure requests in the new
MusixMatch backend. :bug:`1204`
* Fix a crash when ``beet`` is invoked without arguments. :bug:`1205`
:bug:`1207`
* :doc:`/plugins/fetchart`: Do not attempt to import directories as album art.
:bug:`1177` :bug:`1211`
* :doc:`/plugins/mpdstats`: Avoid double-counting some play events. :bug:`773`
:bug:`1212`
* Fix a crash when the importer deals with Unicode metadata in ``--pretend``
mode. :bug:`1214`
* :doc:`/plugins/smartplaylist`: Fix ``album_query`` so that individual files
are added to the playlist instead of directories. :bug:`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.
* :doc:`/plugins/embedart`: Handle errors in ImageMagick's output. :bug:`1241`
* :doc:`/plugins/keyfinder`: Parse the underlying tool's output more robustly.
:bug:`1248`
* :doc:`/plugins/embedart`: We now show a comprehensible error message when
``beet embedart -f FILE`` is given a non-existent path. :bug:`1252`
* Fix a crash when a file has an unrecognized image type tag. Thanks to
Matthias Kiefer. :bug:`1260`
* :doc:`/plugins/importfeeds` and :doc:`/plugins/smartplaylist`: Automatically
create parent directories for playlist files (instead of crashing when the
parent directory does not exist). :bug:`1266`
* The :ref:`write-cmd` command no longer tries to "write" non-writable fields,
such as the bitrate. :bug:`1268`
* The error message when MusicBrainz is not reachable on the network is now
much clearer. Thanks to Tom Jaspers. :bug:`1190` :bug:`1272`
* Improve error messages when parsing query strings with shlex. :bug:`1290`
* :doc:`/plugins/embedart`: Fix a crash that occurred when used together
with the *check* plugin. :bug:`1241`
* :doc:`/plugins/scrub`: Log an error instead of stopping when the ``beet
scrub`` command cannot write a file. Also, avoid problems on Windows with
Unicode filenames. :bug:`1297`
* :doc:`/plugins/discogs`: Handle and log more kinds of communication
errors. :bug:`1299` :bug:`1305`
* :doc:`/plugins/lastgenre`: Bugs in the `pylast` library can no longer crash
beets.
* :doc:`/plugins/convert`: You can now configure the temporary directory for
conversions. Thanks to :user:`autochthe`. :bug:`1382` :bug:`1383`
* :doc:`/plugins/rewrite`: Fix a regression that prevented the plugin's
rewriting from applying to album-level fields like ``$albumartist``.
:bug:`1393`
* :doc:`/plugins/play`: The plugin now sorts items according to the
configuration in album mode.
* :doc:`/plugins/fetchart`: The name for extracted art files is taken from the
``art_filename`` configuration option. :bug:`1258`
* When there's a parse error in a query (for example, when you type a
malformed date in a :ref:`date query <datequery>`), beets now stops with an
error instead of silently ignoring the query component.
* :doc:`/plugins/smartplaylist`: Stream-friendly smart playlists.
The ``splupdate`` command can now also add a URL-encodable prefix to every
path in the playlist file.
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
:ref:`add_subcommands`. :bug:`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
:ref:`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.
.. _bs1770gain: http://bs1770gain.sourceforge.net