Skip to content

Releases: linuxserver/docker-beets

2.10.0-ls327

24 Apr 19:29
9320a9b

Choose a tag to compare

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

24 Apr 19:28
1619c62

Choose a tag to compare

Pre-release

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

23 Apr 11:58
e981596

Choose a tag to compare

Pre-release

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

22 Apr 22:43
e981596

Choose a tag to compare

Pre-release

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

23 Apr 20:08
e981596

Choose a tag to compare

Pre-release

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

21 Apr 21:42
b1fe91e

Choose a tag to compare

Pre-release

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_duplicates now operates at the album level and
    explicitly deletes album art files from disk when removing duplicate
    albums during import.
  • Album.set_art now 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".
  • SingletonImportTask gets its own remove_duplicates override
    preserving the original item-level behavior, since find_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

21 Apr 19:07
b1fe91e

Choose a tag to compare

Pre-release

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
    NULL rows (avoids unnecessary work) and wraps each path value with
    os.fsencode() before passing it to normalize_path_for_db(). This
    ensures TEXT paths are coerced to bytes before the update, matching
    the expected storage format.
  • test_migrations.py: The migration test now inserts both a
    bytes path and a str path, asserting both are correctly migrated to
    relative bytes posix 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

19 Apr 19:48
1ae80bb

Choose a tag to compare

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

20 Apr 16:58
66bf953

Choose a tag to compare

Pre-release

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

20 Apr 20:40
66bf953

Choose a tag to compare

Pre-release

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
  • candidate and item_candidates lookup
  • 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