Releases: linuxserver/docker-beets
nightly-a6af177b-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-a6af177b-ls259/index.html
LinuxServer Changes:
No changes
Remote Changes:
Make sure labels can be added to PRs
nightly-7b0e4e2d-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-7b0e4e2d-ls259/index.html
LinuxServer Changes:
No changes
Remote Changes:
fix(fetchart): sources definition (#6508)
Description
The fetchart plugin would silently drop unknown sources defined in
config, leading to hard to debug problems.
The plugin now errors when an unknown source is configured, or when no
sources are configured.
In addition, a single string is now a valid value for sources to
either enable all sources with an *, or a single source.
Fixes: #6336
nightly-657a3a2e-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-657a3a2e-ls259/index.html
LinuxServer Changes:
No changes
Remote Changes:
fix(deezer): use artist ID to detect Various Artists releases (#6499)
Fixes #4956
The Deezer API apparently uses IP geolocation to return a localized
“Various Artists” name (e.g. “Verschiedene Interpreten” in German),
causing VA releases to match poorly and display the wrong artist name.
This implements the approach suggested by @sampsyo in
beetbox/beets#4956:
detect VA releases using Deezer’s (hopefully) stable various artists ID
(5080) instead of a string comparison, then replace the localized name
with the user’s configured va_name, mirroring what the MusicBrainz
plugin already does with its own VARIOUS_ARTISTS_ID.
nightly-506b45f3-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-506b45f3-ls259/index.html
LinuxServer Changes:
No changes
Remote Changes:
Label issues/prs case-insensitively (#6505)
Make PR label patterns case-insensitive
All label-matching patterns in .github/labeler.yaml are updated to use
the /pattern/i regex syntax, enabling case-insensitive matching.
Before: 'fetchart'
After: '/fetchart/i'
This ensures PRs are correctly labelled regardless of capitalisation in
commit messages or PR titles (e.g., FetchArt, FETCHART, fetchart
all match).
nightly-4e08403d-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-4e08403d-ls259/index.html
LinuxServer Changes:
No changes
Remote Changes:
feat(fetchart): add support for webp files (#6511)
Add support for webp images in the fetchart plugin.
nightly-2dff447e-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-2dff447e-ls259/index.html
LinuxServer Changes:
No changes
Remote Changes:
listenbrainz: Add pagination, play count aggregation, and recording_mbid fix (#6484)
Follow-up to #6471 — fixes three remaining issues with the
listenbrainz plugin:
-
Aggregate listen events into actual play counts. ListenBrainz
returns individual listen events, each mapped toplaycount: 1. Without
aggregation, the finallistenbrainz_play_countis always 1 regardless
of actual listens. -
Paginate through all listens. The API defaults to 25 results per
request. Now fetches up to 1000 per page and loops viamax_tsuntil
all listens are retrieved. -
Use
recording_mbidfrommbid_mappingwhen present. Previously
mbidwas left asNonewhen the mapping existed, falling back to
expensive MB API lookups unnecessarily.Fixes #6469 (remaining issues after #6471)
nightly-29d5fac9-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-29d5fac9-ls259/index.html
LinuxServer Changes:
Full Changelog: nightly-131768b7-ls258...nightly-29d5fac9-ls259
Remote Changes:
feat(chroma): add chromasearch command (#6486)
Add a new command to the chroma plugin: chromasearch.
This command lets user search the database by chromaprint fingerprint
similarity.
Database item fingerprints are computed on the fly if needed. This is
useful for example to check if an unknown / untagged audio file already
exists in the database.
Will update changelog and doc once naming & co are sorted.
nightly-20acca65-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-20acca65-ls259/index.html
LinuxServer Changes:
No changes
Remote Changes:
fix(replaygain): clear conflicting tags on write (#6498)
There are two ways to store replay gain data on music files: RG_ and
R128_ (opus).
Before this change the beets replaygain plugin simply set the right tag
based on file format and r128 config value. there are case, however,
when for example an opus files comes with RG_ tags already set. After
beet write its replaingain tags the files will contain both RG_ and
R128_ tags with possibly conflicting values.
For example, Navidrome currently always prefers RG_ tags over R128_
regardless of format, leading tags set by beets to be ignored.
https://github.com/navidrome/navidrome/blob/23f3556371321faf199866989b906f2ef06a8034/model/metadata/map_mediafile.go#L111
As per RFC 7845: Ogg Encapsulation for the Opus Audio Codec
https://datatracker.ietf.org/doc/html/rfc7845#section-5.2.1
To avoid confusion with multiple normalization schemes, an Opus
comment header SHOULD NOT contain any of the REPLAYGAIN_TRACK_GAIN,
REPLAYGAIN_TRACK_PEAK, REPLAYGAIN_ALBUM_GAIN, or
REPLAYGAIN_ALBUM_PEAK tags, unless they are only to be used in some
context where there is guaranteed to be no such confusion.
Since the replaygain plugin does not support setting both RG_ and R128_
at the same time it doesn't make much sense to keep conflicting tags
when writing. These tags are also easy to recalculate if needed either
with beets itself (with a different configuration), or by running
replaygain commands by hand. no valuable information is lost.
This change makes it so the replagain plugin now deletes conflicting
tags when processing library items:
- RG_ are deleted if we set R128_
- R128_ are deleted if we set RG_
nightly-137c049e-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-137c049e-ls259/index.html
LinuxServer Changes:
No changes
Remote Changes:
Handle legacy fields in modify and queries (#6494)
Handle legacy singular field names in modify and queries
This PR centralises the mapping of legacy singular field names (e.g.
genre, composer, lyricist, remixer, arranger) to their modern
plural multi-valued equivalents (e.g. genres, composers, ...) and
applies that rewrite in two places: the modify command and library
field queries.
What changed
beets/util/deprecation.py — new source of truth
Two module-level dicts, ALBUM_LEGACY_TO_LIST_FIELD and
ITEM_LEGACY_TO_LIST_FIELD, now live here. A new helper
maybe_replace_legacy_field(field, is_album) wraps the lookup, emits a
deprecation warning via the shared log, and returns the canonical
field name.
beets/library/models.py — queries now handle legacy fields
field_query calls maybe_replace_legacy_field before resolving
whether the field is fast or slow. This means queries like genre::rock
or composer::bach are transparently rewritten and warn the user.
beets/ui/commands/modify.py — simplified using the shared helper
The inline legacy-field lookup and deprecate_for_user call inside
modify_parse_args are replaced with a single call to
maybe_replace_legacy_field. The is_album parameter is passed through
from modify_func.
beets/autotag/hooks.py — LEGACY_TO_LIST_FIELD now references the
shared dicts
AlbumInfo and TrackInfo no longer define their own inline mappings;
they reference the canonical dicts from deprecation.py.
Impact
- Users who pass legacy field names in
modifyassignments or in
query expressions now get a deprecation warning and correct behaviour,
instead of silently operating on a non-existent field. - The legacy mapping is defined once, removing the previous drift risk
betweenhooks.py,modify.py, and any future call sites. - Fixes 🐛
6483.
nightly-06512c9b-ls259
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-06512c9b-ls259/index.html
LinuxServer Changes:
No changes
Remote Changes:
Use multi value remixers, composers, lyricists and arrangers (#6487)
Migrate artist-credit fields to multi-value lists
Fixes: #5698
Supersedes: #5847
This converts remixer, lyricist, composer, and arranger into
proper multi-value fields: remixers, lyricists, composers, and
arrangers.
What changed
- Data model (
beets/library/models.py): replaces the legacy
single-stringremixer,lyricist,composer, andarrangerfields
with multi-value list fields. - Migrations (
beets/library/migrations.py,
beets/library/library.py): extracts a reusable
MultiValueFieldMigrationbase class and adds field-specific migrations
forremixers,lyricists,composers, andarrangers. - Metadata compatibility (
beets/autotag/hooks.py): centralizes
legacy singular-to-plural compatibility inInfo/TrackInfo, so old
assignments likeinfo.remixer = "..."still work and populate the new
list fields. - MusicBrainz (
beetsplug/musicbrainz.py): now preserves these
credits as lists instead of comma-joined strings. - Follow-up updates: adjusts tests, docs, and related field mappings
(aura,bpd) to use the plural multi-value fields, and bumps the
minimummediafileversion to0.16.0.
Impact
- Existing libraries are migrated automatically on first run.
- Older code assigning singular string fields continues to work via the
compatibility shim, but emitsDeprecationWarnings. - These metadata fields now behave consistently with other multi-value
fields likegenres.