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:
12 files changed
+457
-14
No files matched your search
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user