ChangelogΒΆ

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[2.0.0] - UpcomingΒΆ

⚠️ Breaking Changes ⚠️¢

  • 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, please verify compatibility, as Alpine-specific tooling and shell behavior may differ #212

  • Changed config option: gui.inbox.folders.your_inbox.autotag no longer accepts false, use "off" instead. (This was needed for consistency for the new config validation)

AddedΒΆ

  • Config validation. When loading config files we now check that specified options will work. If not, the frontend will show an error message with details on what’s wrong. This applies to gui settings (i.e. our own ones, beets-flask/config.yaml) and very select ones from native beets (only those which we use directly). Hopefully, this will eventually cover all config options of beets native, but this is more of an upsream 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 of folders directly is not implemented, as it would require a secure context).

Other (dev)ΒΆ

  • We now use uv (Universal Virtualenv) to manage python dependencies and run scripts in CI/CD. This should improve dependency resolution and installation times.

  • We now ship a static ffmpeg binary instead of installing ffmpeg via apt. This should reduce image size and improve compatibility across different host systems.

1.2.0 - 25-12-17ΒΆ

⚠️ Important ⚠️¢

  • You need to update your beets config, and add musicbrainz to the list of enabled plugins. This is required because we updated the beets backend see here

FixedΒΆ

  • Duration component could display nothing in some edge cases.

  • Action buttons now have a slight box shadow and are a bit more visible.

  • We now support playing container types [m4a, mp4, mov, alac, aac, mp3] that require seeking. This should fix issues with some mp4/m4a files not playing.

  • If no candidates are found during an import, we now show a message instead of an empty screen. #190

  • Archive files can now be deleted #217

  • Import Bootleg Button now works as expected #218

  • Startup script was not executed correctly if placed in /config/beets-flask/startup.sh #227

  • Another state-related bug around Searching for Candidates #225. We now no longer require a certaint type of state before allowing to add candidates.

  • Asis candidates have been restyled to be more consistent with other candidate types. They now also include a cover art preview if available.

  • Fixed a typo in our opiniated beets config #235

  • Fixed a styling issue in the artists list view which caused an overflow

  • Fixed a styling issue where an extra cancel-button (cross) was shown on webkit browsers

AddedΒΆ

  • Added ability to define more groups to take care of ACLs, so that our non-root user can delete files on host systems, if desired. New environment variable EXTRA_GROUPS #234

  • The inbox info button now has a description of all actions #145

  • Subpage for version information and configs. You can access it via the version number in the navbar. #205

  • New config option gui.inbox.debounce_before_autotag to configure how many seconds to wait after the last filesystem event before starting autotagging. Same debounce applies to all inboxes. #222

  • The library view on mobile now has a button to collapse the overview (above the tabs). This allows for more space when browsing the library on small screens.

Other (dev)ΒΆ

  • The default beets config now includes a musicbrainz section that enables fetching of external ids (like tidal).

  • Fixed typing issues in ./tests folder and enabled mypy check for it.

  • Ruff now has the F401 (imported but unused) check enabled.

  • Ruff now has the UP checks enabled to enforce modern python syntax.

  • Unified coverart components in the frontend, we now use common styling for external and internal coverart.

  • Moved inbox metadata fetching into the library api routes.

  • Frontend formatter prettier is now enforced via a CI/CD workflow step

DependenciesΒΆ

  • Updated uvicorn to 0.36.0.

  • Updated beets from 2.3.1 over 2.4.0 to 2.5.0. See the two changelogs!

  • Updated a number of frontend dependencies, including react-query, react-router, vite, typescript, eslint, prettier and others. This partially required code changes due to breaking changes in these libraries. Should not affect normal usage tho.

1.1.3 - 25-09-18ΒΆ

AddedΒΆ

  • Docs now have a section on limiations

  • Pip requirements.txt and startup.sh can now be placed in /config/ or /config/beets-flask, the latter is installed later.

FixedΒΆ

  • Resolved an issue in Vite development server where pythonTypes.ts would fail to load on first start due to inconsistent indentation (tabs vs spaces). This only affected the dev environment.

  • Development Docker container now runs as the beetle user instead of root, improving parity with the production environment.

  • Trailing slashes in configured inbox paths no longer cause crashes. #182

  • The container now sets the EDITOR environment variable to vi so that beet edit and beet config -e work out of the box.

DependenciesΒΆ

  • Updated beets to version 2.3.1

  • Updated py2ts to version 0.6.1, now uses pypi distribution instead of github repo.

1.1.2 - 25-08-29ΒΆ

FixedΒΆ

  • Updated refresh_config to scan all modules for config references and overwrite them as needed to ensure consistency #188

1.1.1 - 25-08-15ΒΆ

FixedΒΆ

  • Session cache wasn’t invalidated on all folder updates. This especially fixes an issues where the watchdog would not trigger a session invalidation when a folder was deleted or renamed. #163

  • We now use the beets ignore config option to ignore files and folders in the inbox view. This allows you to ignore files like *.tmp, *.log, etc. We also allow users to define the gui.inbox.ignore option to customize the ignored file patterns. #176

  • Scrollbar for beets instructions wasn’t visible on small screens.

Other (dev)ΒΆ

  • Simplified translucent scroll setup in __root.tsx

AddedΒΆ

  • The items/track view now shows some basic information and you may play the track from there too.

1.1.0 - 25-07-29ΒΆ

AddedΒΆ

  • Support for importing archives zip and tar files. Support for rar and 7z files can be added via custom startup and requirements files. See the FAQ for more information.

DependenciesΒΆ

  • Updated py2ts to version 0.4.1

1.0.3 - 25-07-29ΒΆ

FixedΒΆ

  • Fixed search results not showing #161)

  • Fixed search box not clickable on small screens #162

1.0.2 - 25-07-21ΒΆ

FixedΒΆ

  • Artists separators were not regex escaped correctly, leading to issues with artists containing special characters. Additionally an empty list of separators was not handled correctly. #159

1.0.1 - 25-07-17ΒΆ

AddedΒΆ

  • Configuration option for artist separator characters gui.library.artist_separator

  • Docs subpage for configuration (including content)

  • typing_extensions is now a dependency, to allow for more typing features

  • The model api routes now allows for DELETE requests to delete resources by id. Not used yet but will be helpful for future features.

FixedΒΆ

  • Styling of candidate overview (major changes were not colored)

  • For bootlegs, display of track changes after import no longer broken

  • Navigating from inbox into folder details no longer toggles selection.

  • Padding issue where navbar could block content on mobile.

  • Cache invalidation now triggers on delete folder in frontend #138

  • In albums and items view the clicking on artists does not return any results if the contained a separator character (e.g. &) #132

  • Cleanup old actions.tsx file, which included old unused code #134

  • The cli_exit event is now triggered after the import task is finished. This adds compatibility with some plugins which expected this event to be triggered after the import task is done. #154.

ChangedΒΆ

  • Created types.py file to hold custom sqlalchemy types, and moved IntDictType there.

1.0.0 - 25-07-06ΒΆ

This is a breaking change, you will need to update your configs and delete your beets-flask database (not the beets db!).

This marks a major milestone for beets-flask, as we now pretty happy with the current features and the overall architecture.

ChangedΒΆ

  • Migrated backend to quart (the async version of flask)

  • Reworked most of the frontend

  • Removed interactive imports. We now store states for any preview and import that is generated. Thus, sessions are resumable, and we can go back and forth seemlessly, to e.g. undo an import and pick a better candidate.

  • Inbox types have changed. For now we only have preview, auto and bootleg.

  • beets updated to version 2.2.0

  • Implemented our own async pipeline for beets, that is typed and handles our custom sessions (should become obsolete once upstream PRs are merged).

  • Improved library view, and track preview / streaming.

  • Improved candidate preview, including cover art and asis details (current metadata).

  • Terminal now has a bit of scroll-back and history.

  • Much better test coverage.

  • Now using py2ts to automatically generate frontend (typescript) types from their backend (python) equivalents.

  • New and improved logo.

[0.1.1] - 25-06-08ΒΆ

Small version bump with fixes before jumping to 1.0.0.

AddedΒΆ

  • Option to install beets plugins by placing either requirements.txt or startup.sh in /config. cf. Readthedocs

  • Documentation on readthedocs.

  • Option to import Asis via right-click, or as inbox type. Good for Bootlegs that do not have online meta data and you curate manually. Currently also applies --group-albums.

FixedΒΆ

  • Path escaping for right-click import via cli (#51)

0.1.0 - 24-11-13ΒΆ

FixedΒΆ

  • Renamed kind to type in search frontend code to be consistent with backend. Using kind for tags (preview, import, auto), and types for search (album, track).

ChangedΒΆ

  • Improved readme and onboarding experience

  • Mountpoint to persist config files and databases changed to /config (was /home/beetle/.config/beets/) We create the /config/beets and /config/beets-flask folders on startup if they do not exist. Library files are placed there, and you can drop a config.yaml either or both of these folders. Settings in /config/beets-flask/config.yaml take precedence over /config/beets/config.yaml. You will need to update your docker-compose!

AddedΒΆ

  • Logo and favicon

  • Image now on docker hub: pspitzner/beets-flask:stable

  • Auto-import: automatically import folders that are added to the inbox if the match is good enough. After a preview, import will start if the match quality is above the configured. Enable via the config.yaml, set the autotag field of a configred inbox folders to "auto".

0.0.4 - 24-10-04ΒΆ

FixedΒΆ

  • Config parsing should now work

AddedΒΆ

  • multi-disc albums are now supported

  • Interactive import using a custom beets pipeline

ChangedΒΆ

  • Moved terminal to its own page, had to temporarily remove keyboard trigger

  • Reworked the album folder detection algorithm, now uses more native beets code and is a bit faster

  • Navbar styling and items overhaul

0.0.3 - 24-08-01ΒΆ

FixedΒΆ

  • default config: mandatory fields cannot be set in the yaml, or they might persist although the user sets them. moved to config loading in python.

  • tmux session now restarts on page load if it is not alive.

  • navbar, tags, inbox are now more friendly for mobile

  • folder paths are now better escaped for terminal imports

AddedΒΆ

  • Backend to get cover art from metadata of music files.

  • Impoved library view (mobile friendly, and a browser header component)

  • Library search

ChangedΒΆ

  • Simplified folder structure of frontend

  • Removed include_paths option from config and library backend (most of the frontend needs some form of file paths. thus, the option was not / could not be respected consistently)

0.0.2 - 24-07-16ΒΆ

FixedΒΆ

  • ESLint errors and Github action

  • Now loading the default config

0.0.1 - 24-05-22ΒΆ

  • initial commit