T5: 1:1 port of the artist_vectors SuggestionsEngine into qbz-reco (~880 lines; structure matches the Tauri source function-for-function). generate_suggestions: ensure each seed vector (builder.ensure_vector), gate on a non-empty combined playlist vector, rank candidates by DIRECT summed relationship weight via store.get_all_related_artists (NOT cosine/find_nearest, D3), then pull + dedup + exclude tracks from Qobuz with the validate_qobuz_artist + has_incompatible_genre gates and optional reason strings. Keeps Tauri's Arc<Mutex>/RwLock ownership (Send-safe). DTO reconciliation: crate::api -> qbz_qobuz::QobuzClient + qbz_models::Track (4 Qobuz calls mapped to real signatures, field-by-field). Adds rand (0.10, workspace) + qbz-models deps. 23 qbz-reco tests green. cc
17 lines
535 B
TOML
17 lines
535 B
TOML
[package]
|
|
name = "qbz-reco"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
description = "Frontend-agnostic artist-vector recommendation engine for QBZ (ported from the Tauri artist_vectors)"
|
|
|
|
[dependencies]
|
|
serde = { workspace = true }
|
|
rusqlite = { version = "0.31", features = ["bundled"] }
|
|
log = { workspace = true }
|
|
tokio = { workspace = true }
|
|
rand = { workspace = true }
|
|
qbz-models = { path = "../qbz-models" }
|
|
qbz-qobuz = { path = "../qbz-qobuz" }
|
|
qbz-integrations = { path = "../qbz-integrations" }
|