diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-18 18:07:00 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-18 18:07:00 +0100 |
| commit | 0d2068477d474416d92557c5af5491527c50d11d (patch) | |
| tree | bbb240e8fba664a2b9e7dffc4c8f28204c28cb3c /import/src | |
| parent | 313e00bff8a21bfddb54130cffaad4af7eb36d48 (diff) | |
| download | jellything-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.rs | 28 | ||||
| -rw-r--r-- | import/src/plugins/trakt.rs | 116 |
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(()) } |