- Factor common album and track Tidal fields into a shared
MediaAttributes TypedDict.
- Use the shared type in parser helpers that only need common Tidal
metadata.
- Fix mypy: avoid {} default in relationships.get() that creates Never type
- Fix doc build: use :doc:\etchart\ instead of :doc:\plugins/fetchart\ from within plugins/ directory
Replace tidalsync() with sync_item_popularity() / sync_album_popularity()
backed by a shared _sync_popularity() helper.
Split the `tidal` command into `tidal` (auth-only) and `tidalsync`
(popularity sync with --item, --album, --force, --write flags). While
I liked the tidal [auth|sync] it is currently not well supported in beets
and e.g. help pages are lacking.
Accept int IDs throughout the search pipeline to avoid unnecessary
str conversions.
- 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
Update all references in core, plugins, and tests to import UserError
from the new location. This centralizes exception handling and improves
code organization.
- Renamed id to _id
- Aligned line breaks for some comment with actual ruff line length
- Removed comment dividers
- Removed a number of unnecessary or duplicate comments
- plugin functions currently unimplemented
- added authentication flow (pcke)
- added api layer to abstract communication with tidal (similar to spotify)
- added a general Request RateLimiter as I have seen that tidal will penalize
you pretty rough if you make more requests than expected.