From aef470843937f115f7d87fdaf705f8a7cd72c910 Mon Sep 17 00:00:00 2001 From: Connor Johnstone Date: Sat, 21 Mar 2026 15:08:28 -0400 Subject: [PATCH] Sped up artist enrichment at least somewhat --- src/library.rs | 33 ++++++++++++++++++++++++--------- tests/integration.rs | 19 ++++++++++++++++++- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/library.rs b/src/library.rs index 6a6736e..0486ba4 100644 --- a/src/library.rs +++ b/src/library.rs @@ -89,24 +89,39 @@ pub async fn add_artist( } }; - tracing::info!(name = %resolved_name, mbid = %artist_mbid, "fetching discography"); + tracing::info!(name = %resolved_name, mbid = %artist_mbid, "fetching discography (release groups)"); - let releases = provider - .get_artist_releases(&artist_mbid, 100) + let release_groups = provider + .get_artist_release_groups(&artist_mbid) .await - .map_err(|e| WatchError::Other(format!("failed to fetch discography: {e}")))?; + .map_err(|e| WatchError::Other(format!("failed to fetch release groups: {e}")))?; - tracing::info!(count = releases.len(), "found releases"); + tracing::info!(count = release_groups.len(), "found release groups"); let mut summary = AddSummary::default(); - for release in &releases { - tracing::info!(title = %release.title, mbid = %release.mbid, "fetching tracks"); + for rg in &release_groups { + // Resolve a concrete release MBID from the release group + let release_mbid = if let Some(ref rid) = rg.first_release_mbid { + rid.clone() + } else { + // Browse releases for this release group to find a concrete release + match provider.resolve_release_from_group(&rg.mbid).await { + Ok(rid) => rid, + Err(e) => { + tracing::warn!(rg = %rg.title, rg_id = %rg.mbid, error = %e, "failed to resolve release from group"); + summary.errors += 1; + continue; + } + } + }; - let tracks = match provider.get_release_tracks(&release.mbid).await { + tracing::info!(title = %rg.title, release_mbid = %release_mbid, "fetching tracks for release group"); + + let tracks = match provider.get_release_tracks(&release_mbid).await { Ok(t) => t, Err(e) => { - tracing::warn!(release = %release.title, error = %e, "failed to fetch tracks"); + tracing::warn!(rg = %rg.title, error = %e, "failed to fetch tracks"); summary.errors += 1; continue; } diff --git a/tests/integration.rs b/tests/integration.rs index ae28853..6dd6407 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -113,7 +113,24 @@ impl MetadataProvider for MockProvider { &self, _artist_mbid: &str, ) -> DataResult> { - Ok(vec![]) + Ok(vec![ReleaseGroupEntry { + mbid: "rg-123".into(), + title: "Test Album".into(), + primary_type: Some("Album".into()), + secondary_types: vec![], + first_release_date: Some("2024".into()), + first_release_mbid: Some("release-123".into()), + }]) + } + + async fn resolve_release_from_group(&self, release_group_mbid: &str) -> DataResult { + if release_group_mbid == "rg-123" { + Ok("release-123".into()) + } else { + Err(shanty_data::DataError::Other(format!( + "no releases for release-group {release_group_mbid}" + ))) + } } }