Skip to content

Releases: linuxserver/docker-beets

nightly-72b4c771-ls252

22 Mar 20:14
18ba12e

Choose a tag to compare

Pre-release

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_sort and artist_credit / artists_credit fields have not
    been synchronised.
  • Fix overwrite_null configuration which was previously ignored for
    fields defined in autotag/__init__.py::SPECIAL_FIELDS.

Updates

  • Move metadata application logic into Match objects: add
    Match.apply_metadata, AlbumMatch.apply_metadata,
    AlbumMatch.apply_album_metadata, and TrackMatch.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 Info and subclasses:
  • Info.type class property and nullable_fields for per-type
    'overwrite_null' config.
  • Info.raw_data and Info.item_data computed properties to apply
    artist_credit rules, filter nulls, and map media-specific field names.
  • AlbumInfo and TrackInfo extend raw_data/item_data behavior to
    handle album/track specifics (date zeroing, tracktotal,
    mb_releasetrackid, per-disc numbering).
  • Introduce TrackInfo.merge_with_album to merge track-level data with
    album-level fallback for a final item payload.
  • Move correct_list_fields to hooks.py and update it to keep
    unmapped / non-media single/list fields in sync (artist <->
    artists, albumtype <-> albumtypes, etc.).
  • Wire changes through the codebase:
  • Pass Item objects into TrackMatch in match.tag_item to enable
    item-level metadata application.
  • Replace calls to removed autotag apply functions with
    Match.apply_metadata invocations in beets/importer/tasks.py,
    beetsplug/bpsync.py, and beetsplug/mbsync.py.
  • Update importer logic to set album artist fallbacks for albumartists
    / mb_albumartistids when missing.
  • Add and update tests:
  • New test/autotag/test_hooks.py and test/autotag/test_match.py to
    validate new data mapping, list field synchronization, overwrite
    behavior, and assignment logic.

2.7.1-ls319

20 Mar 19:23
542dc9f

Choose a tag to compare

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

22 Mar 04:14
74bbc10

Choose a tag to compare

Pre-release

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

21 Mar 18:27
74bbc10

Choose a tag to compare

Pre-release

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

20 Mar 19:23
74bbc10

Choose a tag to compare

Pre-release

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() and get_layout_method() in
    beets.util.layout so layout selection (column vs newline) is
    handled in one place.
  • Replaced Side from a mutable TypedDict with an immutable
    NamedTuple that 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.py ShowChange to call
    get_layout_lines() directly and removed duplicate per-class
    layout-selection logic.
  • Updated tracklist width calculation to use Side helpers and explicit
    width assignment via _replace(width=...).
  • Reworked ShowChange tests into snapshot-style assertions for both
    newline and column layouts, 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

20 Mar 19:36
74bbc10

Choose a tag to compare

Pre-release

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 strings
  • color — threshold-based ColorName derived from the distance value
  • string — colorized similarity percentage

Match gains two properties:

  • disambig_string — formatted comma-separated disambiguation string
  • base_disambig_data — override point for subclass-specific field
    pre-processing (e.g. media for AlbumMatch,
    index/track_alt/album for TrackMatch)

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.py and session.py become thinner; no shared utility
    functions to keep in sync

nightly-fd0760f4-ls250

16 Mar 19:51
ea0586f

Choose a tag to compare

Pre-release

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

17 Mar 08:45
ea0586f

Choose a tag to compare

Pre-release

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_count populated by
    lastimport must be migrated manually — automatic migration is not
    possible due to the field name clash. Users are instructed to run beet modify lastfm_play_count='$play_count'.

nightly-4b9cff3e-ls250

16 Mar 08:07
ea0586f

Choose a tag to compare

Pre-release

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_changes signature tightened: The old parameter 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

16 Mar 21:33
ea0586f

Choose a tag to compare

Pre-release

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 to cmd /c start "".
  • Add regression test for interactive_open() with the Windows fallback
    command.
  • Add regression test for beet config -e on simulated Windows with no
    editor env vars.
  • Add changelog entry under Unreleased bug fixes.