Skip to content

Releases: linuxserver/docker-beets

nightly-10e13c99-ls292

29 May 10:55
40d9ec9

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-10e13c99-ls292/index.html

LinuxServer Changes:

Full Changelog: nightly-05011323-ls291...nightly-10e13c99-ls292

Remote Changes:

Moved PytestPluginTestHelper class into test_helper. (#6658)

This PR moved the PytestPluginTestHelper which was duplicated in quite
a few test files into the beets/test/helper.py file.

nightly-0600d4ea-ls291

24 May 14:41
d2f3c13

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-0600d4ea-ls291/index.html

LinuxServer Changes:

Full Changelog: nightly-26ab08bf-ls290...nightly-0600d4ea-ls291

Remote Changes:

Move path formats and replacements logic into Library and shared util (#6647)

This PR moves path format and replacement retrieval out of beets.ui
into library/shared utilities.

Changes

  • Added beets/util/pathformats.py with PF_KEY_DEFAULT,
    PF_KEY_QUERIES, and get_path_formats(subview).
  • Added Library.path_formats and Library.replacements as
    cached_property values derived from config.
  • Removed UI-owned get_path_formats/get_replacements and simplified
    _open_library() to construct Library without passing those values.
  • Updated consumers (beets/library/models.py, beetsplug/bench.py,
    beetsplug/convert.py) to use the shared path-format utility.
  • Refactored convert destination path calls through
    ConvertPlugin.get_item_destination.
  • Replaced redundant UI tests with focused coverage in
    test/util/test_pathformats.py.
  • Updated .git-blame-ignore-revs.

Why

  • Keeps path/replacement behavior close to library internals instead of
    CLI orchestration.
  • Preserves layered paths defaults by iterating config via Confuse
    items().
  • Reduces duplication in convert destination handling.

nightly-05011323-ls291

27 May 20:04
d2f3c13

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-05011323-ls291/index.html

LinuxServer Changes:

No changes

Remote Changes:

Add py typed to beetsplug (#6670)

PR Summary

This change adds beetsplug/py.typed to mark beetsplug as a typed
Python package under PEP 561.

High-level impact

  • Tells type checkers that beetsplug ships type information.
  • Improves typing support for code that imports beetsplug (for
    example, beetcamp).
  • Has no runtime or architecture changes beyond package metadata.

2.11.0-ls332

22 May 20:32
af6c2fc

Choose a tag to compare

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/2.11.0-ls332/index.html

LinuxServer Changes:

Full Changelog: 2.11.0-ls331...2.11.0-ls332

Remote Changes:

Updating PIP version of beets to 2.11.0

nightly-da16db11-ls290

22 May 13:36
6ba54fc

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-da16db11-ls290/index.html

LinuxServer Changes:

Full Changelog: nightly-6dd62516-ls289...nightly-da16db11-ls290

Remote Changes:

docs: adding beets-getlrc to the 'other plugins' list (#6664)

Description

I added a plugin i made to the docs (index.rst). I made sure to add a
link to my github repo for the project. Nothing else was changed.

nightly-96575856-ls290

23 May 23:51
6ba54fc

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-96575856-ls290/index.html

LinuxServer Changes:

No changes

Remote Changes:

library: include path and reason in ReadError/WriteError messages (#6645)

ReadError.__str__ and WriteError.__str__ put super() straight into
an f-string, so a failed read or write printed error reading <super: <class 'ReadError'>, <ReadError object>> and the actual path and reason
were lost. Calling super().__str__() returns the FileOperationError
message with the path and underlying reason. The reported beet import
case now logs the file path and the failure reason.

Fixes #6560.

nightly-26ab08bf-ls290

24 May 01:58
6ba54fc

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-26ab08bf-ls290/index.html

LinuxServer Changes:

No changes

Remote Changes:

listenbrainz: add option to import listens from ListenBrainz data export zip (#6606)

Since importing listens from the API is rather slow and puts unnecessary
load on the servers, importing a dump exported from
https://listenbrainz.org/settings/export/ should also be possible. This
change introduces the export-file parameter to the lbimport command,
which takes all listens from the zipfile to update the play counts.

I also fixed an issue where mbid_mapping could be None if explicitly
set to null in the JSON (which happens for these exports sometimes),
and changed the recording mbid logic to prefer one explicitly supplied
by the player in the additional_data, instead of relying on the
(sometimes inaccurate) mapper.

Since the --max parameter isn't documented either, I'm unsure whether
I should add the parameter to the plugin docs. In theory, the --help
parameter already tells you enough.

I'm also not sure if the --max parameter should apply to exported
files, especially since the order of zip file entries isn't
deterministic.

nightly-6dd62516-ls289

21 May 16:48
7b5661a

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-6dd62516-ls289/index.html

LinuxServer Changes:

Full Changelog: nightly-4746d852-ls288...nightly-6dd62516-ls289

Remote Changes:

Fix album modify splitting multi-value field strings into individual characters (#6653)

Fixes #5690

Problem

When running beet mod -a artists=Charli XCX in album mode, the
artists tag value gets split into individual characters on disk. Item
mode (beet mod without -a) works correctly.

Root Cause

  1. Album._type(artists) returns DEFAULT (artists is not an Album
    fixed field), so Album._parse returns a plain string.
  2. When Album.store() propagates to items,
    MULTI_VALUE_DSV.normalize(value) falls through to model_type(value)
    = list(value), splitting the string into characters.

Fix

  1. DelimitedString.normalize (types.py): Handle string input by
    parsing it (splitting by delimiter if present) instead of list(). This
    prevents character-level splitting.
  2. Model._type (db.py): Fall back to the related models field
    definitions so multi-value types (e.g. MULTI_VALUE_DSV for artists)
    are recognized on both Album and Item models.

nightly-c9df7a94-ls288

20 May 02:19
578b840

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-c9df7a94-ls288/index.html

LinuxServer Changes:

No changes

Remote Changes:

fix(hooks): chain original error when cached_property AttrDict lookup fails (#6558) (#6564)

Fixes #6558.

Problem

When a cached_property on an AttrDict subclass raises
AttributeError during its own computation, Python's attribute lookup
falls back to __getattr__ with the property's own name. That masks the
real missing field behind a misleading traceback like:

AttributeError: 'AlbumInfo' object has no attribute 'raw_data'

…even though raw_data exists on the instance and the code inside
raw_data is what blew up on a missing sibling attribute. Users and
maintainers hit this both on #6558 and on the earlier #6503 / #6506
reports (different metadata providers, same masking shape).

Fix

In AttrDict.__getattr__, if the looked-up class attribute is a
cached_property, invoke it explicitly. If it raises AttributeError,
re-raise as RuntimeError with from exc so the original cause is
preserved on the traceback and names the attribute that actually failed.

Plain missing-attribute behaviour (obj.nope on an AttrDict) is
unchanged — that still raises AttributeError as before.

Tests

Added a regression class TestAttrDictCachedPropertyMasking in
test/autotag/test_hooks.py covering:

  1. real missing attr in a cached_property body surfaces as
    RuntimeError naming the missing field
  2. the RuntimeError.__cause__ is the original AttributeError
  3. a plain missing attr on an AttrDict still raises AttributeError
  4. existing dict-key access (obj.title) still works

Full test/autotag/test_hooks.py suite: 90 passed locally.

Follow-up

Picked approach (1) from @snejus' comment on #6558
(beetbox/beets#6558 (comment)).
Happy to iterate on the exception type or wording.

nightly-4746d852-ls288

19 May 22:18
578b840

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-4746d852-ls288/index.html

LinuxServer Changes:

Full Changelog: nightly-aa33b1cb-ls287...nightly-4746d852-ls288

Remote Changes:

core/structure: create a separate module for sorting in dbcore (#6644)

This PR moves all sorting-related classes from beets.dbcore.query into
a new dedicated module, beets.dbcore.sort. All references and imports
throughout the codebase and tests are updated to use the new module. No
functional changes are introduced - this is a mechanical refactor to
improve code organization and separation of concerns.

High-level impact:

  • Sorting logic is now isolated in beets.dbcore.sort, making the
    architecture clearer.
  • All code using sort classes (e.g., Sort, FixedFieldSort,
    MultipleSort, etc.) now imports them from beets.dbcore.sort instead
    of beets.dbcore.query.
  • No changes to public APIs or behavior; only import paths and module
    boundaries are affected.

This change lays groundwork for future maintainability and makes the
codebase easier to navigate for contributors.