New features
- Beets library is now made portable: item and album-art paths are now stored relative to the library root in the database while remaining absolute in the rest of beets. Path queries continue matching both library-relative paths and absolute paths under the currently configured music directory under the new storage model. The existing paths in the database are migrated automatically the first time you run any
beetcommand after the update. 🐛 (#133)
Warning
make sure you run beet version (or any other command) at least once after upgrading to trigger the migration. Only then you can safely move the library to a new location.
- Inline Plugin: Add access to the
albumoritemobject asdb_objin inline fields. - Discogs Plugin: Import Discogs remixer, lyricist, composer, and arranger credits into the multi-value
remixers,lyricists,composers, andarrangersfields. 🐛 (#6380) - Lyrics Plugin: Add
keep_syncedconfig option and--keep-syncedCLI flag to skip re-fetching lyrics for tracks that already have synced lyrics, even whenforceis enabled. 🐛 (#5249) - MusicBrainz Plugin: Use aliases for artist credit.
- Metadata source plugin searches and lookups are now executed concurrently, speeding up lookups when multiple plugins (e.g. MusicBrainz and Spotify) are enabled.
Bug fixes
- Chromaprint/Acoustid Plugin: Do not produce MusicBrainz-sourced autotagger candidates when the MusicBrainz Plugin plugin is not enabled. The chroma plugin now looks up the musicbrainz plugin through the metadata-source registry instead of unconditionally instantiating its own private instance, which also restores compatibility with MusicBrainz Pseudo-Release Plugin for chroma-triggered lookups. 🐛 (#6212) 🐛 (#6441)
- import command Automatically remux WAV files containing MP3 streams (
WAVE_FORMAT_MPEGLAYER3) to proper MP3 files during import, instead of silently importing them with incorrect metadata. 🐛 (#6455) - import command Remove clutter from imported album folders. 🐛 (#5016)
- ListenBrainz Plugin: Retry listenbrainz requests for temporary failures.
- Web Plugin: Fix a stored XSS vulnerability where unescaped metadata fields (artist, album, title, comments, lyrics) could execute arbitrary JavaScript in the browser. Template tags now use
<%-(escaped interpolation) instead of<%=(raw interpolation).
For plugin developers
- Consumers of beetsplug._utils.musicbrainz.MusicBrainzAPI now receive normalized MusicBrainz payloads with underscore-separated field names (for example
artist_creditandrelease_group) and grouped relation lists such aswork_relations,release_relations, andurl_relations. The API responses are also now fully typed with concreteTypedDictmodels for releases, recordings, works, and relations. Update direct access to raw MusicBrainz response keys if needed.