github beetbox/beets v2.13.0
Release v2.13.0

4 hours ago

New features

  • Convert Plugin: Add new configuration option convert.refresh and command-line option --refresh, allowing to force Convert Plugin operation when original file is newer than existing converted file.
  • Edit Plugin: The interactive import editor now shows album-level fields (as configured by 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.
  • FetchArt Plugin: Add 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.
  • FtInTitle Plugin: Apply featured-artist rewriting to fetched metadata before commands such as MBSync Plugin use it. 🐛 (#1153)
  • LastGenre Plugin: Add support for normalizing genre spellings and naming variants with a new configuration option 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. 🐛 (#6466)
  • Lyrics Plugin: Add lrcmux backend, which aggregates lyrics from various other sources.
  • Lyrics Plugin: Added a --no-keep-synced command option to override keep_synced: yes for a single manual lyrics fetch.
  • Lyrics Plugin: Added a rest_directory configuration option for specifying a reStructuredText output directory, semantically equivalent to -r, --write-rest. 🐛 (#2806)
  • modify command: Support += and -= operators to add or remove individual values from multi-valued fields without replacing the whole field. 🐛 (#6587)
  • ReplayGain Plugin: Add a metaflac backend that computes ReplayGain for FLAC files using the metaflac command-line tool. 🐛 (#1203)
  • Spotify Plugin: Recognize native Spotify URIs (e.g. spotify:album:<id> and spotify:track:<id>) when extracting release/track IDs, in addition to full open.spotify.com URLs and bare IDs
  • Tidal Plugin: Add cover art support. Album metadata now includes cover_art_url from Tidal's coverArt relationship, which the FetchArt Plugin plugin can retrieve.
  • A database backup is now automatically created before running schema migrations. Control with the create_backup_before_migrations option (default: yes).

Bug fixes

  • Convert Plugin: 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. 🐛 (#4692)
  • Edit Plugin: Preserve missing album art paths when editing album metadata, instead of turning artpath: null into a path ending in None. 🐛 (#2438)
  • ImportFeeds Plugin: import command no longer aborts the whole run when a symlink cannot be created (e.g. on Windows or a read-only directory); the failure is logged and the import continues. 🐛 (#840)
  • Lyrics Plugin: Leave lyrics empty when a source reports an instrumental track, and store that state in lyrics_instrumental flexible attribute. Existing [Instrumental] lyrics are migrated automatically. 🐛 (#6719)
  • Missing Plugin: Honor the -f/--format option (and the format_album configuration) when listing missing albums in album mode. 🐛 (#3804)
  • Smart Playlist Plugin: splupdate no longer crashes with TypeError: unhashable type: 'list' when a playlist configuration includes a playlist: query. 🐛 (#5354)
  • SubsonicUpdate Plugin: Log a clearer error when the Subsonic server returns a non-JSON response. 🐛 (#5635)
  • Tidal Plugin: Normalize Tidal album types to lowercase.
  • A date query containing a stray | (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.
  • Album 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. 🐛 (#6756)
  • Sorting by a nullable field (for example a flexible attribute with a declared type whose null value is 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. 🐛 (#3461)

Other changes

  • Contributing: The project now uses 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. 🐛 (#5783)
  • Installation Add Homebrew to the list of supported package managers in the installation guide.
  • Installation: Note that Windows users should run beets in a terminal emulator (such as Windows Terminal or cmder) for output to display correctly. 🐛 (#2848)
  • Installation: Switch isolated tool installation guidance and GitHub workflow setup to uv tool commands.
  • LastGenre Plugin: Add a new "Choosing the Right Tool" documentation section to guide users in picking the right approach across genre fetching, filtering, and normalization.
  • Spotify Plugin: Retry on 503 Service Unavailable responses from the Spotify API instead of immediately aborting, matching the existing 429 rate-limit retry behavior.

Don't miss a new beets release

NewReleases is sending notifications on new releases.