Releases: linuxserver/docker-beets
nightly-a02a896d-ls301
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-a02a896d-ls301/index.html
LinuxServer Changes:
No changes
Remote Changes:
tests: replace function-scoped helper fixtures with TestHelper (#6709)
- Test setup was consolidated into shared helper classes instead of
using localhelperfixtures. test/library/test_migrations.pynow usesMigrationTestHelperto
provide one common migration harness, with each test class defining only
the legacy state and migration it needs.- Plugin tests in
test/plugins/test_fuzzy.py,
test/plugins/test_missing.py, and
test/plugins/utils/test_playcount.pynow rely on shared helpers like
PluginTestHelperandTestHelperfor common setup.
Note: I kept these fixtures in these files
test_query.pyplugins/test_random.pyplugins/test_aura.pyplugins/test_lyrics.py
because they intentionally use a higher scope, for example in
test_query.py:
@pytest.fixture(scope="class")
def helper():
helper = TestHelper()
helper.setup_beets()
yield helper
helper.teardown_beets()Using this setup pattern in test_query.py significantly improved
testing durations.
Architecture impact
- Test infrastructure now follows a clearer base-class pattern for
shared setup. - Migration tests cleanly separate 'prepare old state' from 'run
migration and verify result'. - Plugin tests now use the same setup path, which makes new tests easier
to add and keeps test structure more consistent across files.
High-level outcome
- Less duplicated fixture boilerplate.
- More consistent and easier-to-read test architecture.
- Tests stay focused on behavior being verified, which should make
maintenance and future extension simpler.
nightly-7e71c668-ls301
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-7e71c668-ls301/index.html
LinuxServer Changes:
Full Changelog: nightly-cb564a6e-ls300...nightly-7e71c668-ls301
Remote Changes:
importer: improve handling of duplicates (#6702)
This change centralizes duplicate handling in the import pipeline.
ImportTasknow carries a singleduplicate_actionstate instead of
separate duplicate flags, so duplicate decisions are represented in one
place.ImportSession.get_duplicate_action()becomes the shared entry point
for resolving the configured duplicate policy.TerminalImportSessionnow only prompts the user when the configured
action isASK; otherwise it reuses the shared session logic.- Duplicate resolution in
beets/importer/stages.pyis simplified to
call the session API instead of re-implementing config lookup and
branching.
High-level impact
- Makes duplicate behavior more consistent across importer stages and UI
sessions. - Reduces duplicated logic between core importer flow, terminal
prompting, and test fixtures. - Simplifies future changes to duplicate handling because policy
resolution now lives behind one session-level interface. - Cleans up tests to use real config-driven duplicate behavior instead
of custom fixture-only overrides.
nightly-73605d54-ls301
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-73605d54-ls301/index.html
LinuxServer Changes:
No changes
Remote Changes:
typing: add missing types to beets.importer (#6711)
-
This change tightens typing across the importer pipeline, mainly in
beets.importer.session,beets.importer.stages,
beets.importer.tasks,beets.importer.state, and
beets.util.pipeline. -
Architecturally, it makes the importer's core flow more explicit:
- session methods now declare clear input/output types
-
pipeline stage message types are named and propagated through
Pipeline- task classes expose more precise return values and argument types
-
plugin event dispatch for
import_task_creatednow has a typed
contract -
A small but important part of the change is switching importer config
handling to work withconfuseviews more safely, using.set(...)and
.get(...)instead of replacing values directly. This keeps config
mutation aligned with the config system instead of treating it like a
plain dict. -
There are also a few correctness-oriented fixes uncovered while adding
types, such as: -
keeping byte/string path handling consistent in importer task cleanup
and archive extraction- making nullable values explicit before use
- returning
Nonein places that already behaved that way implicitly
-
High-level impact: no feature change to importer behavior is intended.
The main benefit is a clearer, more strongly typed importer architecture
that is easier to reason about, safer to refactor, and better at
catching edge cases during development.
nightly-cb564a6e-ls300
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-cb564a6e-ls300/index.html
LinuxServer Changes:
Full Changelog: nightly-2337cfb6-ls299...nightly-cb564a6e-ls300
Remote Changes:
refactor: removed capture_log (#6739)
This pull request remove the last remnants of the capture_log
context-manager used previously in the testing module.
This touches:
test_loggingtest_importer
TODOs:
-
ChangelogNot needed as this is an internal refactor only,
will add an entry once all logging related changes are done.
This is related to the multi-step efforts to improve logging in beets
beetbox/beets#6553
nightly-60047dfa-ls299
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-60047dfa-ls299/index.html
LinuxServer Changes:
No changes
Remote Changes:
convert: fix beets.util.pipeline import regression (#6740)
- Use an explicit pipeline import for convert pipeline setup and
decorators. - This fixes AttributeError when beets.util does not automatically
expose pipeline.
See:
$ python -c 'import beetsplug.convert'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/sarunas/repo/beets/beetsplug/convert.py", line 73, in <module>
class ConvertPlugin(BeetsPlugin):
File "/home/sarunas/repo/beets/beetsplug/convert.py", line 402, in ConvertPlugin
@util.pipeline.mutator_stage
AttributeError: module 'beets.util' has no attribute 'pipeline'$ python -c 'from beets import util; print(util.pipeline)'
Traceback (most recent call last):
File "<string>", line 1, in <module>
AttributeError: module 'beets.util' has no attribute 'pipeline'nightly-2337cfb6-ls299
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-2337cfb6-ls299/index.html
LinuxServer Changes:
Full Changelog: nightly-01808922-ls298...nightly-2337cfb6-ls299
Remote Changes:
db: simplify LazyConvertDict (#6734)
- Replaces
LazyConvertDictwithLazyDict, a simplerUserDict-based
container for lazily converted model values. - Removes the separate
_awakenconstruction path and routes
database-loaded values throughModel.__init__, so both normal and
database-backed objects follow the same creation flow. - Centralizes SQL-to-Python conversion in
Model._convert, which makes
value handling easier to reason about and reduces special-case model
initialization logic.
High-level impact
- Simplifies the model storage architecture by reducing custom dict
behavior. - Makes object construction more consistent across the codebase.
- Lowers maintenance risk by keeping lazy conversion in one place while
preserving the existing lazy-loading behavior.
2.11.0-ls335
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/2.11.0-ls335/index.html
LinuxServer Changes:
Full Changelog: 2.11.0-ls334...2.11.0-ls335
Remote Changes:
Updating PIP version of beets to 2.11.0
nightly-ec729d31-ls298
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-ec729d31-ls298/index.html
LinuxServer Changes:
No changes
Remote Changes:
lyrics: add rate limiting and exponential backoff to prevent 429 errors (#6729)
Add a LyricsSession class that mounts RateLimitAdapter (4 req/sec) and
configures urllib3 Retry with exponential backoff on 429 responses. Each
backend instance gets its own session so rate limits apply independently
per API source.
Fixes #6728
nightly-beff630d-ls298
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-beff630d-ls298/index.html
LinuxServer Changes:
No changes
Remote Changes:
refactor(ftintitle): cache config options (#6732)
Pre-factor for beetbox/beets#6726.
Make ftintitle's config @cached_property attributes instead of
passing them through the call stack. Modeled after similar recent
changes in convert.
Changes
- Add cached plugin properties for
auto,drop,format,
keep_in_artist,preserve_album_artist, andcustom_words, keeping
the existing cachedbracket_keywordsproperty I forgot I added a while
back. commands(),imported(),ft_in_title(), andupdate_metadata()
are cleaned up to read these directly.- Don't read
autoduring plugin init; the import stage remains
registered andimported()checksautowhen invoked.
nightly-ad03b35f-ls298
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-ad03b35f-ls298/index.html
LinuxServer Changes:
No changes
Remote Changes:
Fix integration tests (#6724)
This PR tightens the integration test workflow so CI runs the
dependency-heavy checks that are usually skipped in local environments.
What changed
- Install the system packages and Poetry extras needed by
integration-only coverage, including ffmpeg/ffprobe,
ImageMagick/Pillow-backed art resizing, chroma, docs, replaygain,
reflink, lyrics, and related plugin dependencies. - Run
poe docsbeforepoe testin the integration workflow and set
LYRICS_UPDATED=1so lyrics tests are included in CI. - Centralize CI detection in
beets.test.helper.RUNNING_IN_CIand reuse
shared import/program checks across test collection and helpers. - Keep dependency-heavy tests strict in the beetbox GitHub Actions
environment, while skipping them locally when optional tools/modules are
unavailable. - Mark ffprobe-, artresizer-, chroma-, pandoc-, and completion-related
cases with focused availability gates so local test runs fail less often
for missing optional dependencies. - Update docs link-check ignores and stale documentation URLs so
poe check-docs-linksis less noisy in CI.