Skip to content

Releases: linuxserver/docker-beets

2.11.0-ls330

08 May 20:12
f1365a5

Choose a tag to compare

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/2.11.0-ls330/index.html

LinuxServer Changes:

Full Changelog: 2.11.0-ls329...2.11.0-ls330

Remote Changes:

Updating PIP version of beets to 2.11.0

nightly-32487704-ls281

08 May 14:46
0215cc8

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-32487704-ls281/index.html

LinuxServer Changes:

Full Changelog: nightly-26ab6b26-ls280...nightly-32487704-ls281

Remote Changes:

fix: mbpseudo issues when applying pseudorelease (#6512)

I have not created an issue for this but I tried to use mbpseudo to
apply this pseudorelease:
https://musicbrainz.org/release/6c100fef-6abf-41c4-bd21-6f9becaaab6c

When doing that I encountered two errors as seen below, this PR should
fix those issues. The second issue was only apparent once the first
issue was fixed.

Sending event: import_task_choice
Traceback (most recent call last):
  File "/lsiopy/bin/beet", line 6, in <module>
    sys.exit(main())
             ^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/__init__.py", line 1013, in main
    _raw_main(args)
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/__init__.py", line 992, in _raw_main
    subcommand.func(lib, suboptions, subargs)
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands/import_/__init__.py", line 131, in import_func
    import_files(lib, byte_paths, query)
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands/import_/__init__.py", line 75, in import_files
    session.run()
  File "/lsiopy/lib/python3.12/site-packages/beets/importer/session.py", line 237, in run
    pl.run_parallel(QUEUE_SIZE)
  File "/lsiopy/lib/python3.12/site-packages/beets/util/pipeline.py", line 471, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/lsiopy/lib/python3.12/site-packages/beets/util/pipeline.py", line 336, in run
    out = self.coro.send(msg)
          ^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/util/pipeline.py", line 195, in coro
    task = func(*args, task)
           ^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/importer/stages.py", line 217, in user_query
    _apply_choice(session, task)
  File "/lsiopy/lib/python3.12/site-packages/beets/importer/stages.py", line 323, in _apply_choice
    task.apply_metadata()
  File "/lsiopy/lib/python3.12/site-packages/beets/importer/tasks.py", line 263, in apply_metadata
    self.match.apply_metadata()
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 609, in apply_metadata
    for item, data in self.merged_pairs:
                      ^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 603, in merged_pairs
    (i, ti.merge_with_album(self.info))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 482, in merge_with_album
    album = album_info.raw_data
            ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/functools.py", line 998, in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 301, in raw_data
    data = {**super().raw_data}
              ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/functools.py", line 998, in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 176, in raw_data
    data = self.__class__(**self.copy())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: PseudoAlbumInfo.__init__() missing 2 required positional arguments: 'pseudo_release' and 'official_release'
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/martin/personal/src-ext/beets/beets/__main__.py", line 24, in <module>
    main(sys.argv[1:])
    ~~~~^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/ui/__init__.py", line 1013, in main
    _raw_main(args)
    ~~~~~~~~~^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/ui/__init__.py", line 992, in _raw_main
    subcommand.func(lib, suboptions, subargs)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/ui/commands/import_/__init__.py", line 131, in import_func
    import_files(lib, byte_paths, query)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/ui/commands/import_/__init__.py", line 75, in import_files
    session.run()
    ~~~~~~~~~~~^^
  File "/home/martin/personal/src-ext/beets/beets/importer/session.py", line 237, in run
    pl.run_parallel(QUEUE_SIZE)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/util/pipeline.py", line 471, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/home/martin/personal/src-ext/beets/beets/util/pipeline.py", line 336, in run
    out = self.coro.send(msg)
  File "/home/martin/personal/src-ext/beets/beets/util/pipeline.py", line 195, in coro
    task = func(*args, task)
  File "/home/martin/personal/src-ext/beets/beets/importer/stages.py", line 217, in user_query
    _apply_choice(session, task)
    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/importer/stages.py", line 326, in _apply_choice
    task.add(session.lib)
    ~~~~~~~~^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/importer/tasks.py", line 503, in add
    self.album = lib.add_album(self.imported_items())
                 ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/library/library.py", line 83, in add_album
    item.add(self)
    ~~~~~~~~^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/library/models.py", line 84, in add
    super().add(lib)
    ~~~~~~~~~~~^^^^^
  File "/home/martin/personal/src-ext/beets/beets/dbcore/db.py", line 717, in add
    self.store()
    ~~~~~~~~~~^^
  File "/home/martin/personal/src-ext/beets/beets/library/models.py", line 74, in store
    super().store(fields)
    ~~~~~~~~~~~~~^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/dbcore/db.py", line 659, in store
    tx.mutate(
    ~~~~~~~~~^
        f"INSERT INTO {self._flex_table} "
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        (self.id, key, value),
        ^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/martin/personal/src-ext/beets/beets/dbcore/db.py", line 1039, in mutate
    return self.db._connection().execute(statement, subvals).lastrowid
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
sqlite3.ProgrammingError: Error binding parameter 3: type 'dict' is not supported

2.11.0-ls329

06 May 11:12
faa480a

Choose a tag to compare

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/2.11.0-ls329/index.html

LinuxServer Changes:

Full Changelog: 2.10.0-ls328...2.11.0-ls329

Remote Changes:

Updating PIP version of beets to 2.11.0

nightly-7dde183d-ls280

06 May 15:26
1a498a8

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-7dde183d-ls280/index.html

LinuxServer Changes:

No changes

Remote Changes:

convert: Add types and simplify args parsing (#6573)

Refactor ConvertPlugin to use instance attributes instead of

parameter threading

This PR cleans up the ConvertPlugin class by eliminating the pattern
of passing config values as explicit parameters through the call chain.

What changed

  • Removed _get_opts_and_config — a method that returned a 9-tuple
    of config values. All callers unpacked and re-passed these values
    explicitly.
  • Config values are now @cached_property attributes on
    ConvertPlugin: dest, fmt, force, pretend, link, hardlink,
    threads, playlist, path_formats.
  • CLI option defaults now set from config, so
    self.config.set(vars(opts)) in convert_func is sufficient to merge
    CLI overrides — no more opts.x or config["x"] branching in
    _get_opts_and_config.
  • get_formatcommand cached property returning a typed
    FormatCommand NamedTuple, replacing a free function that accessed
    the global config.
  • should_transcode and encode signatures simplified — fmt,
    force, and pretend no longer passed as arguments; methods read from
    self.
  • _parallel_convert and convert_item reduced to (items, keep_new) signatures.
  • Free module-level functions (get_format, in_no_convert,
    should_transcode) removed; equivalent logic now lives as methods,
    removing the dependency on the global config object.
  • Types and TYPE_CHECKING imports added throughout; after_convert
    event registered in plugins.py.

Impact

No behaviour change. The refactor reduces argument surface area
significantly, makes the config read path explicit and testable
per-instance, and eliminates a source of subtle bugs where CLI flags
could silently fall back to wrong defaults.

nightly-26ab6b26-ls280

06 May 11:06
1a498a8

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-26ab6b26-ls280/index.html

LinuxServer Changes:

Full Changelog: nightly-250b3fdb-ls279...nightly-26ab6b26-ls280

Remote Changes:

Increment version to 2.11.0

nightly-3d3f5e3b-ls279

02 May 23:42
45bc408

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-3d3f5e3b-ls279/index.html

LinuxServer Changes:

No changes

Remote Changes:

badfiles: respect import.quiet during import hook (#6589)

The badfiles plugin's on_import_task_before_choice hook prompted for
input even when quiet mode was active. Non-interactive imports stalled
on the corrupt-file dialog. The hook now returns early when
import.quiet is set, so the importer falls back to its summary
judgment under both the --quiet flag and the import.quiet: yes
config key.

Fixes #4736.

nightly-2aa7031b-ls278

02 May 05:01
519125e

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-2aa7031b-ls278/index.html

LinuxServer Changes:

Full Changelog: nightly-20b0dd33-ls277...nightly-2aa7031b-ls278

Remote Changes:

Add Beetnik in other plugins (#6597)

This just a documentation change adding BeetNik in the list of plugins.

nightly-250b3fdb-ls279

02 May 21:44
45bc408

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-250b3fdb-ls279/index.html

LinuxServer Changes:

Full Changelog: nightly-2aa7031b-ls278...nightly-250b3fdb-ls279

Remote Changes:

Fix misplaced changelog note (#6602)

Fix misplaced changelog note.

2.10.0-ls328

01 May 19:58
fe6d3ba

Choose a tag to compare

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/2.10.0-ls328/index.html

LinuxServer Changes:

Full Changelog: 2.10.0-ls327...2.10.0-ls328

Remote Changes:

Updating PIP version of beets to 2.10.0

nightly-83034f7f-ls277

30 Apr 17:16
7b407f8

Choose a tag to compare

Pre-release

CI Report:

https://ci-tests.linuxserver.io/linuxserver/beets/nightly-83034f7f-ls277/index.html

LinuxServer Changes:

No changes

Remote Changes:

Fix original date application (#6588)

autotag: Move original_date override into AlbumInfo.item_data

Previously, the original_date year/month/day substitution was applied
in merge_with_album — meaning only track-level items got the corrected
date. Album-level metadata was never updated, causing a mismatch between
item and album fields.

This PR moves the logic into a cached_property override of item_data
on AlbumInfo, so both item and album metadata consistently reflect the
original release date when original_date: yes is configured.

Key changes:

  • New AlbumInfo.item_data property applies the original_date
    override before data is consumed by either items or albums.
  • merge_with_album drops its now-redundant inline override block.
  • Test renamed and extended to assert album-level fields
    (album.year/month/day) rather than just item fields.

Fixes #6577.