Beets now officially supports Python 3.14.
New features
- AutoBPM Plugin: Add
forceconfiguration and CLI option and deprecateoverwrite. - AutoBPM Plugin: The "BPM already exists for item" log message can now be hidden with the
--quietflag. - Chromaprint/Acoustid Plugin: Add new command
chromasearchto search the local library by chromaprint fingerprint. - FetchArt Plugin: Add support for WebP images.
- import command Use ffprobe to recognize format of any import music file that has no extension. If the file cannot be recognized as a music file, leave it alone. π (#4881)
- LastGenre Plugin: Add support for a user-configurable ignorelist to exclude unwanted or incorrect Last.fm (or existing) genres, either per artist or globally π (#6449)
- MusicBrainz Plugin: Store MBIDs for remixers, lyricists, composers, and arrangers in the new multi-valued fields
remixers_mbid,lyricists_mbid,composers_mbid, andarrangers_mbid. π (#5698) - ReplayGain Plugin: Conflicting replay gain tags are now removed on write. RG* tags are removed when setting R128* and vice versa.
- Smart Playlist Plugin: The list of available playlists shown when an unknown playlist name is passed as an argument is now sorted alphabetically and printed space-delimited and POSIX shell-quoted when required. This makes it easier to copy and paste multiple playlists for further use in the shell.
- Query: Add
has_cover_artcomputed field to query items by embedded cover art presence. Users can now search for tracks with or without embedded artwork usingbeet list has_cover_art:trueorbeet list has_cover_art:false. - Store track remixers, lyricists, composers, and arrangers in the multi-valued
remixers,lyricists,composers, andarrangersfields instead of the legacy single-valueremixer,lyricist,composer, andarrangerfields. Existing libraries are migrated automatically, and MusicBrainz Plugin now preserves each MusicBrainzremixer,lyricist,composer, andarrangerrelation as a separate value.
Bug fixes
- Deezer Plugin: Fix a regression in 2.8.0 where selecting a Deezer match during import could crash with
AttributeError: 'AlbumInfo' object has no attribute 'raw_data'when Deezer returned numeric artist IDs. π (#6503) - Deezer Plugin: Fix Various Artists albums being tagged with a localized string instead of the configured
va_name. Detection now uses Deezer's artist ID rather than the artist name string. π (#4956) - Discogs Plugin: Store specific Discogs styles in beets
genresand broader Discogs genres in thestylefield. When append_style_genre is enabled, the broader Discogs genres are also appended to thegenreslist. π (#6390) - FetchArt Plugin: Error when a configured source does not exist or sources configuration is empty. π (#6336)
- import command Fix
albumartists_sort(and related fields) incorrectly prepending the full combined artist credit as the first element for multi-artist releases. π (#6470) - ListenBrainz Plugin: Fix
lbimportcrashing when ListenBrainz tracks are processed through Last.fm-specific play-count import logic. Play-count imports now use source-specific fields so ListenBrainz Plugin, LastImport Plugin, and MPDStats Plugin do not clash. π (#6469) - ListenBrainz Plugin: Paginate through all ListenBrainz listens instead of fetching only 25, aggregate individual listen events into correct play counts, use
recording_mbidfrom the ListenBrainz mapping when available, and avoid per-listen MusicBrainz API lookups that caused imports to hang on large listen histories. π (#6469) - modify command accepts legacy singular field names such as
genre,composer,lyricist,remixer, andarrangerin assignments, rewrites them to the corresponding multi-valued fields, and warns users to switch to the plural field names. list command, and query expressions, accept the same legacy singular field names and warn users to switch to the plural field names. π (#6483) - Rewrite Plugin Advanced Rewrite Plugin: Fix rewriting multi-valued fields such as
genresby applying rules to each matching list entry. Additionally, apply rewrite rules in config order, so that multiple rules can be applied to the same field. π (#6515) - Correctly handle semicolon-delimited genre values from externally-tagged files. π (#6450)
For plugin developers
- If you maintain a metadata source plugin that populates any of
arranger,composer,lyricist,remixerfields, update it to populate the respective multi-valued fields instead (arrangers,composers,lyricists,remixers).