Skip to content

Releases: linuxserver/docker-beets

nightly-29d5fac9-ls259

04 Apr 17:29
fae15d1

Choose a tag to compare

Pre-release

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

05 Apr 17:27
fae15d1

Choose a tag to compare

Pre-release

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

07 Apr 10:06
fae15d1

Choose a tag to compare

Pre-release

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.pyLEGACY_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 modify assignments 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
    between hooks.py, modify.py, and any future call sites.
  • Fixes 🐛6483.

nightly-06512c9b-ls259

05 Apr 08:36
fae15d1

Choose a tag to compare

Pre-release

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-string remixer, lyricist, composer, and arranger fields
    with multi-value list fields.
  • Migrations (beets/library/migrations.py,
    beets/library/library.py): extracts a reusable
    MultiValueFieldMigration base class and adds field-specific migrations
    for remixers, lyricists, composers, and arrangers.
  • Metadata compatibility (beets/autotag/hooks.py): centralizes
    legacy singular-to-plural compatibility in Info / TrackInfo, so old
    assignments like info.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
    minimum mediafile version to 0.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 emits DeprecationWarnings.
  • These metadata fields now behave consistently with other multi-value
    fields like genres.

2.8.0-ls322

03 Apr 19:28
b3d9c88

Choose a tag to compare

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/2.8.0-ls322/index.html

LinuxServer Changes:

Full Changelog: 2.8.0-ls321...2.8.0-ls322

Remote Changes:

Updating PIP version of beets to 2.8.0

nightly-e5365145-ls258

03 Apr 19:28
bd55590

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-e5365145-ls258/index.html

LinuxServer Changes:

Full Changelog: nightly-ad20cc71-ls257...nightly-e5365145-ls258

Remote Changes:

autobpm: Add --force and --quiet options; Deprecate overwrite (#6481)

Description

Reveal the overwrite config setting to the CLI and at the same time
deprecate the option name. It should be named force to streamline with
other beets configs of the same kind.

Add a quiet CLI flag and config option that leaves out output
pointing to already existing BPM values

nightly-e5365145-ls257

03 Apr 10:40
7cc8b2b

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-e5365145-ls257/index.html

LinuxServer Changes:

No changes

Remote Changes:

autobpm: Add --force and --quiet options; Deprecate overwrite (#6481)

Description

Reveal the overwrite config setting to the CLI and at the same time
deprecate the option name. It should be named force to streamline with
other beets configs of the same kind.

Add a quiet CLI flag and config option that leaves out output
pointing to already existing BPM values

nightly-ad20cc71-ls257

03 Apr 01:17
7cc8b2b

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-ad20cc71-ls257/index.html

LinuxServer Changes:

Full Changelog: nightly-712bada6-ls256...nightly-ad20cc71-ls257

Remote Changes:

Add filename extension for music files with no extension during import (#6457)

Fixes #4881.

When user imports files with no extension, ffprobe is used to check the
format of the file. If its in a music format, a copy of the file is
created with the detected extension and that file is imported instead of
the original. If it is not a music format, it change nothing (I believe
non-music files are already filtered out somewhere else in the import
pipeline). If there is a file in the same directory with the same name
and has the same extension as the detected format, import that file
instead.

nightly-a8a73008-ls258

04 Apr 13:50
bd55590

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-a8a73008-ls258/index.html

LinuxServer Changes:

No changes

Remote Changes:

smartplaylist: Copy-paste-able list of playlists (#6404)

A simple QoL feature for splupdate - when wanting to update multiple
(not all) smartplaylists, it is not very convenient to copy-paste the
name from the output the plugin uses.

So for example issuing beet splupdate non_existent_list we get:
['playlist_name_1', 'playlist name 2', ...]. This output can't easily
be copy-pasted back to a shell command like

beet splupdate playlist_name_1 'playlist name 2'

This change handles quoting for shell using shlex.quote which makes it
easy to copy-paste several lists in a row (eg. with common prefixes).
Also the list of playlists is now sorted alphabetically prior to
printing on the shell!

Addition refactorings

A tiny fix below if not pretend: where .items() for dict-iterating
should have been used in the first place.

nightly-131768b7-ls258

03 Apr 22:27
bd55590

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-131768b7-ls258/index.html

LinuxServer Changes:

No changes

Remote Changes:

Fix albumartists_sort prepending joined artist credit (#6470) (#6491)

Fixes #6470

Since beets 2.8.0, albumartists_sort incorrectly includes the full
combined artist credit as the first element of the list. For example,
for a release with artists "Hans Zimmer" and "John Powell", the field
returns ["Zimmer, Hans and Powell, John", "Zimmer, Hans", "Powell,
John"] instead of ["Zimmer, Hans", "Powell, John"].

The issue was in ensure_first_value in hooks.py. The set intersection
returned an empty set for comma separated sort names, so the early
return never triggered and the joined name got prepended. For the fix a
substring check was added to correctly detect when the single value is a
joined version of the list values.