A decentralized music tracking and discovery platform built on AT Protocol 🎵 rocksky.app
spotify atproto lastfm musicbrainz scrobbling listenbrainz

fix: update MusicBrainz recording handling to include release information

+15 -8
+2
crates/scrobbler/src/musicbrainz/mod.rs
··· 1 use crate::musicbrainz::{recording::Recordings, release::Release}; 2 use std::cmp::Ordering; 3
··· 1 + use anyhow::Error; 2 + 3 use crate::musicbrainz::{recording::Recordings, release::Release}; 4 use std::cmp::Ordering; 5
+2 -1
crates/scrobbler/src/scrobbler.rs
··· 695 return Ok(None); 696 } 697 let recording = recording.unwrap(); 698 - let result = mb_client.get_recording(&recording.id).await?; 699 tracing::info!("Musicbrainz (recording)"); 700 return Ok(Some(result)); 701 } 702
··· 695 return Ok(None); 696 } 697 let recording = recording.unwrap(); 698 + let mut result = mb_client.get_recording(&recording.id).await?; 699 tracing::info!("Musicbrainz (recording)"); 700 + result.releases = Some(vec![release]); 701 return Ok(Some(result)); 702 } 703
+3 -3
crates/scrobbler/src/types.rs
··· 77 .first() 78 .map(|release| release.title.clone()) 79 .unwrap_or_default(); 80 Track { 81 title: recording.title.clone(), 82 album, 83 artist: artist_credit, 84 album_artist, 85 duration: recording.length.unwrap_or_default(), 86 - year: recording 87 - .first_release_date 88 .as_ref() 89 .and_then(|date| date.split('-').next()) 90 .and_then(|year| year.parse::<u32>().ok()), 91 - release_date: recording.first_release_date.clone(), 92 track_number: releases 93 .first() 94 .and_then(|release| {
··· 77 .first() 78 .map(|release| release.title.clone()) 79 .unwrap_or_default(); 80 + let release_date = releases.first().and_then(|release| release.date.clone()); 81 Track { 82 title: recording.title.clone(), 83 album, 84 artist: artist_credit, 85 album_artist, 86 duration: recording.length.unwrap_or_default(), 87 + year: release_date 88 .as_ref() 89 .and_then(|date| date.split('-').next()) 90 .and_then(|year| year.parse::<u32>().ok()), 91 + release_date: release_date.clone(), 92 track_number: releases 93 .first() 94 .and_then(|release| {
+3
crates/webscrobbler/src/musicbrainz/mod.rs
··· 1 use crate::musicbrainz::{recording::Recordings, release::Release}; 2 use std::cmp::Ordering; 3 ··· 12 return None; 13 } 14 15 let mut candidates: Vec<&Release> = releases.iter().collect(); 16 17 if candidates.is_empty() {
··· 1 + use anyhow::Error; 2 + 3 use crate::musicbrainz::{recording::Recordings, release::Release}; 4 use std::cmp::Ordering; 5 ··· 14 return None; 15 } 16 17 + // Remove the single filtering - this was causing the issue 18 let mut candidates: Vec<&Release> = releases.iter().collect(); 19 20 if candidates.is_empty() {
+2 -1
crates/webscrobbler/src/scrobbler.rs
··· 210 return Ok(None); 211 } 212 let recording = recording.unwrap(); 213 - let result = mb_client.get_recording(&recording.id).await?; 214 tracing::info!("Musicbrainz (recording)"); 215 return Ok(Some(result)); 216 } 217
··· 210 return Ok(None); 211 } 212 let recording = recording.unwrap(); 213 + let mut result = mb_client.get_recording(&recording.id).await?; 214 tracing::info!("Musicbrainz (recording)"); 215 + result.releases = Some(vec![release]); 216 return Ok(Some(result)); 217 } 218
+3 -3
crates/webscrobbler/src/types.rs
··· 161 .map(|credit| credit.name.clone()) 162 .unwrap_or_default(); 163 let releases = recording.releases.unwrap_or_default(); 164 let album_artist = releases 165 .first() 166 .and_then(|release| { ··· 178 artist: artist_credit, 179 album_artist, 180 duration: recording.length.unwrap_or_default(), 181 - year: recording 182 - .first_release_date 183 .as_ref() 184 .and_then(|date| date.split('-').next()) 185 .and_then(|year| year.parse::<u32>().ok()), 186 - release_date: recording.first_release_date.clone(), 187 track_number: releases 188 .first() 189 .and_then(|release| {
··· 161 .map(|credit| credit.name.clone()) 162 .unwrap_or_default(); 163 let releases = recording.releases.unwrap_or_default(); 164 + let release_date = releases.first().and_then(|release| release.date.clone()); 165 let album_artist = releases 166 .first() 167 .and_then(|release| { ··· 179 artist: artist_credit, 180 album_artist, 181 duration: recording.length.unwrap_or_default(), 182 + year: release_date 183 .as_ref() 184 .and_then(|date| date.split('-').next()) 185 .and_then(|year| year.parse::<u32>().ok()), 186 + release_date: release_date.clone(), 187 track_number: releases 188 .first() 189 .and_then(|release| {