aboutsummaryrefslogtreecommitdiff
path: root/import/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'import/src/lib.rs')
-rw-r--r--import/src/lib.rs49
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(())
}