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. Theforce
option now behaves in a more conventional manner. π (#4982) - Lyrics Plugin: Add new configuration option
dist_thresh
to 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.OperationalError
that 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
UnboundLocalError
in 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_sort
value if it is empty. π (#2635) - Lyrics Plugin: Fix fetching lyrics from
lrclib
source. 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 defaultsources
configuration to prioritizelrclib
over other sources since it returns reliable results quicker than others. π (#5102) - Lyrics Plugin: Fix plugin crash when
genius
backend returns empty lyrics. π (#5583) - Lyrics Plugin: Fix the issue with
genius
backend 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
synced
flag 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
MemoryError
and improve performance tagging large albums by replacingmunkres
library withlap.lapjv
. π (#5207) - write: Fix the issue where for certain files differences in
mb_artistid
,mb_albumartistid
andalbumtype
fields are shown on every attempt to write tags. Note: your music needs to be reimported withbeet import -LI
or synchronised withbeet mbsync
in order to fix this! π (#5265) π (#5371) π (#4715)
For packagers
- External plugin developers:
beetsplug/__init__.py
file 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
fields
within generated EXTM3U playlists instead of JSON-encoding them. - typehints:
./beets/importer.py
file now has improved typehints. - typehints:
./beets/plugins.py
file now includes typehints.