github metasauce/beets-flask v2.0.0

29 minutes ago

We're happy this one is finally out. It includes a ton of fixes and additions 🎉

The first 2.0 release candidate shipped last December. Then we kept finding reasons to hold it back (one more fix, one more cleanup, one more thing to verify first). Instead of postponing the inevitable again, we decided it is time we do a proper release now.

Because this is a major version, please have a look at the breaking changes below!

Upgrading

  1. Back up /config.
  2. Switch your compose file or docker run line from pspitzner/beets-flask to metasauce/beets-flask. The old image name will not receive updates.
  3. docker compose pull && docker compose up -d.
  4. Open the UI. If your config has an option we can no longer validate, it will say so on startup instead of crashing.

⚠️ Breaking Changes ⚠️

  • Repository and images moved: from pSpitzner/beets-flask to metasauce/beets-flask. Update your git remote and your image reference. Update pspitzner/beets-flask to metasauce/beets-flask in your compose file, otherwise you will stay on 1.2.x.
  • Base image changed: the container base image is now python:3.12-slim (previously python:3.11-alpine). If you use a custom startup.sh, check it for Alpine-specific tooling and shell behaviour #212
  • Upgraded beets from v2.5.1 to v2.14.0
    • Many changes and improvements, including in some plugins.
    • See the changelog at beets.readthedocs.io
  • Changed config options (beets-flask):
    • gui.inbox.folders.your_inbox.autotag no longer accepts false, use "off" instead. This was needed for consistency with the new config validation.
  • Changed config options (beets):
    • fetchart.sources defaults changed. If you get errors from our previous defaults, set it to "*".

Added

  • Config validation. When loading config files we now check that the specified options will work. If they won't, the frontend shows an error message with details on what is wrong. This covers gui settings (our own ones, in beets-flask/config.yaml) and the native beets options we use directly. Covering all of beets' native options is more of an upstream task. #224
  • Upload files via the WebUI. You can now drag and drop single files into an inbox. To upload whole albums, zip them on your host first — uploading folders directly would require a secure context.
  • New config option gui.terminal.enabled (default: true) #254
  • You can use PUID and PGID instead of GROUP_ID and USER_ID. Handy for yaml anchors. #260
  • Use an external redis server by setting the REDIS_URL environment variable. #277
  • Faster inbox loading: chip info (best match, duplicates, data source) is fetched via a new lightweight /session/minimal endpoint, batched into one request instead of loading full session states.
  • Cover art preview for external URLs is resolved through a pluggable art-extension system. New providers can be added by implementing the ArtSource interface.
  • Discogs art source: releases matched via the discogs plugin get cover art previews. Works without a token; uses discogs.user_token when configured for a higher API rate limit.
  • Bandcamp art source: artwork is read from the release page JSON-LD.

Fixed

  • Finally tracked down our resource issues, starting with the low-hanging fruit on memory footprint #342
  • Missing library stats no longer crash on first launch #264
  • Fixed a potential memory leak when checking whether files are archives. We now check the file extension instead of opening the file, which avoids the tarfile.is_tarfile issue #258
  • Library stats no longer block for minutes on large or network-mounted libraries. The size is computed by one shared background du task, and a request waits at most two seconds for it #360
  • The tmux terminal could not start in some environments when SHELL was not set. We now always start a bash shell #282
  • The container user beetle now uses bash by default and activates the uv environment automatically.
  • YAML syntax and parser errors are passed to the frontend for you to inspect instead of crashing before the UI starts #305
  • Fixed timestamps in the library view #289
  • A failed import no longer leaves a stale error behind after a successful reimport of the same folder.
  • Folders without an import session no longer show a misleading "Unknown"/"Not started" badge.
  • Folders containing only non-music files (e.g. a stray foo.txt) are no longer detected as albums and auto-tagged by the watchdog.
  • Session and inbox data is cached in the frontend and only refetched when it changes, instead of on every view.

Other (dev)

  • We now use uv to manage python dependencies and run scripts in CI/CD, which improved dependency resolution and installation times.
  • We ship a static ffmpeg binary instead of installing ffmpeg via apt, which cut image size and improved compatibility across host systems.
  • Added database migrations using Alembic.
  • Removed the unnecessary nest_asyncio dependency.
  • Upgraded a number of frontend dependencies.

Don't miss a new beets-flask release

NewReleases is sending notifications on new releases.