From 508609a5d80e51baab4a4b6cbd5fa42a7af3bdf9 Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Wed, 20 May 2026 08:50:50 -0600 Subject: [PATCH] refactor(integrations): move MB location and genre helpers to qbz-integrations Pure-logic move of two helper modules out of src-tauri/src/musicbrainz/ into the qbz-integrations crate, where the MusicBrainzClient and DTOs already live: src-tauri/src/musicbrainz/location_discovery.rs -> crates/qbz-integrations/src/musicbrainz/location.rs src-tauri/src/musicbrainz/genre_normalization.rs -> crates/qbz-integrations/src/musicbrainz/genre.rs The functions exposed are unchanged: extract_metadata, compute_affinity_score, build_scene_cache_key, format_life_span_date (from location); normalize_genre, is_broad_genre, extract_affinity_seeds, genre_summary (from genre). Imports in src-tauri/src/commands_v2/ integrations.rs are repointed to the new home; the legacy file declarations are removed from src-tauri/src/musicbrainz/mod.rs. No behavior change. Unblocks the Slint side from reaching the same helpers via qbz-core without depending on src-tauri. cc --- .../qbz-integrations/src/musicbrainz/genre.rs | 2 +- .../qbz-integrations/src/musicbrainz/location.rs | 7 +++++-- crates/qbz-integrations/src/musicbrainz/mod.rs | 3 +++ src-tauri/Cargo.lock | 1 + src-tauri/src/commands_v2/integrations.rs | 6 +++--- src-tauri/src/musicbrainz/mod.rs | 2 -- 6 files changed, 13 insertions(+), 8 deletions(-) rename src-tauri/src/musicbrainz/genre_normalization.rs => crates/qbz-integrations/src/musicbrainz/genre.rs (99%) rename src-tauri/src/musicbrainz/location_discovery.rs => crates/qbz-integrations/src/musicbrainz/location.rs (97%) diff --git a/src-tauri/src/musicbrainz/genre_normalization.rs b/crates/qbz-integrations/src/musicbrainz/genre.rs similarity index 99% rename from src-tauri/src/musicbrainz/genre_normalization.rs rename to crates/qbz-integrations/src/musicbrainz/genre.rs index 141898742..30c84a603 100644 --- a/src-tauri/src/musicbrainz/genre_normalization.rs +++ b/crates/qbz-integrations/src/musicbrainz/genre.rs @@ -5,7 +5,7 @@ use std::collections::HashSet; -use qbz_integrations::musicbrainz::{AffinitySeeds, Tag}; +use super::{AffinitySeeds, Tag}; /// Tags that provide no useful genre/scene signal const NOISY_TAGS: &[&str] = &[ diff --git a/src-tauri/src/musicbrainz/location_discovery.rs b/crates/qbz-integrations/src/musicbrainz/location.rs similarity index 97% rename from src-tauri/src/musicbrainz/location_discovery.rs rename to crates/qbz-integrations/src/musicbrainz/location.rs index 5e18d2f46..a73817326 100644 --- a/src-tauri/src/musicbrainz/location_discovery.rs +++ b/crates/qbz-integrations/src/musicbrainz/location.rs @@ -7,8 +7,11 @@ use std::collections::HashSet; -use super::genre_normalization::{extract_affinity_seeds, normalize_genre}; -use qbz_integrations::musicbrainz::*; +use super::genre::{extract_affinity_seeds, normalize_genre}; +use super::{ + AffinitySeeds, Area, ArtistFullResponse, ArtistLocation, ArtistMetadata, ArtistType, LifeSpan, + LocationPrecision, +}; /// Extract artist metadata from the full MB response pub fn extract_metadata(response: &ArtistFullResponse) -> ArtistMetadata { diff --git a/crates/qbz-integrations/src/musicbrainz/mod.rs b/crates/qbz-integrations/src/musicbrainz/mod.rs index 574646eb1..4fdd20379 100644 --- a/crates/qbz-integrations/src/musicbrainz/mod.rs +++ b/crates/qbz-integrations/src/musicbrainz/mod.rs @@ -31,5 +31,8 @@ mod models; #[cfg(feature = "cache")] pub mod cache; +pub mod genre; +pub mod location; + pub use client::{MusicBrainzClient, MusicBrainzConfig}; pub use models::*; diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 5d11744c4..5eecb9763 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -5121,6 +5121,7 @@ dependencies = [ "qbz-models", "qbz-player", "qbz-qobuz", + "serde", "serde_json", "thiserror 2.0.18", "tokio", diff --git a/src-tauri/src/commands_v2/integrations.rs b/src-tauri/src/commands_v2/integrations.rs index 223bfe6ee..84cae85e1 100644 --- a/src-tauri/src/commands_v2/integrations.rs +++ b/src-tauri/src/commands_v2/integrations.rs @@ -552,7 +552,7 @@ pub async fn v2_musicbrainz_get_artist_metadata( drop(client); // Extract metadata using the location discovery module (now uses V2 types) - let mut metadata = crate::musicbrainz::location_discovery::extract_metadata(&artist); + let mut metadata = qbz_integrations::musicbrainz::location::extract_metadata(&artist); // Resolve real country from begin_area hierarchy (MB's "country" field is // where the artist is active, not where they were born/formed) @@ -606,10 +606,10 @@ pub async fn v2_discover_artists_by_location( runtime: State<'_, RuntimeManagerState>, app: tauri::AppHandle, ) -> Result { - use crate::musicbrainz::genre_normalization::{ + use qbz_integrations::musicbrainz::genre::{ extract_affinity_seeds, genre_summary, is_broad_genre, }; - use crate::musicbrainz::location_discovery::{build_scene_cache_key, compute_affinity_score}; + use qbz_integrations::musicbrainz::location::{build_scene_cache_key, compute_affinity_score}; use qbz_integrations::musicbrainz::{ AffinitySeeds, LocationCandidate, LocationDiscoveryResponse, Tag, }; diff --git a/src-tauri/src/musicbrainz/mod.rs b/src-tauri/src/musicbrainz/mod.rs index 1e7a0c534..a96b70a66 100644 --- a/src-tauri/src/musicbrainz/mod.rs +++ b/src-tauri/src/musicbrainz/mod.rs @@ -21,8 +21,6 @@ pub mod smart_playlists; pub use cache::{CacheStats, MusicBrainzCache, MusicBrainzCacheState}; pub use client::{MusicBrainzClient, MusicBrainzConfig}; -pub mod genre_normalization; -pub mod location_discovery; pub use models::{ AffinitySeeds, AlbumAppearance, Area, AreaResult, AreaSearchResponse, ArtistBrowseResponse,