Releases: linuxserver/docker-beets
nightly-8b3f1fb5-ls293
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-8b3f1fb5-ls293/index.html
LinuxServer Changes:
No changes
Remote Changes:
refactor: Pytest based setup for test_library (#6677)
Description
This PR is a refactor of test/test_library.py and replaces the unitest
test cases with a pytest setup. Also replaced capture_log with caplog
fixture.
Needs rebasing after beetbox/beets#6659 is
merged.
TODOs:
-
ChangelogNot needed as this is an internal refactor only
This is related to the multi-step efforts to improve logging in beets
beetbox/beets#6553
nightly-52a7ba68-ls293
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-52a7ba68-ls293/index.html
LinuxServer Changes:
Full Changelog: nightly-10e13c99-ls292...nightly-52a7ba68-ls293
Remote Changes:
spotify: batch spotifysync DB commit (#6673)
This is a follow-up to #6485. Currently spotifysync:
- batches Spotify HTTP requests, but still stores each item individually
- writes to the DB before writing tags
- logs Audio features API unavailable, skipping once per remaining item
after a 403
This makes logs noisy and causes unnecessary DB commit overhead.
This PR :
- keeps the existing batched Spotify API fetches
- batches
spotifysyncdatabase persistence into a single outer DB
transaction per run - aligns
spotifysyncwith the normal beets write-before-store pattern - suppresses repeated per-item audio-features unavailability log spam
Actual logs before fix (masked):
$ beet -v spotifysync -f album:"ALBUM"
...
spotify: Total 5 tracks
spotify: Processing 1/5 tracks - <Album A> - <Track 1>
spotify: Processing 2/5 tracks - <Album A> - <Track 2>
spotify: Processing 3/5 tracks - <Album A> - <Track 3>
spotify: Processing 4/5 tracks - <Album A> - <Track 4>
spotify: Processing 5/5 tracks - <Album A> - <Track 5>
spotify: Audio features API is unavailable (403 error). Skipping audio features for remaining tracks.
spotify: Audio features API unavailable, skipping
Sending event: database_change
Sending event: write
Sending event: after_write
spotify: Audio features API unavailable, skipping
Sending event: database_change
Sending event: write
Sending event: after_write
spotify: Audio features API unavailable, skipping
Sending event: database_change
Sending event: write
Sending event: after_write
spotify: Audio features API unavailable, skipping
Sending event: database_change
Sending event: write
Sending event: after_write
spotify: Audio features API unavailable, skipping
Sending event: database_change
Sending event: write
Sending event: after_writeLogs after fix (masked)):
$ beet -v spotifysync -f album:"ALBUM"
...
spotify: Total 5 tracks
spotify: Processing 1/5 tracks - <Album A> - <Track 1>
spotify: Processing 2/5 tracks - <Album A> - <Track 2>
spotify: Processing 3/5 tracks - <Album A> - <Track 3>
spotify: Processing 4/5 tracks - <Album A> - <Track 4>
spotify: Processing 5/5 tracks - <Album A> - <Track 5>
spotify: Audio features API is unavailable (403 error). Skipping audio features for remaining tracks.
Sending event: write
Sending event: after_write
Sending event: write
Sending event: after_write
Sending event: write
Sending event: after_write
Sending event: write
Sending event: after_write
Sending event: write
Sending event: after_write
Sending event: database_change
Sending event: database_change
Sending event: database_change
Sending event: database_change
Sending event: database_change- Changelog. (Add an entry to
docs/changelog.rstto the bottom of
one of the lists near the top of the document.) - Tests. (Very much encouraged but not strictly required.)
2.11.0-ls333
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/2.11.0-ls333/index.html
LinuxServer Changes:
Full Changelog: 2.11.0-ls332...2.11.0-ls333
Remote Changes:
Updating PIP version of beets to 2.11.0
nightly-2efc80bc-ls292
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-2efc80bc-ls292/index.html
LinuxServer Changes:
No changes
Remote Changes:
fetchart: catch OSError in _set_art for graceful permission error handling (#6662)
## Problem
When fetchart moves album art to the destination folder, a
PermissionError
(or other OSError) can crash beets with an unhandled traceback. This
happens
when a file is locked by another process, such as foobar2000 scanning
the folder
during import.
Example traceback from #6193:
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process
Fix
Wrap album.set_art() in a try/except OSError block inside
_set_art.
On failure, log a warning and return False instead of crashing. The
batch_fetch_art CLI path now checks the return value and reports
"error writing album art" instead of a traceback.
Changes
beetsplug/fetchart.py:_set_artnow returnsbool; catches
OSErrorwith a warning logtest/plugins/test_fetchart.py: new test
test_set_art_oserror_is_handled_gracefullyverifies graceful handling
whenAlbum.set_artraisesPermissionErrordocs/changelog.rst: bug fix entry added
Fixes #6193
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.