diff --git a/shanty-data/src/mb_local.rs b/shanty-data/src/mb_local.rs index ff84bd7..a9159bc 100644 --- a/shanty-data/src/mb_local.rs +++ b/shanty-data/src/mb_local.rs @@ -343,9 +343,63 @@ impl MetadataFetcher for LocalMusicBrainzFetcher { .collect(); Ok(r) } - Err(rusqlite::Error::QueryReturnedNoRows) => Err(DataError::Other(format!( - "recording {mbid} not found locally" - ))), + Err(rusqlite::Error::QueryReturnedNoRows) => { + // Not in standalone recordings — try finding via tracks-on-releases + let track_recording = conn.query_row( + "SELECT t.recording_mbid, t.title, rel.artist_mbid, a.name, t.duration_ms + FROM mb_tracks t + JOIN mb_releases rel ON t.release_mbid = rel.mbid + LEFT JOIN mb_artists a ON rel.artist_mbid = a.mbid + WHERE t.recording_mbid = ?1 + LIMIT 1", + rusqlite::params![mbid], + |row| { + let duration: Option = row.get(4)?; + Ok(RecordingDetails { + mbid: row.get(0)?, + title: row.get(1)?, + artist_mbid: row.get(2)?, + duration_ms: duration.map(|d| d as u64), + artist: row + .get::<_, Option>(3)? + .unwrap_or_else(|| "Unknown Artist".into()), + releases: vec![], + genres: vec![], + }) + }, + ); + + match track_recording { + Ok(mut r) => { + // Fetch all releases containing this recording + let mut stmt = conn + .prepare( + "SELECT DISTINCT rel.mbid, rel.title, rel.date + FROM mb_tracks t + JOIN mb_releases rel ON t.release_mbid = rel.mbid + WHERE t.recording_mbid = ?1 + LIMIT 10", + ) + .map_err(|e| DataError::Other(e.to_string()))?; + r.releases = stmt + .query_map(rusqlite::params![mbid], |row| { + Ok(ReleaseRef { + mbid: row.get(0)?, + title: row.get(1)?, + date: row.get(2)?, + track_number: None, + }) + }) + .map_err(|e| DataError::Other(e.to_string()))? + .filter_map(|r| r.ok()) + .collect(); + Ok(r) + } + Err(_) => Err(DataError::Other(format!( + "recording {mbid} not found locally" + ))), + } + } Err(e) => Err(DataError::Other(e.to_string())), } } diff --git a/shanty-tag b/shanty-tag index a03c6bc..8ddd3bd 160000 --- a/shanty-tag +++ b/shanty-tag @@ -1 +1 @@ -Subproject commit a03c6bc8f56f67c8c23040898531361e2eff582f +Subproject commit 8ddd3bd64b2e5368f98b584acb6db4eb7b426cca diff --git a/shanty-web b/shanty-web index c5efe23..05ab6c0 160000 --- a/shanty-web +++ b/shanty-web @@ -1 +1 @@ -Subproject commit c5efe23d01a20da522e886c35414d06ba23f5778 +Subproject commit 05ab6c0f3ed4c818cba0a3cc15f0122e791c5cfc