New features
-
Convert Plugin: The
--forceand--keep-newCLI flags are now also available as config options viaforceandkeep_new. -
import command: The
--nomove/-MCLI flag can now be used to override themove: yesconfig option during import. -
Lyrics Plugin: Write synced (LRC) lyrics to the
SYLT(synchronized lyrics) ID3 frame and plain text toUSLTfor ID3-tagged files, instead of storing raw LRC timestamps inUSLT. Players that only supportUSLTcontinue to see readable plain lyrics. π (#6541) -
ListenBrainz Plugin: Add support for importing ListenBrainz listening history from an export file. Use the
-f/--export-fileflag to specify the path to the ListenBrainz export file. -
MusicBrainz Plugin: Introduce aliases_as_credits to make aliases-as-artist-credit optional.
-
Bad Files Plugin: Added settings for auto error and warning actions.
-
Tidal Plugin: New flexible attributes are now populated during imports, including
tidal_track_id,tidal_album_id,tidal_artist_id,tidal_track_popularity,tidal_album_popularity, andtidal_updated. Added a newbeet tidalsynccommand to refresh popularity data for imported items by default, or albums with--album, with--forceto re-fetch and--writeto update file tags.Migration: Existing Tidal imports can copy the previously stored IDs into the new flexible attributes with modify command: run
beet modify data_source:tidal tidal_album_id='$mb_albumid' -afor albums andbeet modify data_source:tidal tidal_track_id='$mb_trackid'for items.
Bug fixes
- Convert Plugin: Tidy the
--playlisthelp text so it no longer has awkward indentation in CLI output. - Duplicates Plugin: Fix plugin output: information about duplicate items was not displayed by default. --count option was ignored π (#6476)
- FetchArt Plugin: Catch
OSErrorin_set_artso that permission errors (e.g. a file locked by another process) are logged as warnings instead of crashing beets. π (#6193) - Fish Plugin: Fix error on plugin initialization.
- import command: Fix duplicate album merge during import when running in threaded mode. The merge action no longer creates a duplicate folder or reports
could not get filesizeerrors. π (#6601) - Lyrics Plugin: Add rate limiting and exponential backoff to HTTP requests to prevent
429 Too Many Requestserrors from lyrics sources during bulk imports. π (#6728) - Lyrics Plugin: Improve Musica.com lyric scraping so fetched lyrics no longer omit the opening verse or include non-lyric page content.
- MBSync Plugin / BPSync Plugin: Do not clear items metadata when
import.from_scratchis enabled. π (#6613) - modify command: Fix
beet modify -asplitting multi-value field strings (likeartists,genres) into individual characters when modifying albums. Album field types now fall back to the corresponding item field type definitions. π (#5690) - move command: move command no longer crashes when an item referenced in the database has been deleted from disk. Missing items are now skipped with a warning and the command continues. π (#6720)
- MPDStats Plugin: Fix crashes and invalid configuration when passing
--host,--port, or--passwordon the command line. π (#5404) - MusicBrainz Collection Plugin: Handle MusicBrainz
401 Unauthorizederrors duringmbupdatewithout crashing, and log a clearer message that points users tomusicbrainz.userandmusicbrainz.passconfiguration. π (#6651) - MusicBrainz Plugin: Fix
KeyError: 'aliases'crash when looking up releases with more than 500 tracks. - MusicBrainz Pseudo-Release Plugin: Fix crashes when applying a pseudo-release. One in
PseudoAlbumInfo.raw_dataand asqlite3.ProgrammingError. - Replace Plugin: Fix
TypeErrorwhen invoking the Replace Plugin command. π (#6260) - Spotify Plugin: Improved Spotify API parsing to handle missing label data π (#6679)
- Spotify Plugin: Use single instead of double quotes in spotify queries.
- Tidal Plugin: add Tidal Plugin dependency extra to make sure
requests-oauthlibis installed. π (#6633) - Tidal Plugin: Fix auth URL not printed in environments without a configured browser π (#6710)
AttrDict.__getattribute__now unmasksAttributeErrorraised inside acached_propertybody. Previously such errors were swallowed by the__getattr__fallback, producing a misleading message about the property name itself. The wrappedRuntimeErrorkeeps the original traceback so it still points at the real failing line. π (#6558)ReadErrorandWriteErrornow include the file path and the underlying reason in their message instead of a<super: ...>object representation. π (#6560)- Fix a CLI help formatting regression that moved command descriptions to separate lines; descriptions are inline again, with regression test coverage.
- Path format queries now correctly match multi-value fields such as
genreswhen using exact string matches likegenres:=Classicalorgenres:=~Classical. π (#6598)
For plugin developers
- Introduced
beets.importer.DuplicateActionto simplify handling of duplicates. - Plugin authors can import all autotagger helpers directly from
beets.autotag, including match classes, distance helpers, andassign_items, without relying on lower-level autotag modules.
Other changes
- Lyrics Plugin: Fold rate limiting and 429 retry from the lyrics-specific
LyricsSessioninto the sharedbeetsplug._utils.requests.TimeoutAndRetrySessionso all plugins benefit. The standaloneLyricsSessionclass has been removed. - Spotify Plugin:
spotifysyncnow batches its SQLite commit for a sync run, follows the standard beets write-before-store pattern, and logs audio-features API unavailability only once per run. - Titlecase Plugin: Correct the path format example and document the
%titlecase{text}template function. π (#6697) - Log message prefix formatting (
musicbrainz: msg) moved from a filter toLegacyFormatter, making future customization easier.