Releases: linuxserver/docker-beets
nightly-72b4c771-ls252
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-72b4c771-ls252/index.html
LinuxServer Changes:
Full Changelog: nightly-03b1ab01-ls251...nightly-72b4c771-ls252
Remote Changes:
Simplify tagging (#6165)
Refactor item tagging and fix several underlying issues.
Fixes
- Synchronise all artist list fields. Notably,
artist_sort/
artists_sortandartist_credit/artists_creditfields have not
been synchronised. - Fix
overwrite_nullconfiguration which was previously ignored for
fields defined inautotag/__init__.py::SPECIAL_FIELDS.
Updates
- Move metadata application logic into
Matchobjects: add
Match.apply_metadata,AlbumMatch.apply_metadata,
AlbumMatch.apply_album_metadata, andTrackMatch.apply_metadata;
callers now use those methods instead of legacy free functions. - Remove legacy functions from
beets.autotag.__init__
(apply_item_metadata,apply_album_metadata,apply_metadata) and
related globals (SPECIAL_FIELDS,log), and export only core types
(AlbumInfo,AlbumMatch,TrackInfo,TrackMatch,Proposal,
Recommendation,tag_album,tag_item). - Add structured metadata facilities to
Infoand subclasses: Info.typeclass property andnullable_fieldsfor per-type
'overwrite_null' config.Info.raw_dataandInfo.item_datacomputed properties to apply
artist_creditrules, filter nulls, and map media-specific field names.AlbumInfoandTrackInfoextendraw_data/item_databehavior to
handle album/track specifics (date zeroing,tracktotal,
mb_releasetrackid, per-disc numbering).- Introduce
TrackInfo.merge_with_albumto merge track-level data with
album-level fallback for a final item payload. - Move
correct_list_fieldstohooks.pyand update it to keep
unmapped / non-media single/list fields in sync (artist<->
artists,albumtype<->albumtypes, etc.). - Wire changes through the codebase:
- Pass
Itemobjects intoTrackMatchinmatch.tag_itemto enable
item-level metadata application. - Replace calls to removed
autotagapply functions with
Match.apply_metadatainvocations inbeets/importer/tasks.py,
beetsplug/bpsync.py, andbeetsplug/mbsync.py. - Update importer logic to set album artist fallbacks for
albumartists
/mb_albumartistidswhen missing. - Add and update tests:
- New
test/autotag/test_hooks.pyandtest/autotag/test_match.pyto
validate new data mapping, list field synchronization, overwrite
behavior, and assignment logic.
2.7.1-ls319
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/2.7.1-ls319/index.html
LinuxServer Changes:
Full Changelog: 2.7.1-ls318...2.7.1-ls319
Remote Changes:
Updating PIP version of beets to 2.7.1
nightly-da7714ae-ls251
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-da7714ae-ls251/index.html
LinuxServer Changes:
No changes
Remote Changes:
Add feature to exclude albums/songs during auto import (#6452)
Fixes #3523.
nightly-b09801b2-ls251
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-b09801b2-ls251/index.html
LinuxServer Changes:
No changes
Remote Changes:
docs: Update links to pipx installation guide (#6454)
The old link now responds
with 404.
nightly-1943b145-ls251
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-1943b145-ls251/index.html
LinuxServer Changes:
Full Changelog: nightly-0dd6df84-ls250...nightly-1943b145-ls251
Remote Changes:
Refactor of layout utils (#6442)
This PR refactors import-match layout rendering by centralizing layout
selection and line generation in beets.util.layout, simplifying the
ShowChange display path, and tightening the layout
data model.
What Changed
- Added
get_layout_lines()andget_layout_method()in
beets.util.layoutso layout selection (columnvsnewline) is
handled in one place. - Replaced
Sidefrom a mutableTypedDictwith an immutable
NamedTuplethat exposes derived helpers (rendered, prefix/suffix
widths, and rendered width). - Simplified
split_into_lines()from a 3-width tuple API to
(first_width, width)and removed legacy last-line empty-string
handling. - Refactored
beets.ui.commands.import_/display.pyShowChangeto call
get_layout_lines()directly and removed duplicate per-class
layout-selection logic. - Updated tracklist width calculation to use
Sidehelpers and explicit
width assignment via_replace(width=...). - Reworked
ShowChangetests into snapshot-style assertions for both
newlineandcolumnlayouts, and updated util layout tests to the new
split_into_lines()signature.
Why
- Reduces duplicated wrapping/layout logic across UI code paths.
- Makes layout behavior easier to reason about and test at the utility
boundary. - Narrows the display layer to orchestration while keeping
transformation/rendering logic in reusable utilities. - Improves maintainability by moving from loosely typed dict mutation to
a typed, self-describing data structure.
nightly-03b1ab01-ls251
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-03b1ab01-ls251/index.html
LinuxServer Changes:
No changes
Remote Changes:
Refactor dist display (#6444)
Refactor: Move display logic into Distance and Match as
properties
Display-related logic previously scattered across display.py and
session.py is consolidated into the data classes themselves.
What changed
Distance gains three properties:
penalties— list of cleaned-up penalty key stringscolor— threshold-basedColorNamederived from the distance valuestring— colorized similarity percentage
Match gains two properties:
disambig_string— formatted comma-separated disambiguation stringbase_disambig_data— override point for subclass-specific field
pre-processing (e.g.mediaforAlbumMatch,
index/track_alt/albumforTrackMatch)
display.py / session.py: Standalone functions dist_string,
dist_colorize, penalty_string, disambig_string,
get_album_disambig_fields, get_singleton_disambig_fields are
removed. Call sites now use the properties directly.
A minor fix in show_match_header collects output into a list and uses
textwrap.indent for a single ui.print_ call, replacing the previous
per-line prints.
Impact
- Display logic lives next to the data it describes — easier to find,
easier to test display.pyandsession.pybecome thinner; no shared utility
functions to keep in sync
nightly-fd0760f4-ls250
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-fd0760f4-ls250/index.html
LinuxServer Changes:
No changes
Remote Changes:
play: Add -R/--randomize option to play plugin (#6424)
I really wanted to combine random with play to shuffle tracks in a
temporary playlist, but couldn't find easy way to do it. I'd like to
introduce a new flag -R / --randomize to the play plugin to shuffle
tracks before passing them to the player.
I couldn't really decide between -r and -R, not sure if there's any
rule there. If you believe lower case would be better, just let me know.
nightly-9a7a0b93-ls250
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-9a7a0b93-ls250/index.html
LinuxServer Changes:
No changes
Remote Changes:
Rename play_count -> lastfm_play_count in lastimport due to clash with mpdstats (#6443)
lastimport: Rename play_count field to lastfm_play_count
Renames the flexible field written by the lastimport plugin from
play_count to lastfm_play_count to avoid a silent collision with the
same-named field written by the mpdstats plugin.
Impact
- Breaking change: existing databases with
play_countpopulated by
lastimportmust be migrated manually — automatic migration is not
possible due to the field name clash. Users are instructed to runbeet modify lastfm_play_count='$play_count'.
nightly-4b9cff3e-ls250
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-4b9cff3e-ls250/index.html
LinuxServer Changes:
No changes
Remote Changes:
Fixups after utils move (#6446)
Key changes
get_model_changessignature tightened: Theoldparameter is no
longer optional — callers must pass an explicit model. The
None-fallback logic (old or new.get_fresh_from_db()) is pushed up to
show_model_changes, which is the appropriate place for that default
behaviour.- Changelog updated: Plugin developers are notified to update their
imports.
nightly-4b934138-ls250
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-4b934138-ls250/index.html
LinuxServer Changes:
No changes
Remote Changes:
Fix Windows fallback for beet config -e when no editor is set (#6445)
Fixes #6436.
On Windows, beet config -e falls back to open_anything() when
VISUAL/EDITOR are unset. That fallback returned start, but start
is a cmd.exe builtin (not an executable), so os.execlp() raised
FileNotFoundError.
This changes the Windows fallback command to cmd /c start "" so the
builtin is invoked via the shell and file opening works as intended.
Changes
- Update
open_anything()Windows fallback tocmd /c start "". - Add regression test for
interactive_open()with the Windows fallback
command. - Add regression test for
beet config -eon simulated Windows with no
editor env vars. - Add changelog entry under Unreleased bug fixes.