Sped up artist enrichment at least somewhat

This commit is contained in:
Connor Johnstone
2026-03-21 15:08:28 -04:00
parent 621355e352
commit 75f3b4f704

View File

@@ -193,12 +193,29 @@ async fn get_cached_album_tracks(
let release_mbid = if let Some(rid) = first_release_id {
rid.to_string()
} else {
// Browse releases for this release group (through shared rate limiter)
state
.mb_client
.resolve_release_from_group(rg_id)
.await
.map_err(|e| ApiError::Internal(format!("MB error for group {rg_id}: {e}")))?
// Check DB cache for previously resolved release MBID
let resolve_cache_key = format!("release_for_rg:{rg_id}");
if let Ok(Some(cached_rid)) = queries::cache::get(state.db.conn(), &resolve_cache_key).await
{
cached_rid
} else {
// Browse releases for this release group (through shared rate limiter)
let rid = state
.mb_client
.resolve_release_from_group(rg_id)
.await
.map_err(|e| ApiError::Internal(format!("MB error for group {rg_id}: {e}")))?;
// Cache the resolved release MBID for 365 days — it never changes
let _ = queries::cache::set(
state.db.conn(),
&resolve_cache_key,
"musicbrainz",
&rid,
365 * 86400,
)
.await;
rid
}
};
let mb_tracks = state
@@ -259,7 +276,8 @@ pub async fn enrich_artist(
quick_mode: bool,
) -> Result<serde_json::Value, ApiError> {
// Resolve artist: local ID or MBID
let (artist, id, mbid) = if let Ok(local_id) = id_or_mbid.parse() {
// Track whether we already fetched artist info during resolution to avoid a duplicate API call
let (artist, id, mbid, prefetched_info) = if let Ok(local_id) = id_or_mbid.parse() {
let artist = queries::artists::get_by_id(state.db.conn(), local_id).await?;
let mbid = match &artist.musicbrainz_id {
Some(m) => m.clone(),
@@ -274,7 +292,7 @@ pub async fn enrich_artist(
})?
}
};
(artist, Some(local_id), mbid)
(artist, Some(local_id), mbid, None)
} else {
let mbid = id_or_mbid.to_string();
@@ -288,9 +306,10 @@ pub async fn enrich_artist(
if let Some(a) = local {
let local_id = a.id;
(a, Some(local_id), mbid)
(a, Some(local_id), mbid, None)
} else {
// Look up artist info from MusicBrainz by MBID — don't create a local record
// This fetches url-rels too, so we reuse it below instead of calling get_artist_info() again
let info =
state.mb_client.get_artist_info(&mbid).await.map_err(|e| {
ApiError::NotFound(format!("artist MBID {mbid} not found: {e}"))
@@ -307,24 +326,34 @@ pub async fn enrich_artist(
monitored: false,
last_checked_at: None,
};
(synthetic, None, mbid)
(synthetic, None, mbid, Some(info))
}
};
// Fetch detailed artist info (country, type, URLs) — best-effort
let artist_info = match state.mb_client.get_artist_info(&mbid).await {
Ok(info) => {
tracing::debug!(
mbid = %mbid,
urls = info.urls.len(),
country = ?info.country,
"fetched artist info"
);
Some(info)
}
Err(e) => {
tracing::warn!(mbid = %mbid, error = %e, "failed to fetch artist info");
None
// Fetch detailed artist info (country, type, URLs) — reuse if already fetched during resolution
let artist_info = if let Some(info) = prefetched_info {
tracing::debug!(
mbid = %mbid,
urls = info.urls.len(),
country = ?info.country,
"reusing prefetched artist info"
);
Some(info)
} else {
match state.mb_client.get_artist_info(&mbid).await {
Ok(info) => {
tracing::debug!(
mbid = %mbid,
urls = info.urls.len(),
country = ?info.country,
"fetched artist info"
);
Some(info)
}
Err(e) => {
tracing::warn!(mbid = %mbid, error = %e, "failed to fetch artist info");
None
}
}
};