# beets v2.9.0 — Release v2.9.0 - Product: beets (https://whatsnew.fyi/product/beets) - Vendor: Adrian Sampson - Date: 2026-04-11 - Version: v2.9.0 - Original notes: https://github.com/beetbox/beets/releases/tag/v2.9.0 - Permalink: https://whatsnew.fyi/product/beets/releases/v2.9.0 - Labels: Platforms: Desktop What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — Add official support for Python 3.14 - **added** — AutoBPM Plugin: Add force configuration and CLI option - **added** — AutoBPM Plugin: Hide "BPM already exists for item" log message with --quiet flag - **added** — Chromaprint/Acoustid Plugin: Add chromasearch command to search the local library by chromaprint fingerprint - **added** — FetchArt Plugin: Add support for WebP images - **added** — import command: Use ffprobe to recognize format of any import music file that has no extension - **added** — LastGenre Plugin: Add support for a user-configurable ignorelist to exclude unwanted or incorrect Last.fm genres - **added** — MusicBrainz Plugin: Store MBIDs for remixers, lyricists, composers, and arrangers in new multi-valued fields remixers_mbid, lyricists_mbid, composers_mbid, and arrangers_mbid - **added** — ReplayGain Plugin: Remove conflicting replay gain tags on write, removing RG* tags when setting R128* and vice versa - **added** — Smart Playlist Plugin: Sort available playlists alphabetically and print space-delimited and POSIX shell-quoted when required - **added** — Query: Add has_cover_art computed field to query items by embedded cover art presence - **added** — Store track remixers, lyricists, composers, and arrangers in multi-valued fields instead of legacy single-value fields with automatic migration - **deprecated** — AutoBPM Plugin: Deprecate overwrite configuration in favor of force - **fixed** — Deezer Plugin: Fix AttributeError crash when selecting a Deezer match with numeric artist IDs - **fixed** — Deezer Plugin: Fix Various Artists albums being tagged with localized string instead of configured va_name - **fixed** — Discogs Plugin: Store specific Discogs styles in genres field and broader Discogs genres in style field - **fixed** — FetchArt Plugin: Fix error when a configured source does not exist or sources configuration is empty - **fixed** — import command: Fix albumartists_sort incorrectly prepending combined artist credit as first element for multi-artist releases - **fixed** — ListenBrainz Plugin: Fix lbimport crashing when tracks are processed through Last.fm-specific play-count import logic - **fixed** — ListenBrainz Plugin: Paginate through all ListenBrainz listens, aggregate individual listen events into correct play counts, and avoid per-listen MusicBrainz API lookups Beets now officially supports Python 3.14. #### New features - [AutoBPM Plugin](https://beets.readthedocs.io/en/stable/plugins/autobpm.html): Add `force` configuration and CLI option and deprecate `overwrite`. - [AutoBPM Plugin](https://beets.readthedocs.io/en/stable/plugins/autobpm.html): The "BPM already exists for item" log message can now be hidden with the `--quiet` flag. - [Chromaprint/Acoustid Plugin](https://beets.readthedocs.io/en/stable/plugins/chroma.html): Add new command `chromasearch` to search the local library by chromaprint fingerprint. - [FetchArt Plugin](https://beets.readthedocs.io/en/stable/plugins/fetchart.html): Add support for WebP images. - [import command](https://beets.readthedocs.io/en/stable/reference/cli.html#import-cmd) 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. :bug: (#4881) - [LastGenre Plugin](https://beets.readthedocs.io/en/stable/plugins/lastgenre.html): Add support for a user-configurable ignorelist to exclude unwanted or incorrect Last.fm (or existing) genres, either per artist or globally :bug: (#6449) - [MusicBrainz Plugin](https://beets.readthedocs.io/en/stable/plugins/musicbrainz.html): Store MBIDs for remixers, lyricists, composers, and arrangers in the new multi-valued fields `remixers_mbid`, `lyricists_mbid`, `composers_mbid`, and `arrangers_mbid`. :bug: (#5698) - [ReplayGain Plugin](https://beets.readthedocs.io/en/stable/plugins/replaygain.html): Conflicting replay gain tags are now removed on write. [RG]()\* tags are removed when setting [R128]()\* and vice versa. - [Smart Playlist Plugin](https://beets.readthedocs.io/en/stable/plugins/smartplaylist.html): 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_art` computed field to query items by embedded cover art presence. Users can now search for tracks with or without embedded artwork using `beet list has_cover_art:true` or `beet list has_cover_art:false`. - Store track remixers, lyricists, composers, and arrangers in the multi-valued `remixers`, `lyricists`, `composers`, and `arrangers` fields instead of the legacy single-value `remixer`, `lyricist`, `composer`, and `arranger` fields. Existing libraries are migrated automatically, and [MusicBrainz Plugin](https://beets.readthedocs.io/en/stable/plugins/musicbrainz.html) now preserves each MusicBrainz `remixer`, `lyricist`, `composer`, and `arranger` relation as a separate value. #### Bug fixes - [Deezer Plugin](https://beets.readthedocs.io/en/stable/plugins/deezer.html): 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. :bug: (#6503) - [Deezer Plugin](https://beets.readthedocs.io/en/stable/plugins/deezer.html): 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. :bug: (#4956) - [Discogs Plugin](https://beets.readthedocs.io/en/stable/plugins/discogs.html): Store specific Discogs styles in beets `genres` and broader Discogs genres in the `style` field. When [append_style_genre](https://beets.readthedocs.io/en/stable/plugins/discogs.html#conf-append_style_genre) is enabled, the broader Discogs genres are also appended to the `genres` list. :bug: (#6390) - [FetchArt Plugin](https://beets.readthedocs.io/en/stable/plugins/fetchart.html): Error when a configured source does not exist or sources configuration is empty. :bug: (#6336) - [import command](https://beets.readthedocs.io/en/stable/reference/cli.html#import-cmd) Fix `albumartists_sort` (and related fields) incorrectly _[Truncated at 4000 characters — full notes: https://github.com/beetbox/beets/releases/tag/v2.9.0]_