Implement many more client-facing API surfaces #1

Merged
james merged 7 commits from tui-readiness into main 2026-09-24 17:02:33 +00:00
Owner
  • Improvements to the Daemon-exposed authenticated paths as well as the public API library to support more use cases
    • pagination and sub-resource browsing
    • podcast support
    • user account information
    • streaming audio support
    • user-specific settings tweaks (loving a song, playlist, artist, etc., changing preferences)
- Improvements to the Daemon-exposed authenticated paths as well as the public API library to support more use cases - pagination and sub-resource browsing - podcast support - user account information - streaming audio support - user-specific settings tweaks (loving a song, playlist, artist, etc., changing preferences)
- DeezerList<T> gains total/next; get_all follow-next helper (limit=300)
- artist top/albums/playlists/related, album/playlist paginated tracklists
- fix CLI truncation: playlist capped at 400, album embedded tracks at 25
- Track.album and Playlist.nb_tracks loosened to Option (wire quirks)
- new client artist subcommand
- Episode DTO loosened to Option for the lightweight /podcast/{id}/episodes shape
- podcast search + episode listing; daemon /episode streams the gateway's
  direct podcast URL (plain MP3, no Blowfish/license token)
- play --podcast, podcast subcommand, search type podcast
- Account DTO from the session (license_token kept out by construction)
- gw-backed loved tracks, playlists, favorite artists, listening history
- daemon routes /whoami /loved /playlists /artists /history + CLI variants
- decrypting_stream: stripe-wise CBC decryptor as a Stream transform (fixed
  IV, every 3rd 2048-byte block; block counter spans chunk boundaries)
- stream_track returns TrackStream; daemon serves via Body::from_stream with
  exact Content-Length — start-latency drops to URL resolution, memory O(chunk)
- fire-and-forget log.listen on the default path; stream_track_quiet opts out
- stripe-aligned Range proxy (refreezer math): decrypt the full stripe, slice
  the in-stripe prefix; block counter starts at aligned_start / 2048
- 206 + Content-Range + Accept-Ranges; suffix/multipart serve 200 full; CDN
  416 forwards as 416 (RangeNotSatisfiable)
- favorite_song/album/artist/playlist add+remove, playlist create/update/
  addSongs/deleteSongs/delete via gateway_call_void
- typed daemon routes per action (POST/DELETE favorites, POST/PATCH/DELETE
  playlists); DaemonClient mirrors each route
- client favorite + playlist-* CLI subcommands with guardrailed live
  round-trips (cleanup unconditional)
- gateway_post shared by gateway_call/gateway_call_void; get_audio shared by
  stream/stream_episode; one session() guard replaces six copies
- cut test-only search_by_page/search_all and the unused AsRef for DeezerList
- net -98 lines
james merged commit 30008fdf1a into main 2026-09-24 17:02:33 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
james/deezerd!1
No description provided.