Releases: linuxserver/docker-beets
nightly-10e13c99-ls292
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
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.pywithPF_KEY_DEFAULT,
PF_KEY_QUERIES, andget_path_formats(subview). - Added
Library.path_formatsandLibrary.replacementsas
cached_propertyvalues derived from config. - Removed UI-owned
get_path_formats/get_replacementsand simplified
_open_library()to constructLibrarywithout 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
pathsdefaults by iterating config via Confuse
items(). - Reduces duplication in convert destination handling.
nightly-05011323-ls291
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
beetsplugships 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
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
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
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
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
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
Album._type(artists)returnsDEFAULT(artists is not an Album
fixed field), soAlbum._parsereturns a plain string.- When
Album.store()propagates to items,
MULTI_VALUE_DSV.normalize(value)falls through tomodel_type(value)
=list(value), splitting the string into characters.
Fix
DelimitedString.normalize(types.py): Handle string input by
parsing it (splitting by delimiter if present) instead oflist(). This
prevents character-level splitting.Model._type(db.py): Fall back to the related models field
definitions so multi-value types (e.g.MULTI_VALUE_DSVforartists)
are recognized on both Album and Item models.
nightly-c9df7a94-ls288
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:
- real missing attr in a
cached_propertybody surfaces as
RuntimeErrornaming the missing field - the
RuntimeError.__cause__is the originalAttributeError - a plain missing attr on an
AttrDictstill raisesAttributeError - 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
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 frombeets.dbcore.sortinstead
ofbeets.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.