diff options
Diffstat (limited to 'import/src/plugins')
| -rw-r--r-- | import/src/plugins/acoustid.rs | 10 | ||||
| -rw-r--r-- | import/src/plugins/infojson.rs | 42 | ||||
| -rw-r--r-- | import/src/plugins/media_info.rs | 108 | ||||
| -rw-r--r-- | import/src/plugins/misc.rs | 31 | ||||
| -rw-r--r-- | import/src/plugins/musicbrainz.rs | 45 | ||||
| -rw-r--r-- | import/src/plugins/omdb.rs | 21 | ||||
| -rw-r--r-- | import/src/plugins/tags.rs | 10 | ||||
| -rw-r--r-- | import/src/plugins/tmdb.rs | 53 | ||||
| -rw-r--r-- | import/src/plugins/trakt.rs | 80 | ||||
| -rw-r--r-- | import/src/plugins/vgmdb.rs | 8 | ||||
| -rw-r--r-- | import/src/plugins/wikidata.rs | 8 |
11 files changed, 181 insertions, 235 deletions
diff --git a/import/src/plugins/acoustid.rs b/import/src/plugins/acoustid.rs index e0d1a96..caeeea5 100644 --- a/import/src/plugins/acoustid.rs +++ b/import/src/plugins/acoustid.rs @@ -192,10 +192,12 @@ impl ImportPlugin for AcoustID { }; ct.ic.update_node(node, |node| { - node.as_object().update(NO_IDENTIFIERS, |ids| { - ids.insert_s(ct.is, IDENT_ACOUST_ID_TRACK, &atid) - .as_object() - .insert_s(ct.is, IDENT_MUSICBRAINZ_RECORDING, &mbid) + node.update(NO_IDENTIFIERS, |ids| { + ids.insert_s(ct.is, IDENT_ACOUST_ID_TRACK, &atid).insert_s( + ct.is, + IDENT_MUSICBRAINZ_RECORDING, + &mbid, + ) }) })?; diff --git a/import/src/plugins/infojson.rs b/import/src/plugins/infojson.rs index 8a3ba5d..dfa5279 100644 --- a/import/src/plugins/infojson.rs +++ b/import/src/plugins/infojson.rs @@ -181,23 +181,23 @@ impl ImportPlugin for Infojson { ct.ic.db.transaction(&mut |txn| { let mut node = txn.get(parent)?.unwrap(); - node = node.as_object().insert_s(ct.is, NO_KIND, KIND_CHANNEL); - node = node.as_object().insert_s(ct.is, NO_TITLE, title); + node = node.insert_s(ct.is, NO_KIND, KIND_CHANNEL); + node = node.insert_s(ct.is, NO_TITLE, title); if let Some(cid) = &data.channel_id { - node = node.as_object().update(NO_IDENTIFIERS, |ids| { + node = node.update(NO_IDENTIFIERS, |ids| { ids.insert_s(ct.is, IDENT_YOUTUBE_CHANNEL, &cid) }); } if let Some(uid) = &data.uploader_id { - node = node.as_object().update(NO_IDENTIFIERS, |ids| { + node = node.update(NO_IDENTIFIERS, |ids| { ids.insert_s(ct.is, IDENT_YOUTUBE_CHANNEL_HANDLE, &uid) }) } if let Some(desc) = &data.description { - node = node.as_object().insert_s(ct.is, NO_DESCRIPTION, &desc); + node = node.insert_s(ct.is, NO_DESCRIPTION, &desc); } if let Some(followers) = data.channel_follower_count { - node = node.as_object().update(NO_RATINGS, |rat| { + node = node.update(NO_RATINGS, |rat| { rat.insert_s(ct.is, RTYP_YOUTUBE_SUBSCRIBERS, followers as f64) }); } @@ -242,45 +242,41 @@ impl ImportPlugin for Infojson { ct.ic.db.transaction(&mut |txn| { let mut node = txn.get(row)?.unwrap(); - node = node.as_object().insert_s(ct.is, NO_KIND, kind); - node = node.as_object().insert_s(ct.is, NO_TITLE, &infojson.title); + node = node.insert_s(ct.is, NO_KIND, kind); + node = node.insert_s(ct.is, NO_TITLE, &infojson.title); if let Some(title) = &infojson.alt_title && title != &infojson.title - && !node.as_object().has(NO_SUBTITLE.0) + && !node.has(NO_SUBTITLE.0) { - node = node.as_object().insert_s(ct.is, NO_SUBTITLE, &title); + node = node.insert_s(ct.is, NO_SUBTITLE, &title); } if let Some(up) = &infojson.uploader - && !node.as_object().has(NO_SUBTITLE.0) + && !node.has(NO_SUBTITLE.0) { - node = node - .as_object() - .insert_s(ct.is, NO_SUBTITLE, &clean_uploader_name(&up)); + node = node.insert_s(ct.is, NO_SUBTITLE, &clean_uploader_name(&up)); } if let Some(desc) = &infojson.description { - node = node.as_object().insert_s(ct.is, NO_DESCRIPTION, &desc); + node = node.insert_s(ct.is, NO_DESCRIPTION, &desc); } if let Some(tag) = infojson.tags.clone() { - node = node - .as_object() - .extend(NO_TAG, tag.iter().map(String::as_str)); + node = node.extend(NO_TAG, tag.iter().map(String::as_str)); } if let Some(rd) = release_date { - node = node.as_object().insert_s(ct.is, NO_RELEASEDATE, rd); + node = node.insert_s(ct.is, NO_RELEASEDATE, rd); } match infojson.extractor.as_str() { "youtube" => { - node = node.as_object().update(NO_IDENTIFIERS, |rat| { + node = node.update(NO_IDENTIFIERS, |rat| { rat.insert_s(ct.is, IDENT_YOUTUBE_VIDEO, &infojson.id) }); - node = node.as_object().update(NO_RATINGS, |rat| { + node = node.update(NO_RATINGS, |rat| { rat.insert_s( ct.is, RTYP_YOUTUBE_VIEWS, infojson.view_count.unwrap_or_default() as f64, ) }); - node = node.as_object().update(NO_RATINGS, |rat| { + node = node.update(NO_RATINGS, |rat| { rat.insert_s( ct.is, RTYP_YOUTUBE_LIKES, @@ -289,7 +285,7 @@ impl ImportPlugin for Infojson { }); } "Bandcamp" => { - node = node.as_object().update(NO_IDENTIFIERS, |rat| { + node = node.update(NO_IDENTIFIERS, |rat| { rat.insert_s(ct.is, IDENT_BANDCAMP, &infojson.id) }); } diff --git a/import/src/plugins/media_info.rs b/import/src/plugins/media_info.rs index f21386e..5daa3ba 100644 --- a/import/src/plugins/media_info.rs +++ b/import/src/plugins/media_info.rs @@ -9,10 +9,7 @@ use crate::{ source_rank::ObjectImportSourceExt, }; use anyhow::Result; -use jellycommon::{ - jellyobject::{Object, ObjectBuffer}, - *, -}; +use jellycommon::{jellyobject::OBB, *}; use jellydb::RowNum; use jellyremuxer::matroska::{Segment, TrackType}; use std::path::Path; @@ -32,84 +29,83 @@ impl ImportPlugin for MediaInfo { ct.ic.db.transaction(&mut |txn| { let mut node = txn.get(row)?.unwrap(); if let Some(tracks) = &seg.tracks { - node = node.as_object().extend_object( + node = node.extend_object( NO_TRACK, TR_SOURCE.0, - tracks.entries.iter().map(|t| { - let mut track = ObjectBuffer::empty(); - track = track.as_object().insert(TR_CODEC, &t.codec_id); - track = track.as_object().insert(TR_LANGUAGE, t.language.as_str()); - if let Some(name) = &t.name { - track = track.as_object().insert(TR_NAME, name); - } - track = track.as_object().insert( - TR_KIND, - match t.track_type { - TrackType::Audio => TRKIND_AUDIO, - TrackType::Video => TRKIND_VIDEO, - TrackType::Subtitle => TRKIND_TEXT, - _ => TRKIND_UNKNOWN, - }, - ); - if let Some(v) = &t.video { - track = track - .as_object() - .insert(TR_PIXEL_WIDTH, v.pixel_width as u32); - track = track - .as_object() - .insert(TR_PIXEL_HEIGHT, v.pixel_height as u32); - if let Some(fr) = v.frame_rate { - track = track.as_object().insert(TR_RATE, fr); + &tracks + .entries + .iter() + .map(|t| { + let mut track = OBB::new(); + track.push(TR_CODEC, &t.codec_id); + track.push(TR_LANGUAGE, &t.language); + if let Some(name) = &t.name { + track.push(TR_NAME, name); + } + track.push( + TR_KIND, + match t.track_type { + TrackType::Audio => TRKIND_AUDIO, + TrackType::Video => TRKIND_VIDEO, + TrackType::Subtitle => TRKIND_TEXT, + _ => TRKIND_UNKNOWN, + }, + ); + if let Some(v) = &t.video { + track.push(TR_PIXEL_WIDTH, v.pixel_width as u32); + track.push(TR_PIXEL_HEIGHT, v.pixel_height as u32); + if let Some(fr) = v.frame_rate { + track.push(TR_RATE, fr); + } } - } - if let Some(a) = &t.audio { - track = track.as_object().insert(TR_CHANNELS, a.channels as u32); - track = track.as_object().insert(TR_RATE, a.sampling_frequency); - if let Some(d) = a.bit_depth { - track = track.as_object().insert(TR_BIT_DEPTH, d as u32); + if let Some(a) = &t.audio { + track.push(TR_CHANNELS, a.channels as u32); + track.push(TR_RATE, a.sampling_frequency); + if let Some(d) = a.bit_depth { + track.push(TR_BIT_DEPTH, d as u32); + } } - } - let source = Object::EMPTY - .insert(TRSOURCE_LOCAL_PATH, &path.to_string_lossy()) - .as_object() - .insert(TRSOURCE_LOCAL_TRACKNUM, t.track_number); - track = track.as_object().insert(TR_SOURCE, source.as_object()); + let source = OBB::new() + .with(TRSOURCE_LOCAL_PATH, &path.to_string_lossy()) + .with(TRSOURCE_LOCAL_TRACKNUM, t.track_number) + .finish(); + track.push(TR_SOURCE, &source); - track - }), + track.finish() + }) + .collect::<Vec<_>>(), ); } if let Some(chapters) = &seg.chapters { - node = node.as_object().extend_object( + node = node.extend_object( NO_CHAPTER, CH_NAME.0, - chapters + &chapters .edition_entries .iter() .flat_map(|e| &e.chapter_atoms) .map(|cha| { - let mut chapter = ObjectBuffer::empty(); - chapter = chapter - .as_object() - .insert(CH_START, cha.time_start as f64 * 1e-9); + let mut chapter = OBB::new(); + chapter.push(CH_START, cha.time_start as f64 * 1e-9); if let Some(end) = cha.time_end { - chapter = chapter.as_object().insert(CH_END, end as f64 * 1e-9); + chapter.push(CH_END, end as f64 * 1e-9); } if let Some(display) = cha.displays.iter().next() { - chapter = chapter.as_object().insert(CH_NAME, &display.string); + chapter.push(CH_NAME, &display.string); } - chapter - }), + chapter.finish() + }) + .collect::<Vec<_>>(), ); } let runtime = fix_invalid_runtime( seg.info.duration.unwrap_or_default() * seg.info.timestamp_scale as f64 * 1e-9, ); - node = node.as_object().insert_s(ct.is, NO_DURATION, runtime); - node = node.as_object().insert_s(ct.is, NO_STORAGE_SIZE, size); + node = node.insert_s(ct.is, NO_DURATION, runtime); + node = node.insert_s(ct.is, NO_STORAGE_SIZE, size); txn.update(row, node)?; diff --git a/import/src/plugins/misc.rs b/import/src/plugins/misc.rs index 2c56dae..db9a8ab 100644 --- a/import/src/plugins/misc.rs +++ b/import/src/plugins/misc.rs @@ -49,9 +49,7 @@ impl ImportPlugin for ImageFiles { )?; ct.ic.db.transaction(&mut |txn| { let mut node = txn.get(row)?.unwrap(); - node = node - .as_object() - .update(NO_PICTURES, |picts| picts.insert_s(ct.is, slot, &asset)); + node = node.update(NO_PICTURES, |picts| picts.insert_s(ct.is, slot, &asset)); txn.update(row, node)?; Ok(()) })?; @@ -84,7 +82,7 @@ impl ImportPlugin for ImageAttachments { }; ct.ic.update_node(row, |node| { - node.as_object().update(NO_PICTURES, |picts| { + node.update(NO_PICTURES, |picts| { picts.insert_s(ct.is, PICT_COVER, &cover) }) })?; @@ -105,13 +103,12 @@ impl ImportPlugin for General { fn instruction(&self, ct: &PluginContext, node: RowNum, line: &str) -> Result<()> { if line == "hidden" { ct.ic.update_node(node, |node| { - node.as_object().insert_s(ct.is, NO_VISIBILITY, VISI_HIDDEN) + node.insert_s(ct.is, NO_VISIBILITY, VISI_HIDDEN) })?; } if line == "reduced" { ct.ic.update_node(node, |node| { - node.as_object() - .insert_s(ct.is, NO_VISIBILITY, VISI_REDUCED) + node.insert_s(ct.is, NO_VISIBILITY, VISI_REDUCED) })?; } if let Some(kind) = line.strip_prefix("kind-").or(line.strip_prefix("kind=")) { @@ -129,18 +126,16 @@ impl ImportPlugin for General { _ => bail!("unknown node kind"), }; ct.ic - .update_node(node, |node| node.as_object().insert_s(ct.is, NO_KIND, kind))?; + .update_node(node, |node| node.insert_s(ct.is, NO_KIND, kind))?; } if let Some(title) = line.strip_prefix("title=") { - ct.ic.update_node(node, |node| { - node.as_object().insert_s(ct.is, NO_TITLE, title) - })?; + ct.ic + .update_node(node, |node| node.insert_s(ct.is, NO_TITLE, title))?; } if let Some(index) = line.strip_prefix("index=") { let index = index.parse().context("parse index")?; - ct.ic.update_node(node, |node| { - node.as_object().insert_s(ct.is, NO_INDEX, index) - })?; + ct.ic + .update_node(node, |node| node.insert_s(ct.is, NO_INDEX, index))?; } Ok(()) } @@ -166,7 +161,7 @@ impl ImportPlugin for Children { continue; } ct.ic - .update_node_slug(line, |n| n.as_object().extend(NO_PARENT, [parent]))?; + .update_node_slug(line, |n| n.extend(NO_PARENT, [parent]))?; } } Ok(()) @@ -198,9 +193,9 @@ impl ImportPlugin for EpisodeIndex { .context("parse season num")?; ct.ic.update_node(node, |mut node| { - node = node.as_object().insert_s(ct.is, NO_SEASON_INDEX, season); - node = node.as_object().insert_s(ct.is, NO_INDEX, episode); - node = node.as_object().insert_s(ct.is, NO_KIND, KIND_EPISODE); + node = node.insert_s(ct.is, NO_SEASON_INDEX, season); + node = node.insert_s(ct.is, NO_INDEX, episode); + node = node.insert_s(ct.is, NO_KIND, KIND_EPISODE); node })?; } diff --git a/import/src/plugins/musicbrainz.rs b/import/src/plugins/musicbrainz.rs index ec44d11..deed38b 100644 --- a/import/src/plugins/musicbrainz.rs +++ b/import/src/plugins/musicbrainz.rs @@ -15,7 +15,10 @@ use crate::{ }; use anyhow::{Context, Result}; use jellycache::Cache; -use jellycommon::{jellyobject::ObjectBuffer, *}; +use jellycommon::{ + jellyobject::{EMPTY, OBB}, + *, +}; use jellydb::RowNum; use log::info; use reqwest::{ @@ -354,11 +357,11 @@ impl ImportPlugin for MusicBrainz { impl MusicBrainz { fn process_recording(&self, ct: &PluginContext, node_row: RowNum) -> Result<()> { let data = ct.ic.get_node(node_row)?.unwrap(); - let data = data.as_object(); + let data = data; let Some(mbid) = data .get(NO_IDENTIFIERS) - .unwrap_or_default() + .unwrap_or(EMPTY) .get(IDENT_MUSICBRAINZ_RECORDING) else { return Ok(()); @@ -369,13 +372,11 @@ impl MusicBrainz { ct.ic.db.transaction(&mut |txn| { let mut node = txn.get(node_row)?.unwrap(); - node = node.as_object().insert_s(ct.is, NO_TITLE, &rec.title); + node = node.insert_s(ct.is, NO_TITLE, &rec.title); if let Some(a) = rec.artist_credit.first() { - node = node - .as_object() - .insert_s(ct.is, NO_SUBTITLE, &a.artist.name); + node = node.insert_s(ct.is, NO_SUBTITLE, &a.artist.name); } - node = node.as_object().update(NO_IDENTIFIERS, |ids| { + node = node.update(NO_IDENTIFIERS, |ids| { ids.insert_multi( IDENT_ISRC, &rec.isrcs.iter().map(|e| e.as_str()).collect::<Vec<_>>(), @@ -401,21 +402,19 @@ impl MusicBrainz { let artist_row = get_or_insert_slug(txn, &artist_slug)?; let mut artist_node = txn.get(artist_row)?.unwrap(); - artist_node = artist_node.as_object().update(NO_IDENTIFIERS, |ids| { + artist_node = artist_node.update(NO_IDENTIFIERS, |ids| { ids.insert_s(ct.is, IDENT_MUSICBRAINZ_ARTIST, &artist.id) }); - artist_node = artist_node.as_object().insert(NO_KIND, KIND_PERSON); + artist_node = artist_node.insert(NO_KIND, KIND_PERSON); txn.update(artist_row, artist_node)?; ct.pending_nodes.lock().unwrap().insert(artist_row); - let credit = ObjectBuffer::new(&mut [ - (CR_NODE.0, &artist_row), - (CR_KIND.0, &cat), - (CR_ROLE.0, &role), - ]); - node = node - .as_object() - .extend_object(NO_CREDIT, CR_NODE.0, Some(credit)) + let credit = OBB::new() + .with(CR_NODE, artist_row) + .with(CR_KIND, cat) + .with(CR_ROLE, role) + .finish(); + node = node.extend_object(NO_CREDIT, CR_NODE.0, &[credit]) } txn.update(node_row, node) @@ -426,11 +425,11 @@ impl MusicBrainz { fn process_artist(&self, ct: &PluginContext, node_row: RowNum) -> Result<()> { let data = ct.ic.get_node(node_row)?.unwrap(); - let data = data.as_object(); + let data = data; let Some(mbid) = data .get(NO_IDENTIFIERS) - .unwrap_or_default() + .unwrap_or(EMPTY) .get(IDENT_MUSICBRAINZ_ARTIST) else { return Ok(()); @@ -440,7 +439,7 @@ impl MusicBrainz { ct.ic.db.transaction(&mut |txn| { let mut node = txn.get(node_row)?.unwrap(); - node = node.as_object().insert_s(ct.is, NO_TITLE, &artist.name); + node = node.insert_s(ct.is, NO_TITLE, &artist.name); for rel in &artist.relations { let url = rel.url.as_ref().map(|u| u.resource.clone()); @@ -449,7 +448,7 @@ impl MusicBrainz { if let Some(url) = url && let Some(id) = url.strip_prefix("https://www.wikidata.org/wiki/") { - node = node.as_object().update(NO_IDENTIFIERS, |ids| { + node = node.update(NO_IDENTIFIERS, |ids| { ids.insert_s(ct.is, IDENT_WIKIDATA, id) }) } @@ -458,7 +457,7 @@ impl MusicBrainz { if let Some(url) = url && let Some(id) = url.strip_prefix("https://vgmdb.net/artist/") { - node = node.as_object().update(NO_IDENTIFIERS, |ids| { + node = node.update(NO_IDENTIFIERS, |ids| { ids.insert_s(ct.is, IDENT_VGMDB_ARTIST, id) }) } diff --git a/import/src/plugins/omdb.rs b/import/src/plugins/omdb.rs index 3b97a9d..5d99fcb 100644 --- a/import/src/plugins/omdb.rs +++ b/import/src/plugins/omdb.rs @@ -4,14 +4,9 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ -use std::sync::Arc; - use anyhow::{Context, Result, anyhow}; use jellycache::Cache; -use jellycommon::{ - IDENT_IMDB, MSOURCE_OMDB, NO_DESCRIPTION, NO_IDENTIFIERS, NO_RATINGS, NO_TITLE, RTYP_IMDB, - RTYP_METACRITIC, RTYP_ROTTEN_TOMATOES, -}; +use jellycommon::{jellyobject::EMPTY, *}; use jellydb::RowNum; use log::info; use reqwest::{ @@ -19,6 +14,7 @@ use reqwest::{ header::{HeaderMap, HeaderName, HeaderValue}, }; use serde::{Deserialize, Serialize}; +use std::sync::Arc; use tokio::runtime::Handle; use crate::{ @@ -124,9 +120,8 @@ impl ImportPlugin for Omdb { } fn process(&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_IMDB) else { + let Some(id) = data.get(NO_IDENTIFIERS).unwrap_or(EMPTY).get(IDENT_IMDB) else { return Ok(()); }; @@ -154,10 +149,8 @@ impl ImportPlugin for Omdb { .transpose()?; ct.ic.update_node(node, |mut node| { - node = node.as_object().insert_s(ct.is, NO_TITLE, &entry.title); - node = node - .as_object() - .insert_s(ct.is, NO_DESCRIPTION, &entry.plot); + node = node.insert_s(ct.is, NO_TITLE, &entry.title); + node = node.insert_s(ct.is, NO_DESCRIPTION, &entry.plot); for (typ, val) in [ (RTYP_METACRITIC, metascore), @@ -165,9 +158,7 @@ impl ImportPlugin for Omdb { (RTYP_ROTTEN_TOMATOES, rotten_tomatoes), ] { if let Some(x) = val { - node = node - .as_object() - .update(NO_RATINGS, |rts| rts.insert_s(ct.is, typ, x)); + node = node.update(NO_RATINGS, |rts| rts.insert_s(ct.is, typ, x)); } } node diff --git a/import/src/plugins/tags.rs b/import/src/plugins/tags.rs index c27ea70..901bcc6 100644 --- a/import/src/plugins/tags.rs +++ b/import/src/plugins/tags.rs @@ -39,16 +39,16 @@ impl ImportPlugin for Tags { ct.ic.update_node(node, |mut node| { if let Some(title) = &seg.info.title { - node = node.as_object().insert_s(ct.is, NO_TITLE, title); + node = node.insert_s(ct.is, NO_TITLE, title); } for (key, value) in &tags { match key.as_str() { "DESCRIPTION" | "SYNOPSIS" => { - node = node.as_object().insert_s(ct.is, NO_DESCRIPTION, &value) + node = node.insert_s(ct.is, NO_DESCRIPTION, &value) } - "COMMENT" => node = node.as_object().insert(NO_TAGLINE, &value), + "COMMENT" => node = node.insert(NO_TAGLINE, &value), "CONTENT_TYPE" => { - node = node.as_object().insert_s( + node = node.insert_s( ct.is, NO_KIND, match value.to_lowercase().trim() { @@ -69,7 +69,7 @@ impl ImportPlugin for Tags { "BARCODE" => IDENT_BARCODE, _ => continue, }; - node = node.as_object().update(NO_IDENTIFIERS, |idents| { + node = node.update(NO_IDENTIFIERS, |idents| { idents.insert_s(ct.is, idty, &value) }); } diff --git a/import/src/plugins/tmdb.rs b/import/src/plugins/tmdb.rs index 39f8115..832e240 100644 --- a/import/src/plugins/tmdb.rs +++ b/import/src/plugins/tmdb.rs @@ -11,7 +11,7 @@ use crate::{ use anyhow::{Context, Result, anyhow, bail}; use chrono::{Utc, format::Parsed}; use jellycache::{Cache, EscapeKey, HashKey}; -use jellycommon::*; +use jellycommon::{jellyobject::EMPTY, *}; use jellydb::RowNum; use log::info; use reqwest::{ @@ -196,17 +196,16 @@ impl ImportPlugin for Tmdb { impl Tmdb { fn process_primary(&self, ct: &PluginContext, node: RowNum) -> Result<()> { let data = ct.ic.get_node(node)?.unwrap(); - let data = data.as_object(); let (tmdb_kind, tmdb_id): (_, u64) = if let Some(id) = data .get(NO_IDENTIFIERS) - .unwrap_or_default() + .unwrap_or(EMPTY) .get(IDENT_TMDB_SERIES) { (TmdbKind::Tv, id.parse()?) } else if let Some(id) = data .get(NO_IDENTIFIERS) - .unwrap_or_default() + .unwrap_or(EMPTY) .get(IDENT_TMDB_MOVIE) { (TmdbKind::Movie, id.parse()?) @@ -237,31 +236,25 @@ impl Tmdb { ct.ic.update_node(node, |mut node| { if let Some(title) = &details.title { - node = node.as_object().insert_s(ct.is, NO_TITLE, &title); + node = node.insert_s(ct.is, NO_TITLE, &title); } if let Some(tagline) = &details.tagline { - node = node.as_object().insert_s(ct.is, NO_TAGLINE, &tagline); + node = node.insert_s(ct.is, NO_TAGLINE, &tagline); } - node = node - .as_object() - .insert_s(ct.is, NO_DESCRIPTION, &details.overview); - node = node.as_object().update(NO_RATINGS, |rat| { + node = node.insert_s(ct.is, NO_DESCRIPTION, &details.overview); + node = node.update(NO_RATINGS, |rat| { rat.insert_s(ct.is, RTYP_TMDB, details.vote_average) }); if let Some(poster) = &poster { - node = node - .as_object() - .update(NO_PICTURES, |rat| rat.insert_s(ct.is, PICT_COVER, &poster)); + node = node.update(NO_PICTURES, |rat| rat.insert_s(ct.is, PICT_COVER, &poster)); } if let Some(backdrop) = &backdrop { - node = node.as_object().update(NO_PICTURES, |rat| { + node = node.update(NO_PICTURES, |rat| { rat.insert_s(ct.is, PICT_BACKDROP, &backdrop) }); } if let Some(releasedate) = release_date { - node = node - .as_object() - .insert_s(ct.is, NO_RELEASEDATE, releasedate); + node = node.insert_s(ct.is, NO_RELEASEDATE, releasedate); } node })?; @@ -269,7 +262,7 @@ impl Tmdb { } fn process_episode(&self, ct: &PluginContext, node: RowNum) -> Result<()> { let data = ct.ic.get_node(node)?.unwrap(); - let data = data.as_object(); + let data = data; let (Some(episode), Some(season)) = (data.get(NO_INDEX), data.get(NO_SEASON_INDEX)) else { return Ok(()); @@ -279,9 +272,8 @@ impl Tmdb { for parent in data.iter(NO_PARENT) { let parent_data = txn.get(parent)?.ok_or(anyhow!("parent missing"))?; if let Some(id) = parent_data - .as_object() .get(NO_IDENTIFIERS) - .unwrap_or_default() + .unwrap_or(EMPTY) .get(IDENT_TMDB_SERIES) { series_id = Some(id.parse::<u64>()?); @@ -302,20 +294,16 @@ impl Tmdb { .context("still image download")?; let release_date = parse_release_date(&details.air_date)?; ct.ic.update_node(node, |mut node| { - node = node.as_object().insert_s(ct.is, NO_TITLE, &details.name); - node = node - .as_object() - .insert_s(ct.is, NO_DESCRIPTION, &details.overview); + node = node.insert_s(ct.is, NO_TITLE, &details.name); + node = node.insert_s(ct.is, NO_DESCRIPTION, &details.overview); if let Some(release_date) = release_date { - node = node - .as_object() - .insert_s(ct.is, NO_RELEASEDATE, release_date) + node = node.insert_s(ct.is, NO_RELEASEDATE, release_date) } - node = node.as_object().update(NO_RATINGS, |rat| { + node = node.update(NO_RATINGS, |rat| { rat.insert_s(ct.is, RTYP_TMDB, details.vote_average) }); if let Some(cover) = &cover { - node = node.as_object().update(NO_PICTURES, |picts| { + node = node.update(NO_PICTURES, |picts| { picts.insert_s(ct.is, PICT_COVER, &cover) }); } @@ -325,11 +313,11 @@ impl Tmdb { fn process_person(&self, ct: &PluginContext, node: RowNum) -> Result<()> { let data = ct.ic.get_node(node)?.unwrap(); - let data = data.as_object(); + let data = data; let Some(id) = data .get(NO_IDENTIFIERS) - .unwrap_or_default() + .unwrap_or(EMPTY) .get(IDENT_TMDB_PERSON) else { return Ok(()); @@ -344,8 +332,7 @@ impl Tmdb { 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_s(ct.is, PICT_COVER, &image)) + node.update(NO_PICTURES, |pict| pict.insert_s(ct.is, PICT_COVER, &image)) })?; Ok(()) diff --git a/import/src/plugins/trakt.rs b/import/src/plugins/trakt.rs index c7ad53e..9c5786c 100644 --- a/import/src/plugins/trakt.rs +++ b/import/src/plugins/trakt.rs @@ -12,7 +12,7 @@ use crate::{ use anyhow::{Context, Result, anyhow, bail}; use jellycache::{Cache, HashKey}; use jellycommon::{ - jellyobject::{ObjectBuffer, Tag}, + jellyobject::{EMPTY, OBB, Tag}, *, }; use jellydb::RowNum; @@ -423,8 +423,7 @@ impl ImportPlugin for Trakt { _ => bail!("unknown trakt kind"), }; ct.ic.update_node(node, |node| { - node.as_object() - .update(NO_IDENTIFIERS, |idents| idents.insert(ty, id)) + node.update(NO_IDENTIFIERS, |idents| idents.insert(ty, id)) })?; } Ok(()) @@ -439,16 +438,15 @@ impl ImportPlugin for Trakt { impl Trakt { 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) - .unwrap_or_default() + .unwrap_or(EMPTY) .get(IDENT_TRAKT_SHOW) { (TraktKind::Show, id.parse()?) } else if let Some(id) = data .get(NO_IDENTIFIERS) - .unwrap_or_default() + .unwrap_or(EMPTY) .get(IDENT_TRAKT_MOVIE) { (TraktKind::Movie, id.parse()?) @@ -472,23 +470,21 @@ impl Trakt { ct.ic.db.transaction(&mut |txn| { let mut node = txn.get(node_row)?.unwrap(); - node = node - .as_object() - .insert_s(ct.is, NO_KIND, trakt_kind.as_node_kind()); - node = node.as_object().insert_s(ct.is, NO_TITLE, &details.title); + node = node.insert_s(ct.is, NO_KIND, trakt_kind.as_node_kind()); + node = node.insert_s(ct.is, NO_TITLE, &details.title); if let Some(overview) = &details.overview { - node = node.as_object().insert_s(ct.is, NO_DESCRIPTION, &overview); + node = node.insert_s(ct.is, NO_DESCRIPTION, &overview); } if let Some(tagline) = &details.tagline { - node = node.as_object().insert_s(ct.is, NO_TAGLINE, &tagline); + node = node.insert_s(ct.is, NO_TAGLINE, &tagline); } if let Some(x) = details.ids.imdb.clone() { - node = node.as_object().update(NO_IDENTIFIERS, |idents| { + node = node.update(NO_IDENTIFIERS, |idents| { idents.insert_s(ct.is, IDENT_IMDB, &x) }); } if let Some(x) = details.ids.tvdb.clone() { - node = node.as_object().update(NO_IDENTIFIERS, |idents| { + node = node.update(NO_IDENTIFIERS, |idents| { idents.insert_s(ct.is, IDENT_TVDB, &x.to_string()) }); } @@ -498,15 +494,11 @@ impl Trakt { TraktKind::Show => Some(IDENT_TMDB_SERIES), _ => None, } { - node = node - .as_object() - .update(NO_IDENTIFIERS, |idents| idents.insert(key, &x.to_string())); + node = node.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 = node.update(NO_RATINGS, |idents| idents.insert(RTYP_TRAKT, rating)); } let mut credits = Vec::new(); @@ -524,39 +516,35 @@ impl Trakt { let row = get_or_insert_slug(txn, &slug)?; let mut c = txn.get(row)?.unwrap(); - c = c.as_object().insert_s(ct.is, NO_KIND, KIND_PERSON); - c = c.as_object().insert_s(ct.is, NO_VISIBILITY, VISI_VISIBLE); - c = c.as_object().insert_s(ct.is, NO_TITLE, &ap.person.name); - c = c.as_object().update(NO_IDENTIFIERS, |ids| { + c = c.insert_s(ct.is, NO_KIND, KIND_PERSON); + c = c.insert_s(ct.is, NO_VISIBILITY, VISI_VISIBLE); + c = c.insert_s(ct.is, NO_TITLE, &ap.person.name); + c = c.update(NO_IDENTIFIERS, |ids| { let mut ids = ids.insert(IDENT_TRAKT_PERSON, &traktid.to_string()); if let Some(tmdbid) = ap.person.ids.tmdb { - ids = ids.as_object().insert_s( - ct.is, - IDENT_TMDB_PERSON, - &tmdbid.to_string(), - ); + ids = ids.insert_s(ct.is, IDENT_TMDB_PERSON, &tmdbid.to_string()); } if let Some(imdbid) = &ap.person.ids.imdb { - ids = ids.as_object().insert_s(ct.is, IDENT_IMDB_PERSON, imdbid); + ids = ids.insert_s(ct.is, IDENT_IMDB_PERSON, imdbid); } ids }); txn.update(row, c)?; - credits.push(ObjectBuffer::new(&mut [ - (CR_KIND.0, crcat), - (CR_ROLE.0, &role.as_str()), - (CR_NODE.0, &row), - ])); + credits.push( + OBB::new() + .with(CR_KIND, *crcat) + .with(CR_ROLE, &role) + .with(CR_NODE, row) + .finish(), + ); ct.pending_nodes.lock().unwrap().insert(row); } } - node = node - .as_object() - .extend_object(NO_CREDIT, CR_NODE.0, credits); + node = node.extend_object(NO_CREDIT, CR_NODE.0, &credits); txn.update(node_row, node)?; Ok(()) @@ -565,7 +553,6 @@ impl Trakt { } fn process_episode(&self, ct: &PluginContext, node: RowNum) -> Result<()> { let node_data = ct.ic.get_node(node)?.unwrap(); - let node_data = node_data.as_object(); let (Some(episode), Some(season)) = (node_data.get(NO_INDEX), node_data.get(NO_SEASON_INDEX)) @@ -577,9 +564,8 @@ impl Trakt { for parent in node_data.iter(NO_PARENT) { let parent_data = txn.get(parent)?.ok_or(anyhow!("parent missing"))?; if let Some(id) = parent_data - .as_object() .get(NO_IDENTIFIERS) - .unwrap_or_default() + .unwrap_or(EMPTY) .get(IDENT_TRAKT_SHOW) { show_id = Some(id.parse::<u64>()?); @@ -597,16 +583,14 @@ impl Trakt { let episodes = self.show_season_episodes(&ct.ic.cache, show_id, season, ct.rt)?; if let Some(episode) = episodes.get(episode.saturating_sub(1) as usize) { ct.ic.update_node(node, |mut node| { - node = node.as_object().insert_s(ct.is, NO_KIND, KIND_EPISODE); - node = node.as_object().insert_s(ct.is, NO_INDEX, episode.number); - node = node.as_object().insert_s(ct.is, NO_TITLE, &episode.title); + node = node.insert_s(ct.is, NO_KIND, KIND_EPISODE); + node = node.insert_s(ct.is, NO_INDEX, episode.number); + node = node.insert_s(ct.is, NO_TITLE, &episode.title); if let Some(overview) = &episode.overview { - node = node.as_object().insert_s(ct.is, NO_DESCRIPTION, &overview); + node = node.insert_s(ct.is, NO_DESCRIPTION, &overview); } if let Some(r) = episode.rating { - node = node - .as_object() - .update(NO_RATINGS, |rats| rats.insert_s(ct.is, RTYP_TRAKT, r)); + node = node.update(NO_RATINGS, |rats| rats.insert_s(ct.is, RTYP_TRAKT, r)); } node })?; diff --git a/import/src/plugins/vgmdb.rs b/import/src/plugins/vgmdb.rs index 4e1b273..f93e84c 100644 --- a/import/src/plugins/vgmdb.rs +++ b/import/src/plugins/vgmdb.rs @@ -11,7 +11,7 @@ use crate::{ }; use anyhow::{Context, Result}; use jellycache::{Cache, HashKey}; -use jellycommon::*; +use jellycommon::{jellyobject::EMPTY, *}; use jellydb::RowNum; use log::info; use regex::Regex; @@ -149,11 +149,10 @@ impl ImportPlugin for Vgmdb { fn process(&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() + .unwrap_or(EMPTY) .get(IDENT_VGMDB_ARTIST) else { return Ok(()); @@ -165,8 +164,7 @@ impl ImportPlugin for Vgmdb { }; ct.ic.update_node(node, |node| { - node.as_object() - .update(NO_PICTURES, |pics| pics.insert_s(ct.is, PICT_COVER, &image)) + node.update(NO_PICTURES, |pics| pics.insert_s(ct.is, PICT_COVER, &image)) })?; Ok(()) diff --git a/import/src/plugins/wikidata.rs b/import/src/plugins/wikidata.rs index b92fdbb..5b79592 100644 --- a/import/src/plugins/wikidata.rs +++ b/import/src/plugins/wikidata.rs @@ -11,7 +11,7 @@ use crate::{ }; use anyhow::{Context, Result, bail}; use jellycache::{Cache, EscapeKey}; -use jellycommon::*; +use jellycommon::{jellyobject::EMPTY, *}; use jellydb::RowNum; use log::info; use reqwest::{ @@ -203,11 +203,10 @@ impl ImportPlugin for Wikidata { } fn process(&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() + .unwrap_or(EMPTY) .get(IDENT_WIKIDATA) else { return Ok(()); @@ -222,8 +221,7 @@ impl ImportPlugin for Wikidata { .image_by_filename(&ct.ic.cache, filename, ct.rt)?; ct.ic.update_node(node, |node| { - node.as_object() - .update(NO_PICTURES, |pics| pics.insert_s(ct.is, PICT_COVER, &image)) + node.update(NO_PICTURES, |pics| pics.insert_s(ct.is, PICT_COVER, &image)) })?; Ok(()) |