aboutsummaryrefslogtreecommitdiff
path: root/import/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-18 18:07:00 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-18 18:07:00 +0100
commit0d2068477d474416d92557c5af5491527c50d11d (patch)
treebbb240e8fba664a2b9e7dffc4c8f28204c28cb3c /import/src
parent313e00bff8a21bfddb54130cffaad4af7eb36d48 (diff)
downloadjellything-0d2068477d474416d92557c5af5491527c50d11d.tar
jellything-0d2068477d474416d92557c5af5491527c50d11d.tar.bz2
jellything-0d2068477d474416d92557c5af5491527c50d11d.tar.zst
add credits via trakt/tmdb
Diffstat (limited to 'import/src')
-rw-r--r--import/src/plugins/tmdb.rs28
-rw-r--r--import/src/plugins/trakt.rs116
2 files changed, 106 insertions, 38 deletions
diff --git a/import/src/plugins/tmdb.rs b/import/src/plugins/tmdb.rs
index b7bd797..dfdf020 100644
--- a/import/src/plugins/tmdb.rs
+++ b/import/src/plugins/tmdb.rs
@@ -187,6 +187,7 @@ impl ImportPlugin for Tmdb {
fn process(&self, ct: &PluginContext, node: RowNum) -> Result<()> {
self.process_primary(ct, node)?;
self.process_episode(ct, node)?;
+ self.process_person(ct, node)?;
Ok(())
}
}
@@ -311,6 +312,33 @@ impl Tmdb {
node
})
}
+
+ fn process_person(&self, ct: &PluginContext, node: RowNum) -> Result<()> {
+ let data = ct.ic.get_node(node)?.unwrap();
+ let data = data.as_object();
+
+ let Some(id) = data
+ .get(NO_IDENTIFIERS)
+ .unwrap_or_default()
+ .get(IDENT_TMDB_PERSON)
+ else {
+ return Ok(());
+ };
+
+ let images = self.person_image(&ct.ic.cache, id, ct.rt)?;
+ let Some(prof) = images.profiles.first() else {
+ return Ok(());
+ };
+
+ let image = self.image(&ct.ic.cache, &prof.file_path, ct.rt)?;
+
+ ct.ic.update_node(node, |node| {
+ node.as_object()
+ .update(NO_PICTURES, |pict| pict.insert(PICT_COVER, &image))
+ })?;
+
+ Ok(())
+ }
}
pub fn parse_release_date(d: &str) -> Result<Option<i64>> {
diff --git a/import/src/plugins/trakt.rs b/import/src/plugins/trakt.rs
index 8d8a6c6..cc6810c 100644
--- a/import/src/plugins/trakt.rs
+++ b/import/src/plugins/trakt.rs
@@ -9,8 +9,11 @@ use crate::{
};
use anyhow::{Context, Result, anyhow, bail};
use jellycache::{Cache, HashKey};
-use jellycommon::{jellyobject::Tag, *};
-use jellydb::RowNum;
+use jellycommon::{
+ jellyobject::{ObjectBuffer, Path, Tag},
+ *,
+};
+use jellydb::{Filter, Query, RowNum, Sort};
use log::info;
use reqwest::{
Client, ClientBuilder,
@@ -431,8 +434,8 @@ impl ImportPlugin for Trakt {
}
impl Trakt {
- fn process_primary(&self, ct: &PluginContext, node: RowNum) -> Result<()> {
- let data = ct.ic.get_node(node)?.unwrap();
+ fn process_primary(&self, ct: &PluginContext, node_row: RowNum) -> Result<()> {
+ let data = ct.ic.get_node(node_row)?.unwrap();
let data = data.as_object();
let (trakt_kind, trakt_id): (_, u64) = if let Some(id) = data
.get(NO_IDENTIFIERS)
@@ -451,35 +454,21 @@ impl Trakt {
};
let details = self.lookup(&ct.ic.cache, trakt_kind, trakt_id, ct.rt)?;
- // let people = self.people(trakt_kind, trakt_id, ct.rt)?;
+ let people = self.people(&ct.ic.cache, trakt_kind, trakt_id, ct.rt)?;
- // let mut people_map = BTreeMap::<CreditCategory, Vec<Appearance>>::new();
- // for p in people.cast.iter() {
- // people_map
- // .entry(CreditCategory::Cast)
- // .or_default()
- // .push(p.a())
- // }
- // for (group, people) in people.crew.iter() {
- // for p in people {
- // people_map
- // .entry(group.as_credit_category())
- // .or_default()
- // .push(p.a())
- // }
- // }
+ let mut appearances = Vec::new();
+ for p in people.cast.iter() {
+ appearances.push((CRCAT_CAST, p.to_owned()));
+ }
+ for (group, people) in people.crew.iter() {
+ for p in people {
+ appearances.push((group.as_credit_category(), p.to_owned()));
+ }
+ }
- // for p in people_map.values_mut().flatten() {
- // if let Some(id) = p.person.ids.tmdb {
- // let k = rthandle.block_on(tmdb.person_image(id))?;
- // if let Some(prof) = k.profiles.first() {
- // let im = rthandle.block_on(tmdb.image(&prof.file_path))?;
- // p.person.headshot = Some(AssetInner::Cache(im).ser());
- // }
- // }
- // }
+ ct.ic.db.transaction(&mut |txn| {
+ let mut node = txn.get(node_row)?.unwrap();
- ct.ic.update_node(node, |mut node| {
node = node.as_object().insert(NO_KIND, trakt_kind.as_node_kind());
node = node.as_object().insert(NO_TITLE, &details.title);
if let Some(overview) = &details.overview {
@@ -499,21 +488,72 @@ impl Trakt {
});
}
if let Some(x) = details.ids.tmdb.clone() {
- let key = match trakt_kind {
- TraktKind::Movie => IDENT_TMDB_MOVIE,
- TraktKind::Show => IDENT_TMDB_SERIES,
- _ => return node,
+ if let Some(key) = match trakt_kind {
+ TraktKind::Movie => Some(IDENT_TMDB_MOVIE),
+ TraktKind::Show => Some(IDENT_TMDB_SERIES),
+ _ => None,
+ } {
+ node = node
+ .as_object()
+ .update(NO_IDENTIFIERS, |idents| idents.insert(key, &x.to_string()));
};
- node = node
- .as_object()
- .update(NO_IDENTIFIERS, |idents| idents.insert(key, &x.to_string()));
}
if let Some(rating) = details.rating {
node = node
.as_object()
.update(NO_RATINGS, |idents| idents.insert(RTYP_TRAKT, rating));
}
- node
+
+ let mut credits = Vec::new();
+ for (crcat, ap) in &appearances {
+ if let Some(traktid) = ap.person.ids.trakt {
+ let slug = format!("trakt-person-{traktid}");
+ let role = ap
+ .characters
+ .iter()
+ .cloned()
+ .chain(ap.jobs.iter().cloned())
+ .collect::<Vec<String>>()
+ .join(", ");
+
+ let row = match txn.query_single(Query {
+ filter: Filter::Match(Path(vec![NO_SLUG.0]), slug.as_str().into()),
+ sort: Sort::None,
+ })? {
+ Some(r) => r,
+ None => txn.insert(ObjectBuffer::new(&mut [
+ (NO_SLUG.0, &slug.as_str()),
+ (NO_VISIBILITY.0, &VISI_VISIBLE),
+ (NO_TITLE.0, &ap.person.name.as_str()),
+ (NO_IDENTIFIERS.0, &{
+ let mut o = ObjectBuffer::empty();
+ o = o.as_object().insert(IDENT_TRAKT_PERSON, traktid);
+ if let Some(tmdbid) = ap.person.ids.tmdb {
+ o = o.as_object().insert(IDENT_TMDB_PERSON, tmdbid);
+ }
+ if let Some(imdbid) = &ap.person.ids.imdb {
+ o = o.as_object().insert(IDENT_IMDB_PERSON, imdbid);
+ }
+ o
+ }),
+ ]))?,
+ };
+ credits.push(ObjectBuffer::new(&mut [
+ (CR_KIND.0, crcat),
+ (CR_ROLE.0, &role.as_str()),
+ (CR_NODE.0, &row),
+ ]));
+
+ ct.pending_nodes.lock().unwrap().insert(row);
+ }
+ }
+
+ node = node
+ .as_object()
+ .extend_object(NO_CREDIT, CR_NODE.0, credits);
+
+ txn.update(node_row, node)?;
+ Ok(())
})?;
Ok(())
}