github beetbox/beets v2.7.0
Release v2.7.0

6 hours ago

New features

  • LastGenre Plugin: Added cleanup_existing configuration flag to allow whitelist canonicalization of existing genres.

  • Add native support for multiple genres per album/track. The genres field 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 the genres field 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 the genres list 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 updated genres values 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 genre field is split by the first separator found in the string, in the following order of precedence:

    1. LastGenre Plugin separator configuration
    2. Semicolon followed by a space
    3. Comma followed by a space
    4. Slash wrapped by spaces
  • Lyrics Plugin: With synced enabled, existing synced lyrics are no longer replaced by newly fetched plain lyrics, even when force is enabled.

  • Lyrics Plugin: Remove Source: <lyrics-url> suffix from lyrics. Store the backend name in lyrics_backend, URL in lyrics_url, language in lyrics_language and translation language (if translations present) in lyrics_translation_language flexible 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 ~foo or %%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 autotag is disabled). Previously, duplicate_keys and duplicate_action config options were silently ignored for as-is imports.
  • import command When autotagging, initialise empty multi-valued fields with None instead 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_disc option is set, disctotal is zeroed alongside disc.

For plugin developers

  • If you maintain a metadata source plugin that populates the genre field, please update it to populate a list of genres instead. You will see a deprecation warning for now, but support for populating the single genre field will be removed in version 3.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 separator configuration option is removed. Since genres are now stored as a list in the genres field 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 lrclib lyrics 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 example beet modify albumtypes="album; ep". Previously, \␀ was used as a separator. This applies to fields such as artists, AlbumTypes Plugin etc.
  • Improve highlighting of multi-valued fields changes.
  • Updated URLs in the documentation to use HTTPS where possible and updated outdated links.

Don't miss a new beets release

NewReleases is sending notifications on new releases.