New features
-
LastGenre Plugin: Added
cleanup_existingconfiguration flag to allow whitelist canonicalization of existing genres. -
Add native support for multiple genres per album/track. The
genresfield now stores genres as a list and is written to files as multiple individual genre tags (e.g., separate GENRE tags for FLAC/MP3). The MusicBrainz Plugin, Beatport Plugin, Discogs Plugin and LastGenre Plugin plugins have been updated to populate thegenresfield as a list.Migration: Existing libraries with comma-separated, semicolon-separated, or slash-separated genre strings (e.g.,
"Rock, Alternative, Indie") are automatically migrated to thegenreslist when you first run beets after upgrading. The migration runs once when the database schema is updated, splitting genre strings and writing the changes to the database. The updatedgenresvalues will be written to media files the next time you run a command that writes tags (such as write command or during import). No manual action or MBSync Plugin is required.The
genrefield is split by the first separator found in the string, in the following order of precedence:- LastGenre Plugin
separatorconfiguration - Semicolon followed by a space
- Comma followed by a space
- Slash wrapped by spaces
- LastGenre Plugin
-
Lyrics Plugin: With
syncedenabled, existing synced lyrics are no longer replaced by newly fetched plain lyrics, even whenforceis enabled. -
Lyrics Plugin: Remove
Source: <lyrics-url>suffix from lyrics. Store the backend name inlyrics_backend, URL inlyrics_url, language inlyrics_languageand translation language (if translations present) inlyrics_translation_languageflexible attributes. Lyrics are automatically migrated on the first beets run. 🐛 (#6370)
Bug fixes
- Convert Plugin: Fix extension substitution inside path of the exported playlist.
- FetchArt Plugin: Prevent deletion of configured fallback cover art
- FtInTitle Plugin: Fix handling of multiple featured artists with ampersand.
- Fuzzy Search Plugin: Force slow query evaluation whenever the fuzzy prefix is used (for example
~fooor%%foo), so fuzzy matching is applied consistently. 🐛 (#5638) - Fuzzy Search Plugin: Improve fuzzy matching when the query is shorter than the field value so substring-style searches produce more useful results. 🐛 (#2043)
- import command Duplicate detection now works for as-is imports (when
autotagis disabled). Previously,duplicate_keysandduplicate_actionconfig options were silently ignored for as-is imports. - import command When autotagging, initialise empty multi-valued fields with
Noneinstead of empty list, which caused beets to overwrite existing metadata with empty list values instead of leaving them unchanged. 🐛 (#6403) - Zero Plugin: When the
omit_single_discoption is set,disctotalis zeroed alongsidedisc.
For plugin developers
- If you maintain a metadata source plugin that populates the
genrefield, please update it to populate a list ofgenresinstead. You will see a deprecation warning for now, but support for populating the singlegenrefield will be removed in version3.0.0.
Other changes
- Edit Plugin: Editing multi-valued fields now behaves more naturally, with list values handled directly to make metadata edits smoother and more predictable.
- LastGenre Plugin: The
separatorconfiguration option is removed. Since genres are now stored as a list in thegenresfield and written to files as individual genre tags, this option has no effect and has been removed. - Lyrics Plugin: To cut down noise from the
lrcliblyrics source, synced lyrics are now checked to ensure the final verse falls within the track's duration. - modify command: Use the following separator to delimit multiple field values:
;. For examplebeet modify albumtypes="album; ep". Previously,\␀was used as a separator. This applies to fields such asartists, AlbumTypes Plugin etc. - Improve highlighting of multi-valued fields changes.
- Updated URLs in the documentation to use HTTPS where possible and updated outdated links.