feat: For You — radio, album suggestions, rediscover, more-from-library

Completes the remaining For You sections by porting two Qobuz API
endpoints down into qbz-core and adding the local "forgotten
favorites" approximation.

Backend ports (qbz-models + qbz-qobuz + qbz-core):
  - /album/suggest -> AlbumSuggestResponse, QobuzClient::get_album_suggest,
    QbzCore::get_album_suggest.
  - /radio/artist + /radio/album -> RadioResponse, get_radio_artist /
    get_radio_album on the client + core. (Faithful ports of the legacy
    src-tauri/api/client.rs methods — same paths, params, shapes.)

For You sections:
  - Radio Stations — album-seeded radio tiles (recent + favorite
    albums, deduped, capped 12), rendered with RadioCard; click starts
    a real Qobuz album radio.
  - More From Your Library — /album/suggest seeded from the most recent
    played album (else first favorite).
  - Rediscover Your Library — favorite albums not in the local
    play-history (approximation of Tauri's reco-DB forgotten
    favorites).
  - Spotlight's RADIO card + the artist "radio" action now create a
    real Qobuz artist radio (playback::play_artist_radio /
    play_album_radio build a queue from the radio track list and play).

Section order now matches Tauri: Qobuz Mixes, Release Watch, Radio
Stations, Recently Played Tracks/Albums, Your Top Artists, More From
Your Library, Rediscover, Artists to Follow, Spotlight.

Still backend-blocked: the Qobuz mix detail views (DailyQ/WeeklyQ/etc.)
and the smart radio_engine (the Qobuz radio used here is the simpler
/radio/* endpoint, not the local pool builder).

cc
This commit is contained in:
vicrodh committed 2026-05-21 06:43:53 -06:00
1 parent 83b7721b10
commit c19a5b84dd
12 files changed
+457 -14

No files matched your search

+2
View File
@@ -43,8 +43,10 @@ pub use playback::{PlaybackState, PlaybackStatus, QueueState, QueueTrack, Repeat
pub use traits::{FrontendAdapter, LoggingAdapter, NoOpAdapter};
pub use types::{
Album,
AlbumSuggestResponse,
AlbumSummary,
Artist,
RadioResponse,
ArtistAlbums,
ArtistBiography,
// Discover types
+20
View File
@@ -665,6 +665,26 @@ pub struct SearchResultsPage<T> {
pub limit: u32,
}
/// Response from `/album/suggest` — albums similar to a seed album.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlbumSuggestResponse {
#[serde(default)]
pub algorithm: Option<String>,
#[serde(default)]
pub albums: Option<SearchResultsPage<Album>>,
}
/// Response from the `/radio/*` endpoints — a generated track list.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RadioResponse {
#[serde(rename = "type", default)]
pub radio_type: Option<String>,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub tracks: Option<SearchResultsPage<Track>>,
}
/// One entry of the Qobuz `most_popular` block in a combined search.
/// Serde tagging matches the legacy `V2MostPopularItem` so the Tauri
/// command's response shape is unchanged.