π This small update is part of our attempt to release new versions more often! There are a few important fixes, and we're clearing the deck for a change to beets' dependencies in the next version.
The new feature is:
π There are some fixes in this release:
gmusic: The oauth_file config option now supports more flexible path values, including ~ for the home directory. #3270 gmusic: Fix a crash when using version 12.0.0 or later of the gmusicapi module. #3270 π¦ Here's a note for packagers:
pathlib is now an optional test dependency on Python 3.4+, removing the need for a Debian patch. #3275 π This release is far too long in coming, but it's a good one. There is the usual torrent of new features and a ridiculously long line of fixes, but there are also some crucial maintenance changes. We officially support Python 3.7 and 3.8, and some performance optimizations can (anecdotally) make listing your library more than three times faster than in the previous version.
The new core features are:
config-aunique configuration option allows setting default options for the aunique template function.albumdisambig field no longer includes the MusicBrainz release group disambiguation comment. A new releasegroupdisambig field has been added. #3024 modify command now allows resetting fixed attributes. For example, beet modify -a artist:beatles artpath! resets artpath attribute from matching albums back to the default value. #2497 ignore_data_tracks, lets you skip audio tracks contained in data files. #3021 π There are some new plugins:
playlist can query the beets library using M3U playlists. Thanks to @Holzhaus and @Xenopathic. #123 #3145 loadext allows loading of SQLite extensions, primarily for use with the ICU SQLite extension for internationalization. #3160 #3226 subsonicupdate can automatically update your Subsonic library. Thanks to @maffo999. #3001 π And many improvements to existing plugins:
lastgenre: Added option -A to match individual tracks and singletons. #3220 #3219 play: The plugin can now emit a UTF-8 BOM, fixing some issues with foobar2000 and Winamp. Thanks to @mz2212. #2944 gmusic:
replaygain: albumpeak on large collections is calculated as the average, not the maximum. #3008 #3009 chroma:
preferred configuration options. Thanks to @Archer4499. #3017 beet write. Thanks to @Holzhaus. #3097 #2942 convert: The plugin now has an id3v23 option that allows you to override the global id3v23 option. Thanks to @Holzhaus. #3104 spotify:
ipfs: The plugin now supports a nocopy option which passes that flag to ipfs. Thanks to @wildthyme.discogs: The plugin now has rate limiting for the Discogs API. #3081 mpdstats, mpdupdate: These plugins now use the MPD_PORT environment variable if no port is specified in the configuration file. #3223 bpd:
consume and single are now supported along with updated semantics for repeat and previous and new fields for status. The bpd server now understands and ignores some additional commands. #3200 #800 idle is now supported, allowing the MPD version to be bumped to 0.14. #3205 #800 decoders is now supported. #3222 --debug flag has been removed. Thanks to @arcresu. #3196 mbsync: The plugin no longer queries MusicBrainz when either the mb_albumid or mb_trackid field is invalid. See also the discussion on Google Groups Thanks to @arogl.export: The plugin now also exports path field if the user explicitly specifies it with -i parameter. This only works when exporting library fields. #3084 acousticbrainz: The plugin now declares types for all its fields, which enables easier querying and avoids a problem where very small numbers would be stored as strings. Thanks to @rain0r. #2790 #3238 π Some improvements have been focused on improving beets' performance:
absubmit, badfiles: Analysis now works in parallel (on Python 3 only). Thanks to @bemeurer. #2442 #3003 mpdstats: Use the currentsong MPD command instead of playlist to get the current song, improving performance when the playlist is long. Thanks to @ray66. #3207 #2752 Several improvements are related to usability:
move command now lists the number of items already in-place. Thanks to @RollingStar. #3117 convert plugin copies the art covers. #3063 π Many fixes have been focused on issues where beets would previously crash:
fetchart: Added network connection error handling to backends so that beets won't crash if a request fails. Thanks to @Holzhaus. #1579 badfiles: Avoid a crash when the underlying tool emits undecodable output. #3165 beatport: Avoid a crash when the server produces an error. #3184 bpd: Fix crashes in the bpd server during exception handling. #3200 bpd: Fix a crash triggered when certain clients tried to list the albums belonging to a particular artist. #3007 #3215 replaygain: Avoid a crash when the bs1770gain tool emits malformed XML. #2983 #3247 π There are many fixes related to compatibility with our dependencies including addressing changes interfaces:
jellyfish requirement to version 0.6.0 for compatibility.re module. #2978 web: Fix an error when using more recent versions of Flask with CORS enabled. Thanks to @rveachkc. #2979: #2980 python-itunes, which had gone unmaintained and was not Python-3-compatible. Thanks to @ocelma for creating python-itunes in the first place. Thanks to @nathdwek. #2371 #2551 #2718 lastgenre, edit: Avoid a deprecation warnings from the PyYAML library by switching to the safe loader. Thanks to @translit and @sbraz. #3192 #3225 PIL/pillow on Python 3. Thanks to @architek. #2504 #3029 π And there are many other fixes:
artist_credit configuration option is set. #2953 from_scratch configuration option set, only writable fields are cleared. Beets now no longer ignores the format your music is saved in. #2972 %aunique template function now works correctly with the -f/--format option. #3043 %title template function now works correctly with apostrophes. Thanks to @GuilhermeHideki. #3033 lastgenre: It's now possible to set the prefer_specific option without also setting canonical. #2973 fetchart: The plugin now respects the ignore and ignore_hidden settings. #1632 hook: Fix byte string interpolation in hook commands. #2967 #3167 the: Log a message when something has changed, not when it hasn't. Thanks to @arcresu. #3195 lastgenre: The force config option now actually works. #2704 #3054 convert command that is not ImageMagick's by using the magick executable when it is available. Thanks to @ababyduck. #2093 #3236 π There is one new thing for plugin developers to know about:
playlist supports queries like playlist:name although there is no field named playlist. See extend-query for details.π¦ And some messages for packagers:
jellyfish and munkres.python-itunes dependency has been removed.