diff options
author | metamuffin <metamuffin@disroot.org> | 2025-04-23 19:04:33 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-04-23 19:04:33 +0200 |
commit | 388ae00ce1d510143789e85732831280ec803da7 (patch) | |
tree | 470092c081ca2abf71d884461f6d8c0cb2269748 /import/src/lib.rs | |
parent | 960007b06e2b47d41f88365c26f043f61c817f08 (diff) | |
download | jellything-388ae00ce1d510143789e85732831280ec803da7.tar jellything-388ae00ce1d510143789e85732831280ec803da7.tar.bz2 jellything-388ae00ce1d510143789e85732831280ec803da7.tar.zst |
more work on musicbrainz
Diffstat (limited to 'import/src/lib.rs')
-rw-r--r-- | import/src/lib.rs | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/import/src/lib.rs b/import/src/lib.rs index b45361a..f033171 100644 --- a/import/src/lib.rs +++ b/import/src/lib.rs @@ -18,6 +18,7 @@ use jellyclient::{ }; use jellyremuxer::metadata::checked_matroska_metadata; use log::info; +use musicbrainz::MusicBrainz; use rayon::iter::{ParallelBridge, ParallelIterator}; use regex::Regex; use std::{ @@ -58,6 +59,7 @@ struct Apis { trakt: Option<Trakt>, tmdb: Option<Tmdb>, acoustid: Option<AcoustID>, + musicbrainz: MusicBrainz, } pub fn is_importing() -> bool { @@ -84,6 +86,7 @@ fn import(db: &Database, incremental: bool) -> Result<()> { trakt: SECRETS.api.trakt.as_ref().map(|key| Trakt::new(key)), tmdb: SECRETS.api.tmdb.as_ref().map(|key| Tmdb::new(key)), acoustid: SECRETS.api.acoustid.as_ref().map(|key| AcoustID::new(key)), + musicbrainz: MusicBrainz::new(), }; let rthandle = Handle::current(); @@ -367,11 +370,15 @@ fn import_media_file( for (key, value) in &tags { match key.as_str() { - "MUSICBRAINZ_TRACKID" => eids.insert("musicbrainz.track".to_string(), value.to_owned()), + "MUSICBRAINZ_TRACKID" => { + eids.insert("musicbrainz.recording".to_string(), value.to_owned()) + } "MUSICBRAINZ_ARTISTID" => { eids.insert("musicbrainz.artist".to_string(), value.to_owned()) } - "MUSICBRAINZ_ALBUMID" => eids.insert("musicbrainz.album".to_string(), value.to_owned()), + "MUSICBRAINZ_ALBUMID" => { + eids.insert("musicbrainz.release".to_string(), value.to_owned()) + } "MUSICBRAINZ_ALBUMARTISTID" => { eids.insert("musicbrainz.albumartist".to_string(), value.to_owned()) } @@ -393,10 +400,12 @@ fn import_media_file( .get_atid_mbid(&fp), )? { eids.insert("acoustid.track".to_string(), atid); - eids.insert("musicbrainz.track".to_string(), mbid); + eids.insert("musicbrainz.recording".to_string(), mbid); }; } + let mbrec = eids.get("musicbrainz.recording").cloned(); + db.update_node_init(node, |node| { node.slug = slug; node.title = info.title.or(node.title.clone()); @@ -599,6 +608,9 @@ fn import_media_file( for tok in filename_toks { apply_node_flag(db, rthandle, apis, node, tok)?; } + if let Some(mbid) = mbrec { + apply_musicbrainz_recording(db, rthandle, apis, node, mbid)?; + } Ok(()) } @@ -652,6 +664,37 @@ fn apply_node_flag( Ok(()) })?; } + if let Some(mbid) = flag.strip_prefix("mbrec-").or(flag.strip_prefix("mbrec=")) { + apply_musicbrainz_recording(db, rthandle, apis, node, mbid.to_string())? + } + Ok(()) +} + +fn apply_musicbrainz_recording( + db: &Database, + rthandle: &Handle, + apis: &Apis, + node: NodeID, + mbid: String, +) -> Result<()> { + let rec = rthandle.block_on(apis.musicbrainz.lookup_recording(mbid))?; + + db.update_node_init(node, |node| { + node.title = Some(rec.title.clone()); + node.external_ids + .insert("musicbrainz.recording".to_string(), rec.id.to_string()); + if let Some(a) = rec.artist_credit.get(0) { + node.subtitle = Some(a.artist.name.clone()); + node.external_ids + .insert("musicbrainz.artist".to_string(), a.artist.id.to_string()); + } + + for isrc in &rec.isrcs { + node.external_ids + .insert("isrc".to_string(), isrc.to_string()); + } + Ok(()) + })?; Ok(()) } |