- Add item_types ClassVar with tidal_track_id, tidal_album_id,
tidal_artist_id, tidal_track_popularity, tidal_alb_popularity,
tidal_updated fields
- Populate flexattrs during album/track import via AlbumInfo/TrackInfo
kwargs
- Add beet tidalsync command to refresh popularity data post-import
- Add tidal fields to REIMPORT_FRESH_FIELDS_ITEM for reimport support
- Add tests for flexattr population and tidalsync behavior
- Update tidal plugin docs with attribute reference and tidalsync usage
Add a LyricsSession class that mounts RateLimitAdapter (4 req/sec)
and configures urllib3 Retry with exponential backoff on 429
responses. Each backend instance gets its own session so rate
limits apply independently per API source.
Fixes#6728
In #6695, the Item and Album all_keys methods return sets now. This
causes an error when used in optparse for choices as it doesn't accept
sets:
Traceback (most recent call last):
File "/home/user/.local/bin/beet", line 10, in <module>
sys.exit(main())
~~~~^^
File "/home/user/.local/lib/beets/beets/ui/__init__.py", line 964, in main
_raw_main(args)
~~~~~~~~~^^^^^^
File "/home/user/.local/lib/beets/beets/ui/__init__.py", line 940, in _raw_main
subcommands, lib = _setup(options)
~~~~~~^^^^^^^^^
File "/home/user/.local/lib/beets/beets/ui/__init__.py", line 781, in _setup
subcommands.extend(plugins.commands())
~~~~~~~~~~~~~~~~^^
File "/home/user/.local/lib/beets/beets/plugins.py", line 508, in commands
out += plugin.commands()
~~~~~~~~~~~~~~~^^
File "/home/user/.local/lib/beets/beetsplug/fish.py", line 80, in commands
cmd.parser.add_option(
~~~~~~~~~~~~~~~~~~~~~^
"-e",
^^^^^
...<4 lines>...
help="include specified field *values* in completions",
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/lib/python3.14/optparse.py", line 990, in add_option
option = self.option_class(*args, **kwargs)
File "/usr/lib/python3.14/optparse.py", line 571, in __init__
checker(self)
~~~~~~~^^^^^^
File "/usr/lib/python3.14/optparse.py", line 658, in _check_choice
raise OptionError(
"choices must be a list of strings ('%s' supplied)"
% str(type(self.choices)).split("'")[1], self)
optparse.OptionError: option -e/--extravalues: choices must be a list of strings ('set' supplied)
This feature was introduced in 2.10 but results a lot of data being
overwritten with (potentially) incorrect data the next time a user runs
`mbsync` over their library.
To make this less of a "breaking" change, make this feature opt-in. The
users who want this large change can enable the functionality.
ReadError and WriteError formatted the super() proxy in their f-string, so file read and write failures lost the path and reason.
Use super().__str__() to return the FileOperationError message.
- Wrap new test_dbcore.py tests in TestModelTypeFallback class
- Add changelog entry for the modify -a multi-value field fix
- Document multi-valued field support for album modify in cli.rst
Per @snejus review: let super().__getattribute__ run normally and only
intercept its AttributeError when the attribute resolves to a
cached_property. Re-raise as RuntimeError using with_traceback(
exc.__traceback__) so the wrapped error still points at the real
failing line, and raise ... from None to suppress the chained
"during handling of the above exception" block that doubled the CLI
traceback.
Update tests to match: cause chain is now suppressed and the real
traceback lives on the RuntimeError itself. Also add a changelog
entry under Bug fixes.