Releases: linuxserver/docker-beets
2.10.0-ls327
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/2.10.0-ls327/index.html
LinuxServer Changes:
Full Changelog: 2.10.0-ls326...2.10.0-ls327
Remote Changes:
Updating PIP version of beets to 2.10.0
nightly-8a82a92a-ls275
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-8a82a92a-ls275/index.html
LinuxServer Changes:
Full Changelog: nightly-8a82a92a-ls274...nightly-8a82a92a-ls275
Remote Changes:
library: add subtitle (id3 TIT3) field (#5696)
Adds support for a subtitle field, corresponding to the TIT3 id3 tag.
Requires beetbox/mediafile#82
nightly-baffb341-ls274
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-baffb341-ls274/index.html
LinuxServer Changes:
No changes
Remote Changes:
Fix labeler config (#6574)
Fix labeler regex patterns to use OR matching
Consolidates duplicate label-matching rules in .github/labeler.yaml.
Each plugin label previously used two separate regex patterns — one
matching "<name> plugin" and one matching "<name>:" — which the
labeler config ANDs together, requiring both patterns to match
simultaneously.
Each pair is replaced with a single regex using a non-capturing group,
e.g. /convert(?: plugin|:)/i, so either suffix correctly triggers the
label.
Note I tested this issue under the following pr:
beetbox/beets#6573. See the changes timeline.
nightly-a35bb419-ls274
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-a35bb419-ls274/index.html
LinuxServer Changes:
Full Changelog: nightly-7edf27bf-ls273...nightly-a35bb419-ls274
Remote Changes:
Regression: #6547 main needs default (#6571)
Fix regression error from #6547.
Default value None is needed for main function, was removed
accidentally.
nightly-8a82a92a-ls274
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-8a82a92a-ls274/index.html
LinuxServer Changes:
No changes
Remote Changes:
library: add subtitle (id3 TIT3) field (#5696)
Adds support for a subtitle field, corresponding to the TIT3 id3 tag.
Requires beetbox/mediafile#82
nightly-e5504825-ls273
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-e5504825-ls273/index.html
LinuxServer Changes:
No changes
Remote Changes:
Replace old cover art instead of creating suffixed new entries / fetchart (#6554)
Summary
- Fix duplicate album art files (
cover.2.jpg,cover.3.jpg, ...)
accumulating when re-importing albums with the fetchart plugin enabled. ImportTask.remove_duplicatesnow operates at the album level and
explicitly deletes album art files from disk when removing duplicate
albums during import.Album.set_artnow unconditionally removes old art and any existing
file at the destination, instead of appending a numeric suffix via
unique_path. This matches the method's documented behavior of
"replacing any existing art".SingletonImportTaskgets its ownremove_duplicatesoverride
preserving the original item-level behavior, sincefind_duplicates
returns items (not albums) for singletons.
Root cause
Two issues contributed to the bug:
1. remove_duplicates never deleted album art files.
When a user imports a duplicate album and chooses "Remove old",
remove_duplicates iterated over items and called item.remove(). When
the last item was removed, this cascaded to
Album.remove(delete=False), which skipped art deletion due to
delete=False. The old cover.jpg remained on disk as an orphan.
2. set_art created unique paths instead of replacing.
set_art only removed the old art file when oldart == artdest (exact
byte equality). When oldart was None (new album, no inherited
artpath) or pointed to a different path (e.g. different extension), the
existing file was left in place and unique_path generated
cover.2.jpg.
Fixes #6205
nightly-7edf27bf-ls273
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-7edf27bf-ls273/index.html
LinuxServer Changes:
Full Changelog: nightly-406db7cc-ls272...nightly-7edf27bf-ls273
Remote Changes:
Handle TEXT path values when migrating to relative paths (#6562)
Handle TEXT paths in library path migration
Fixes a crash during library migration for users who manually edited
their beets SQLite database and stored item or album-art paths as TEXT
instead of BLOB/bytes.
Changes
migrations.py: The relative-to-portable path migration now skips
NULLrows (avoids unnecessary work) and wraps each path value with
os.fsencode()before passing it tonormalize_path_for_db(). This
ensuresTEXTpaths are coerced tobytesbefore the update, matching
the expected storage format.test_migrations.py: The migration test now inserts both a
bytespath and astrpath, asserting both are correctly migrated to
relativebytesposix paths.
Impact
Low-risk, targeted fix. No changes to the happy path for users with
well-formed databases — os.fsencode() on bytes is a no-op, so
existing behaviour is preserved.
Fixes: #6561
2.10.0-ls326
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/2.10.0-ls326/index.html
LinuxServer Changes:
Full Changelog: 2.9.0-ls325...2.10.0-ls326
Remote Changes:
Updating PIP version of beets to 2.10.0
nightly-c9cee0d1-ls272
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-c9cee0d1-ls272/index.html
LinuxServer Changes:
No changes
Remote Changes:
fromfilename: Support 'track' prefix when parsing track number (#6557)
fromfilename: Support "track" prefix in track number parsing
The fromfilename plugin's filename-matching regex is extended to
recognise filenames like track01.m4a or track 2.m4a, where a literal
"track" prefix precedes the track number.
nightly-b13a4fa7-ls272
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-b13a4fa7-ls272/index.html
LinuxServer Changes:
No changes
Remote Changes:
Tidal Metadata Plugin (#6520)
Description
This PR introduces tidal as metadatasource. It add both an minimal api
layer and the typical metadata source plugin capabilities.
Details
The implementation provides a small API layer consisting of TidalAPI
for high-level album and track fetching, and TidalSession which
extends requests.Session with token authentication, automatic rate
limiting (~4 req/s via RateLimitAdapter), and pagination resolution
following the JSON:API spec.
Authentication is handled through an OAuth2 PKCE flow accessible via
beet tidal --auth, with automatic token refresh when the access token
expires.
Metadata parsing handles Tidal's JSON:API response format, extracting
album and track information including ISO 8601 duration conversion,
artist relationships, and copyright/label data.
Input wanted
The API layer currently lacks comprehensive test coverage. Setting up
proper tests would require either mocking all outgoing requests or
creating a dedicated test token (which necessitates an account and might
require read/write to github secrets).
Are we comfortable with the current approach of unit testing the plugin
itself while mocking all requests?
TODOs
- Documentation
-
candidateanditem_candidateslookup - It should be possible to optimize batched lookups
- Add tests for candidates and item_candidates
- Implement batching for more than 20 filters
Refs
thanks to @jcjordyn130 for his initial implementations in #5637 and
#4641