feat: add autoplay suggestions when queue runs out
Some checks failed
Build for Windows / build-windows (push) Has been cancelled

This commit is contained in:
joren
2026-03-30 23:14:43 +02:00
parent 2da934f3f6
commit cfd91f96b5
11 changed files with 208 additions and 0 deletions

View File

@@ -40,6 +40,7 @@ enum QobuzEvent {
EV_MOST_POPULAR_OK = 26,
EV_GENRES_OK = 27,
EV_FEATURED_ALBUMS_OK = 28,
EV_DYNAMIC_SUGGEST_OK = 29,
};
// Callback signature
@@ -57,6 +58,7 @@ void qobuz_backend_get_user(QobuzBackendOpaque *backend);
// Catalog
void qobuz_backend_search(QobuzBackendOpaque *backend, const char *query, uint32_t offset, uint32_t limit);
void qobuz_backend_most_popular_search(QobuzBackendOpaque *backend, const char *query, uint32_t limit);
void qobuz_backend_get_dynamic_suggestions(QobuzBackendOpaque *backend, const char *listened_track_ids_json, const char *tracks_to_analyze_json, uint32_t limit);
void qobuz_backend_get_album(QobuzBackendOpaque *backend, const char *album_id);
void qobuz_backend_get_artist(QobuzBackendOpaque *backend, int64_t artist_id);
void qobuz_backend_get_playlist(QobuzBackendOpaque *backend, int64_t playlist_id, uint32_t offset, uint32_t limit);

View File

@@ -471,6 +471,24 @@ impl QobuzClient {
Self::check_response(resp).await
}
pub async fn get_dynamic_suggestions(
&self,
limit: u32,
listened_tracks_ids: Value,
tracks_to_analyze: Value,
) -> Result<Value> {
let resp = self
.post_request("dynamic/suggest")
.json(&serde_json::json!({
"limit": limit,
"listened_tracks_ids": listened_tracks_ids,
"track_to_analysed": tracks_to_analyze,
}))
.send()
.await?;
Self::check_response(resp).await
}
async fn search_tracks(
&self,
query: &str,

View File

@@ -48,6 +48,7 @@ pub const EV_DEEP_SHUFFLE_OK: c_int = 25;
pub const EV_MOST_POPULAR_OK: c_int = 26;
pub const EV_GENRES_OK: c_int = 27;
pub const EV_FEATURED_ALBUMS_OK: c_int = 28;
pub const EV_DYNAMIC_SUGGEST_OK: c_int = 29;
// ---------- Callback ----------
@@ -234,6 +235,59 @@ pub unsafe extern "C" fn qobuz_backend_most_popular_search(
});
}
#[no_mangle]
pub unsafe extern "C" fn qobuz_backend_get_dynamic_suggestions(
ptr: *mut Backend,
listened_track_ids_json: *const c_char,
tracks_to_analyze_json: *const c_char,
limit: u32,
) {
let inner = &(*ptr).0;
let client = inner.client.clone();
let cb = inner.cb;
let ud = inner.ud;
let listened_str = CStr::from_ptr(listened_track_ids_json)
.to_string_lossy()
.into_owned();
let analyze_str = CStr::from_ptr(tracks_to_analyze_json)
.to_string_lossy()
.into_owned();
let listened: serde_json::Value = match serde_json::from_str(&listened_str) {
Ok(v) => v,
Err(e) => {
call_cb(cb, ud, EV_GENERIC_ERR, &err_json(&e.to_string()));
return;
}
};
let to_analyze: serde_json::Value = match serde_json::from_str(&analyze_str) {
Ok(v) => v,
Err(e) => {
call_cb(cb, ud, EV_GENERIC_ERR, &err_json(&e.to_string()));
return;
}
};
spawn(inner, async move {
let result = client
.lock()
.await
.get_dynamic_suggestions(limit, listened, to_analyze)
.await;
match result {
Ok(r) => call_cb(
cb,
ud,
EV_DYNAMIC_SUGGEST_OK,
&serde_json::to_string(&r).unwrap_or_default(),
),
Err(e) => call_cb(cb, ud, EV_GENERIC_ERR, &err_json(&e.to_string())),
}
});
}
// ---------- Album ----------
#[no_mangle]