diff options
author | metamuffin <metamuffin@disroot.org> | 2023-08-03 12:57:35 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-08-03 12:57:35 +0200 |
commit | c0828abd8a0f02240520f3c36419d3a83086fd2b (patch) | |
tree | dbc494b0630ee6f89191f5b0117899544c5b07ae | |
parent | 78203f2546d4e5292985095538236d69a4eb8593 (diff) | |
download | jellything-c0828abd8a0f02240520f3c36419d3a83086fd2b.tar jellything-c0828abd8a0f02240520f3c36419d3a83086fd2b.tar.bz2 jellything-c0828abd8a0f02240520f3c36419d3a83086fd2b.tar.zst |
import children from remote
-rw-r--r-- | server/src/import.rs | 66 |
1 files changed, 44 insertions, 22 deletions
diff --git a/server/src/import.rs b/server/src/import.rs index 98e0504..2cd1998 100644 --- a/server/src/import.rs +++ b/server/src/import.rs @@ -6,6 +6,7 @@ use crate::{database::Database, federation::Federation, CONF}; use anyhow::{anyhow, bail, Context, Ok}; use async_recursion::async_recursion; +use jellyclient::Session; use jellycommon::{MediaSource, Node, NodePrivate, RemoteImportOptions}; use log::{error, info}; use std::{ffi::OsStr, fs::File, os::unix::prelude::OsStrExt, path::PathBuf, sync::LazyLock}; @@ -92,49 +93,70 @@ pub async fn import_path( .to_string(); if let Some(io) = data.private.import.take() { - let title = data.public.title; - data = import_remote(io, db, fed) + let session = fed + .get_session(&io.host) + .await + .context("creating session")?; + + import_remote(io, db, &session, &identifier, parent) .await .context("federated import")?; - data.public.title = title; + } else { + info!("adding {identifier}"); + data.public.parent = parent; + db.node.insert(&identifier, &data)?; } - - info!("adding {identifier}"); - data.public.parent = parent; - db.node.insert(&identifier, &data)?; Ok((vec![identifier], 0)) } else { bail!("did somebody really put a fifo or socket in the library?!") } } +#[async_recursion] async fn import_remote( opts: RemoteImportOptions, db: &Database, - fed: &Federation, -) -> anyhow::Result<Node> { - let sess = fed - .get_session(&opts.host) + session: &Session, + identifier: &String, + parent: Option<String>, +) -> anyhow::Result<()> { + info!("loading federated node {identifier:?}"); + let node = session + .node(&opts.id) .await - .context("creating session")?; - let node = sess.node(&opts.id).await.context("fetching remote node")?; - - if !node.children.is_empty() { - todo!() - } - - let node = Node { + .context("fetching remote node")?; + let mut node = Node { public: node, private: NodePrivate { backdrop: None, poster: None, import: None, source: Some(MediaSource::Remote { - host: opts.host, - remote_id: opts.id, + host: opts.host.clone(), + remote_id: opts.id.clone(), }), }, }; - Ok(node) + for c in &mut node.public.children { + let prefixed = format!("{}{c}", opts.prefix.clone().unwrap_or(String::new())); + import_remote( + RemoteImportOptions { + id: c.to_owned(), + ..opts.clone() + }, + db, + session, + &prefixed, + Some(opts.id.clone()), + ) + .await?; + *c = prefixed; + } + + node.public.parent = parent; + info!("adding {identifier}"); + db.node.insert(identifier, &node)?; + + Ok(()) } |