Release v2.3.0
Beets now requires Python 3.9 or later since support for EOL Python 3.8 has been dropped.
New features
- LastGenre Plugin: The new configuration option,
keep_existing, provides more fine-grained control over how pre-populated genre tags are handled. Theforceoption now behaves in a more conventional manner. π (#4982) - Lyrics Plugin: Add new configuration option
dist_threshto control the maximum allowed distance between the lyrics search result and the tagged item's artist and title. This is useful for preventing false positives when fetching lyrics. - Lyrics Plugin: Rewrite lyrics translation functionality to use Azure AI Translator API and add relevant instructions to the documentation.
- MBSync Plugin: Add support for all metadata sorces.
- Missing Plugin: Add support for all metadata sources.
Bug fixes
- Fix ambiguous column name
sqlite3.OperationalErrorthat occured in album queries that filtered album track titles, for examplebeet list -a keyword title:foo. - ImageMagick 7.1.1-44 is now supported.
- Synchronise files included in the source distribution with what we used to have before the introduction of Poetry. π (#5531) π (#5526)
- FetchArt Plugin: Fix fetchart bug where a tempfile could not be deleted due to never being properly closed. π (#5521)
- LastGenre Plugin: Fix track-level genre handling. Now when an album-level genre is set already, single tracks don't fall back to the album's genre and request their own last.fm genre. Also log messages regarding what's been tagged are now more polished. π (#5582)
- ListenBrainz Plugin: Fix
UnboundLocalErrorin cases where 'mbid' is not defined. - ListenBrainz Plugin: Fix rST formatting for URLs of Listenbrainz API Key documentation and config.yaml.
- Lyrics Plugin: Do not attempt to search for lyrics if either the artist or title is missing and ignore
artist_sortvalue if it is empty. π (#2635) - Lyrics Plugin: Fix fetching lyrics from
lrclibsource. If we cannot find lyrics for a specific album, artist, title combination, the plugin now tries to search for the artist and title and picks the most relevant result. Update the defaultsourcesconfiguration to prioritizelrclibover other sources since it returns reliable results quicker than others. π (#5102) - Lyrics Plugin: Fix plugin crash when
geniusbackend returns empty lyrics. π (#5583) - Lyrics Plugin: Fix the issue with
geniusbackend not being able to match lyrics when there is a slight variation in the artist name. π (#4791) - Lyrics Plugin: LRCLib will fallback to plain lyrics if synced lyrics are not found and
syncedflag is set toyes. - Lyrics Plugin: Rewrite lyrics tests using pytest to provide isolated configuration for each test case. This fixes the issue where some tests failed because they read developers' local lyrics configuration. π (#5133)
- ParentWork Plugin: Only output parentwork changes when running in verbose mode.
- Sort Order: Fix a bug that would raise an exception when sorting on a non-string field that is not populated in all items. π (#5512)
- Thumbnails Plugin: Fix API call to GIO on big endian architectures (like s390x) in thumbnails plugin. π (#5708)
- import: Fix
MemoryErrorand improve performance tagging large albums by replacingmunkreslibrary withlap.lapjv. π (#5207) - write: Fix the issue where for certain files differences in
mb_artistid,mb_albumartistidandalbumtypefields are shown on every attempt to write tags. Note: your music needs to be reimported withbeet import -LIor synchronised withbeet mbsyncin order to fix this! π (#5265) π (#5371) π (#4715)
For packagers
- External plugin developers:
beetsplug/__init__.pyfile can be removed from your plugin as beets now uses native/implicit namespace package setup. - The minimum supported Python version is now 3.9.
Other changes
- Database models are now serializable with pickle.
- Release workflow: fix the issue where the new release tag is created for the wrong (outdated) commit. Now the tag is created in the same workflow step right after committing the version update. π (#5539)
- FtInTitle Plugin: Optimize the plugin by avoiding unnecessary writes to the database.
- Smart Playlist Plugin: URL-encode additional item
fieldswithin generated EXTM3U playlists instead of JSON-encoding them. - typehints:
./beets/importer.pyfile now has improved typehints. - typehints:
./beets/plugins.pyfile now includes typehints.