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

fix: update MusicBrainz recording handling to include release information

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