artifacts: implement musicbrainz tooling
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
use std::collections::HashSet;
|
||||
|
||||
use musicbrainz_rs::entity::recording::Recording;
|
||||
use musicbrainz_rs::prelude::*;
|
||||
use schemars::JsonSchema;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::artifacts::{Album, Artifact, Artist, SourceID, Track};
|
||||
|
||||
#[derive(Debug, Default, Deserialize, Serialize, JsonSchema)]
|
||||
pub struct MusicbrainzQueryArgs {
|
||||
pub mb_ids: Vec<String>
|
||||
}
|
||||
|
||||
pub async fn search_artifacts(query: MusicbrainzQueryArgs) -> Result<Vec<Artifact>, musicbrainz_rs::ApiEndpointError> {
|
||||
let mut ret = vec![];
|
||||
for mbid in query.mb_ids {
|
||||
let track = Recording::fetch()
|
||||
.id(&mbid)
|
||||
.with_releases().with_artists().with_annotations().execute_async().await?;
|
||||
|
||||
for release in track.releases.unwrap_or_default() {
|
||||
log::debug!("Found new release: {:?}", release);
|
||||
let first_artist = release.artist_credit.unwrap_or_default().first().unwrap().clone();
|
||||
ret.push(Artifact::Album(Album {
|
||||
title: release.title.clone(),
|
||||
artist: first_artist.name.clone(),
|
||||
about: release.annotation,
|
||||
sources: HashSet::from([SourceID::Musicbrainz(release.id.clone())]),
|
||||
..Default::default()
|
||||
}));
|
||||
ret.push(Artifact::Track(Track {
|
||||
album: Some(release.title),
|
||||
title: track.title.clone(),
|
||||
artist: Some(first_artist.artist.name.clone()),
|
||||
sources: HashSet::from([SourceID::Musicbrainz(release.id.clone())]),
|
||||
..Default::default()
|
||||
}));
|
||||
ret.push(Artifact::Artist(Artist {
|
||||
name: first_artist.name,
|
||||
bio: first_artist.artist.annotation,
|
||||
location: first_artist.artist.area.and_then(|area| { Some(area.name) }),
|
||||
sources: HashSet::from([SourceID::Musicbrainz(release.id)]),
|
||||
..Default::default()
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
Ok(ret)
|
||||
}
|
||||
Reference in New Issue
Block a user