Some code cleanup

This commit is contained in:
Connor Johnstone
2026-03-04 23:28:29 -05:00
parent d59235707d
commit 70aedb49f2
4 changed files with 345 additions and 295 deletions

View File

@@ -98,6 +98,37 @@ impl LastfmClient {
Ok(None)
}
/// Try MBID lookup then name lookup, returning whichever yields more results.
#[allow(clippy::type_complexity)]
fn dual_lookup<T>(
&self,
method: &str,
artist_mbid: &str,
artist_name: Option<&str>,
extra_params: &str,
parse: fn(&str) -> Result<Vec<T>, Box<dyn std::error::Error>>,
) -> Result<Vec<T>, Box<dyn std::error::Error>> {
let mbid_url = format!(
"{}?method={}&mbid={}&api_key={}{}&format=json",
BASE_URL, method, artist_mbid, self.api_key, extra_params
);
let mbid_results = match self.fetch_or_none(&mbid_url)? {
Some(body) => parse(&body).unwrap_or_default(),
None => Vec::new(),
};
let name_results = match self.fetch_by_name(method, artist_name, extra_params)? {
Some(body) => parse(&body).unwrap_or_default(),
None => Vec::new(),
};
if name_results.len() > mbid_results.len() {
Ok(name_results)
} else {
Ok(mbid_results)
}
}
fn parse_similar_artists(body: &str) -> Result<Vec<SimilarArtist>, Box<dyn std::error::Error>> {
let resp: SimilarArtistsResponse = serde_json::from_str(body)?;
Ok(resp
@@ -120,30 +151,13 @@ impl LastfmClient {
artist_mbid: &str,
artist_name: Option<&str>,
) -> Result<Vec<SimilarArtist>, Box<dyn std::error::Error>> {
let method = "artist.getSimilar";
let extra = "&limit=500";
// Try MBID lookup
let mbid_url = format!(
"{}?method={}&mbid={}&api_key={}{}&format=json",
BASE_URL, method, artist_mbid, self.api_key, extra
);
let mbid_results = match self.fetch_or_none(&mbid_url)? {
Some(body) => Self::parse_similar_artists(&body).unwrap_or_default(),
None => Vec::new(),
};
// Try name lookup and return whichever has more results
let name_results = match self.fetch_by_name(method, artist_name, extra)? {
Some(body) => Self::parse_similar_artists(&body).unwrap_or_default(),
None => Vec::new(),
};
if name_results.len() > mbid_results.len() {
Ok(name_results)
} else {
Ok(mbid_results)
}
self.dual_lookup(
"artist.getSimilar",
artist_mbid,
artist_name,
"&limit=500",
Self::parse_similar_artists,
)
}
fn parse_top_tracks(body: &str) -> Result<Vec<TopTrack>, Box<dyn std::error::Error>> {
@@ -165,29 +179,12 @@ impl LastfmClient {
artist_mbid: &str,
artist_name: Option<&str>,
) -> Result<Vec<TopTrack>, Box<dyn std::error::Error>> {
let method = "artist.getTopTracks";
let extra = "&limit=1000";
// Try MBID lookup
let mbid_url = format!(
"{}?method={}&mbid={}&api_key={}{}&format=json",
BASE_URL, method, artist_mbid, self.api_key, extra
);
let mbid_results = match self.fetch_or_none(&mbid_url)? {
Some(body) => Self::parse_top_tracks(&body).unwrap_or_default(),
None => Vec::new(),
};
// Try name lookup and return whichever has more results
let name_results = match self.fetch_by_name(method, artist_name, extra)? {
Some(body) => Self::parse_top_tracks(&body).unwrap_or_default(),
None => Vec::new(),
};
if name_results.len() > mbid_results.len() {
Ok(name_results)
} else {
Ok(mbid_results)
}
self.dual_lookup(
"artist.getTopTracks",
artist_mbid,
artist_name,
"&limit=1000",
Self::parse_top_tracks,
)
}
}