Release v2.13.1
- Source distributions now include the bundled man pages
Bug fixes
- Fixed source distributions not including the bundled man pages. :bug: (#6882)
A command-line music library manager and tagger backed by MusicBrainz.
| May | Jun | Jul | Aug | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sunday | No releases on May 3, 2026 | No releases on May 10, 2026 | No releases on May 17, 2026 | No releases on May 24, 2026 | No releases on May 31, 2026 | No releases on Jun 7, 2026 | No releases on Jun 14, 2026 | No releases on Jun 21, 2026 | No releases on Jun 28, 2026 | No releases on Jul 5, 2026 | No releases on Jul 12, 2026 | No releases on Jul 19, 2026 | No releases on Jul 26, 2026 | No releases on Aug 2, 2026 | No releases on Aug 9, 2026 | No releases on Aug 16, 2026 |
| Monday | No releases on May 4, 2026 | No releases on May 11, 2026 | No releases on May 18, 2026 | No releases on May 25, 2026 | No releases on Jun 1, 2026 | No releases on Jun 8, 2026 | No releases on Jun 15, 2026 | 1 release on Jun 22, 2026 | No releases on Jun 29, 2026 | No releases on Jul 6, 2026 | No releases on Jul 13, 2026 | No releases on Jul 20, 2026 | 1 release on Jul 27, 2026 | No releases on Aug 3, 2026 | No releases on Aug 10, 2026 | |
| Tuesday | No releases on May 5, 2026 | No releases on May 12, 2026 | No releases on May 19, 2026 | No releases on May 26, 2026 | No releases on Jun 2, 2026 | No releases on Jun 9, 2026 | No releases on Jun 16, 2026 | No releases on Jun 23, 2026 | No releases on Jun 30, 2026 | No releases on Jul 7, 2026 | No releases on Jul 14, 2026 | No releases on Jul 21, 2026 | No releases on Jul 28, 2026 | No releases on Aug 4, 2026 | No releases on Aug 11, 2026 | |
| Wednesday | 1 release on May 6, 2026 | No releases on May 13, 2026 | No releases on May 20, 2026 | No releases on May 27, 2026 | No releases on Jun 3, 2026 | No releases on Jun 10, 2026 | No releases on Jun 17, 2026 | No releases on Jun 24, 2026 | No releases on Jul 1, 2026 | No releases on Jul 8, 2026 | No releases on Jul 15, 2026 | No releases on Jul 22, 2026 | 1 release on Jul 29, 2026 | No releases on Aug 5, 2026 | No releases on Aug 12, 2026 | |
| Thursday | No releases on May 7, 2026 | No releases on May 14, 2026 | No releases on May 21, 2026 | No releases on May 28, 2026 | No releases on Jun 4, 2026 | No releases on Jun 11, 2026 | No releases on Jun 18, 2026 | No releases on Jun 25, 2026 | No releases on Jul 2, 2026 | No releases on Jul 9, 2026 | No releases on Jul 16, 2026 | No releases on Jul 23, 2026 | No releases on Jul 30, 2026 | No releases on Aug 6, 2026 | No releases on Aug 13, 2026 | |
| Friday | No releases on May 8, 2026 | No releases on May 15, 2026 | No releases on May 22, 2026 | No releases on May 29, 2026 | No releases on Jun 5, 2026 | No releases on Jun 12, 2026 | No releases on Jun 19, 2026 | No releases on Jun 26, 2026 | No releases on Jul 3, 2026 | No releases on Jul 10, 2026 | No releases on Jul 17, 2026 | No releases on Jul 24, 2026 | No releases on Jul 31, 2026 | No releases on Aug 7, 2026 | No releases on Aug 14, 2026 | |
| Saturday | No releases on May 9, 2026 | No releases on May 16, 2026 | No releases on May 23, 2026 | No releases on May 30, 2026 | No releases on Jun 6, 2026 | No releases on Jun 13, 2026 | No releases on Jun 20, 2026 | No releases on Jun 27, 2026 | No releases on Jul 4, 2026 | No releases on Jul 11, 2026 | No releases on Jul 18, 2026 | No releases on Jul 25, 2026 | No releases on Aug 1, 2026 | No releases on Aug 8, 2026 | No releases on Aug 15, 2026 |
10 releases since Feb 22, 2026
convert.refresh and command-line option --refresh, allowing to force Convert Plugin operation when original file is newer than existing converted file.albumfields) as a YAML header section when editing an album import. Fields that appear in both itemfields and albumfields are shown only in the header, not per-track.fetch_for_asis setting that enables fetching album art from online sources even when imported files are not modified by the auto-tagger. Default is no which means FetchArt Plugin looks for art only in the local filesystem when the user (or quiet_fallback) chooses asis.aliases. The feature is enabled by default and ships with a built-in list of regex patterns. These patterns can be replaced via the user's configuration. The default whitelist and genre tree were audited against the top 1,000 Last.fm tags: canonical names are now consistent across both files, long-standing mismatches between them have been resolved, and entries align with the built-in alias patterns. :bug: (#6466)lrcmux backend, which aggregates lyrics from various other sources.--no-keep-synced command option to override keep_synced: yes for a single manual lyrics fetch.rest_directory configuration option for specifying a reStructuredText output directory, semantically equivalent to -r, --write-rest. :bug: (#2806)+= and -= operators to add or remove individual values from multi-valued fields without replacing the whole field. :bug: (#6587)metaflac backend that computes ReplayGain for FLAC files using the metaflac command-line tool. :bug: (#1203)spotify:album:<id> and spotify:track:<id>) when extracting release/track IDs, in addition to full open.spotify.com URLs and bare IDscover_art_url from Tidal's coverArt relationship, which the FetchArt Plugin plugin can retrieve.create_backup_before_migrations option (default: yes).convert -a with copy_album_art enabled no longer crashes when the stored album art path points to a missing file (for example a multi-disc album whose cover lives in the album root rather than a per-disc directory); the missing art is skipped instead. :bug: (#4692)artpath: null into a path ending in None. :bug: (#2438)lyrics_instrumental flexible attribute. Existing [Instrumental] lyrics are migrated automatically. :bug: (#6719)-f/--format option (and the format_album configuration) when listing missing albums in album mode. :bug: (#3804)splupdate no longer crashes with TypeError: unhashable type: 'list' when a playlist configuration includes a playlist: query. :bug: (#5354)| (for example added:2000|2001, as might be typed by a user expecting | to mean "or") now raises a clean "a valid date/time string" error instead of crashing with an uncaught KeyError. A | was being accepted as a relative-date unit due to a regular expression character-class typo.store no longer copies artpath onto its items as an absolute path, which broke relative-path portability. A database migration removes any such stale artpath attributes left on items by earlier versions. :bug: (#6756)None) that is present on only some items no longer crashes with a TypeError. Missing values are now grouped together, ordered before present ones when sorting ascending and after them when descending. :bug: (#3461)uv for packaging, virtual environment, and dependency management, replacing poetry. The build backend has changed from poetry-core to hatchling. Please see updates in Development Tools and Getting the Source for more information. :bug: (#5783)uv tool commands.503 Service Unavailable responses from the Spotify API instead of immediately aborting, matching the existing 429 rate-limit retry behavior.Convert Plugin: The --force and --keep-new CLI flags are now also available as config options via force and keep_new.
import command: The --nomove / -M CLI flag can now be used to override the move: yes config option during import.
Lyrics Plugin: Write synced (LRC) lyrics to the SYLT (synchronized lyrics) ID3 frame and plain text to USLT for ID3-tagged files, instead of storing raw LRC timestamps in USLT. Players that only support USLT continue to see readable plain lyrics. :bug: (#6541)
ListenBrainz Plugin: Add support for importing ListenBrainz listening history from an export file. Use the -f / --export-file flag to specify the path to the ListenBrainz export file.
MusicBrainz Plugin: Introduce aliases_as_credits to make aliases-as-artist-credit optional.
Bad Files Plugin: Added settings for auto error and warning actions.
Tidal Plugin: New flexible attributes are now populated during imports, including tidal_track_id, tidal_album_id, tidal_artist_id, tidal_track_popularity, tidal_album_popularity, and tidal_updated. Added a new beet tidalsync command to refresh popularity data for imported items by default, or albums with --album, with --force to re-fetch and --write to update file tags.
Migration: Existing Tidal imports can copy the previously stored IDs into the new flexible attributes with modify command: run beet modify data_source:tidal tidal_album_id='$mb_albumid' -a for albums and beet modify data_source:tidal tidal_track_id='$mb_trackid' for items.
--playlist help text so it no longer has awkward indentation in CLI output.OSError in _set_art so that permission errors (e.g. a file locked by another process) are logged as warnings instead of crashing beets. :bug: (#6193)could not get filesize errors. :bug: (#6601)429 Too Many Requests errors from lyrics sources during bulk imports. :bug: (#6728)import.from_scratch is enabled. :bug: (#6613)beet modify -a splitting multi-value field strings (like artists, genres) into individual characters when modifying albums. Album field types now fall back to the corresponding item field type definitions. :bug: (#5690)--host, --port, or --password on the command line. :bug: (#5404)401 Unauthorized errors during mbupdate without crashing, and log a clearer message that points users to musicbrainz.user and musicbrainz.pass configuration. :bug: (#6651)KeyError: 'aliases' crash when looking up releases with more than 500 tracks.PseudoAlbumInfo.raw_data and a sqlite3.ProgrammingError.TypeError when invoking the Replace Plugin command. :bug: (#6260)requests-oauthlib is installed. :bug: (#6633)AttrDict.__getattribute__ now unmasks AttributeError raised inside a cached_property body. Previously such errors were swallowed by the __getattr__ fallback, producing a misleading message about the property name itself. The wrapped RuntimeError keeps the original traceback so it still points at the real failing line. :bug: (#6558)ReadError and WriteError now include the file path and the underlying reason in their message instead of a <super: ...> object representation. :bug: (#6560)genres when using exact string matches like genres:=Classical or genres:=~Classical. :bug: (#6598)beets.importer.DuplicateAction to simplify handling of duplicates.beets.autotag, including match classes, distance helpers, and assign_items, without relying on lower-level autotag modules.LyricsSession into the shared beetsplug._utils.requests.TimeoutAndRetrySession so all plugins benefit. The standalone LyricsSession class has been removed.spotifysync now batches its SQLite commit for a sync run, follows the standard beets write-before-store pattern, and logs audio-features API unavailability only once per run.%titlecase{text} template function. :bug: (#6697)musicbrainz: msg) moved from a filter to LegacyFormatter, making future customization easier.Smart Playlist Plugin: The splupdate command output is restructured. The per-playlist summary now includes a track count. Per-track details are shown only when -v flag is provided (beet -v splupdate). The --pretend flag produces the same output but reports "N playlists would be updated" instead of "N playlists updated". The --format option allows customizing the track line format. The --pretend-paths option was removed (use --format='$path' instead). :bug: (#6183)
import command: When importing an archive (zip, tar, rar, or 7z) with move: yes, the source archive is now removed after a successful import. Archives are preserved if any file in the archive was not imported (e.g. skipped as a duplicate, or the import was aborted), and in non-move import modes.
FromFilename Plugin: Support track prefix when parsing the track number from the filename (e.g., track01.m4a).
Tidal plugin: Introduces a new plugin for fetching metadata from Tidal. It supports album and track lookups by ID, including batch operations via albums_for_ids and tracks_for_ids. It also enables search by query as well as identifier-based retrieval, with support for ISRC codes (tracks) and barcode/EANs (albums).
This is an initial, relatively minimal implementation, but already fully usable for common metadata workflows. We welcome feedback, improvement ideas, and community contributions to further extend its capabilities.
See Tidal Plugin for more information.
Add support for adding or modifying a subtitle (ID3 tag TIT3) field
--quiet flag or import.quiet: yes config) during import so the corrupt-file prompt is suppressed in non-interactive imports. :bug: (#4736)artists (for example with Feat. join text) and extraartists as Featuring. :bug: (#6166)cover.2.jpg) being created when re-importing albums with the FetchArt Plugin plugin enabled. Old album art is now properly removed when replacing duplicate albums during import. :bug: (#1264) :bug: (#6205)cassette, digital media, and vinyl as disc markers (e.g. vinyl 1, 12 vinyl 2), in addition to the existing disc, disk, and cd markers.distance_weights could cause fields with no actual mismatch to appear in the ≠ line.original_date: yes, album-level year, month, and day now use the original release date. :bug: (#6577)musixmatch backend slug. :bug: (#4759)DBAccessError messages to help users diagnose database permission issues more easily. The error message now mentions directory missing and file permissions as potential causes. :bug: (#1676)TEXT values instead of bytes, so upgrading to the portable-path storage format no longer fails for those libraries. :bug: (#6561)spotifysync track and audio-features API requests and deduplicate repeated Spotify track IDs within a run.beet command after the update. :bug: (#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.
album or item object as db_obj in inline fields.remixers, lyricists, composers, and arrangers fields. :bug: (#6380)keep_synced config option and --keep-synced CLI flag to skip re-fetching lyrics for tracks that already have synced lyrics, even when force is enabled. :bug: (#5249)WAVE_FORMAT_MPEGLAYER3) to proper MP3 files during import, instead of silently importing them with incorrect metadata. :bug: (#6455)<%- (escaped interpolation) instead of <%= (raw interpolation).artist_credit and release_group) and grouped relation lists such as work_relations, release_relations, and url_relations. The API responses are also now fully typed with concrete TypedDict models for releases, recordings, works, and relations. Update direct access to raw MusicBrainz response keys if needed.Beets now officially supports Python 3.14.
force configuration and CLI option and deprecate overwrite.--quiet flag.chromasearch to search the local library by chromaprint fingerprint.remixers_mbid, lyricists_mbid, composers_mbid, and arrangers_mbid. :bug: (#5698)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.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 now preserves each MusicBrainz remixer, lyricist, composer, and arranger relation as a separate value.AttributeError: 'AlbumInfo' object has no attribute 'raw_data' when Deezer returned numeric artist IDs. :bug: (#6503)va_name. Detection now uses Deezer's artist ID rather than the artist name string. :bug: (#4956)genres and broader Discogs genres in the style field. When append_style_genre is enabled, the broader Discogs genres are also appended to the genres list. :bug: (#6390)albumartists_sort (and related fields) incorrectly prepending the full combined artist credit as the first element for multi-artist releases. :bug: (#6470)lbimport crashing 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. :bug: (#6469)recording_mbid from the ListenBrainz mapping when available, and avoid per-listen MusicBrainz API lookups that caused imports to hang on large listen histories. :bug: (#6469)genre, composer, lyricist, remixer, and arranger in 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. :bug: (#6483)genres by 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. :bug: (#6515)arranger, composer, lyricist, remixer fields, update it to populate the respective multi-valued fields instead (arrangers, composers, lyricists, remixers).barcode, catalognum, country, label, media, and year) in Discogs search queries.auto_ignore configuration option to skip fetching lyrics for items matching a beets query during auto import.--release-type flag. The default behavior is also changed to just show releases of type album. :bug: (#2661)-R/--randomize flag to shuffle the playlist order before passing it to the player.dest_regen to regenerate items' path in the generated playlist instead of using those in the library. This is useful when items have been imported in don't copy-move (-C -M) mode in the library but are later passed through the Convert Plugin plugin which will regenerate new paths according to the Beets path format.va_name config for the album artist on VA releases instead of hardcoded "Various Artists". :bug: (#6316)cmd /c start "" for the default editor fallback so beet config -e works when VISUAL and EDITOR are unset. :bug: (#6436)play_count to lastfm_play_count to avoid conflicts with MPDStats Plugin. Migration: This cannot be migrated automatically because of the field clash. If you use LastImport Plugin without MPDStats Plugin, migrate manually with beet modify lastfm_play_count='$play_count'.data_source for ID lookups, with a fallback to MusicBrainz.--album mode incorrectly reporting albums already in the library as missing. The comparison now correctly uses mb_releasegroupid.va_name config for albumartist_sort, albumartists_sort, albumartist_credit, albumartists_credit, and albumartists on VA releases instead of hardcoded "Various Artists". :bug: (#6316)drive_sep_replace regex logic more precise to prevent edge-case mismatches (e.g., a song titled "1:00 AM" would incorrectly be considered a Windows drive path).beets.metadata_plugins.album_for_id and beets.metadata_plugins.track_for_id now require a data_source argument and query only that provider.beets.ui now live in beets.util.color, beets.util.diff, and beets.util.layout. Update external imports accordingly.tunelog helper was generalized into beets.logging.BeetsLogger.extra_debug, which emits DEBUG messages only at verbosity level 3 or higher (for example -vvv). Plugin authors can use it via self._log.extra_debug(...).~beets.metadata_plugins.SearchApiMetadataSourcePlugin.get_search_query_with_filters and ~beets.metadata_plugins.SearchApiMetadataSourcePlugin.get_search_response.langdetect package are now skipped when the package is not installed. :bug: (#6421)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:
separator configurationLyrics 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. :bug: (#6370)
~foo or %%foo), so fuzzy matching is applied consistently. :bug: (#5638)autotag is disabled). Previously, duplicate_keys and duplicate_action config options were silently ignored for as-is imports.None instead of empty list, which caused beets to overwrite existing metadata with empty list values instead of leaving them unchanged. :bug: (#6403)omit_single_disc option is set, disctotal is zeroed alongside disc.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.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.lrclib lyrics source, synced lyrics are now checked to ensure the final verse falls within the track's duration.; . For example beet modify albumtypes="album; ep". Previously, \␀ was used as a separator. This applies to fields such as artists, AlbumTypes Plugin etc.tracks key. :bug: (#6302)alias and tracks extra_tags.artist_credit field in the MusicBrainz API response. :bug: (#6339)mp3gain. :bug: (#2946)tekstowo by default because it blocks the beets User-Agent.The modern media player for macOS.
A free, open-source and cross-platform media player.
Free DJ software for live mixing.
An award-winning free and open-source video editor.
A music collection manager for Usenet and BitTorrent.
The official MusicBrainz music tagger.
If you publish beets, you can claim this product by proving you administer its repository.