aboutsummaryrefslogtreecommitdiff
path: root/server/src/import.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/import.rs')
-rw-r--r--server/src/import.rs39
1 files changed, 23 insertions, 16 deletions
diff --git a/server/src/import.rs b/server/src/import.rs
index 7e62b47..8d8198a 100644
--- a/server/src/import.rs
+++ b/server/src/import.rs
@@ -7,11 +7,17 @@ use crate::{database::Database, federation::Federation, CONF};
use anyhow::{anyhow, bail, Context, Ok};
use async_recursion::async_recursion;
use futures::{stream::FuturesUnordered, StreamExt, TryFutureExt};
-use jellybase::{cache_file, AssetLocationExt};
+use jellybase::async_cache_file;
use jellyclient::Session;
use jellycommon::{AssetLocation, MediaSource, Node, NodePrivate, RemoteImportOptions};
use log::{debug, error, info};
-use std::{ffi::OsStr, fs::File, os::unix::prelude::OsStrExt, path::PathBuf, sync::LazyLock};
+use std::{
+ ffi::OsStr,
+ fs::File,
+ os::unix::prelude::OsStrExt,
+ path::PathBuf,
+ sync::{Arc, LazyLock},
+};
use tokio::sync::Semaphore;
static IMPORT_SEM: LazyLock<Semaphore> = LazyLock::new(|| Semaphore::new(1));
@@ -133,7 +139,7 @@ static SEM_REMOTE_IMPORT: LazyLock<Semaphore> = LazyLock::new(|| Semaphore::new(
async fn import_remote(
mut opts: RemoteImportOptions,
db: &Database,
- session: &Session,
+ session: &Arc<Session>,
identifier: String,
parent: Option<String>,
) -> anyhow::Result<Vec<String>> {
@@ -149,11 +155,11 @@ async fn import_remote(
.context("fetching remote node")?;
if node.federated.is_some() {
- return Ok(vec![]) // node is federated, lets not import it
+ return Ok(vec![]); // node is federated, lets not import it
}
- let poster = cache_federation_asset(session, &opts.id, "poster").await?;
- let backdrop = cache_federation_asset(session, &opts.id, "backdrop").await?;
+ let poster = cache_federation_asset(session.to_owned(), opts.id.clone(), "poster").await?;
+ let backdrop = cache_federation_asset(session.to_owned(), opts.id.clone(), "backdrop").await?;
drop(_permit);
@@ -215,15 +221,16 @@ async fn import_remote(
}
async fn cache_federation_asset(
- session: &Session,
- identifier: &String,
- role: &str,
+ session: Arc<Session>,
+ identifier: String,
+ role: &'static str,
) -> anyhow::Result<AssetLocation> {
- let poster = cache_file(&["federation-asset", role, identifier]);
- if !poster.path().exists() {
- session
- .node_asset(&identifier, role, File::create(&poster.path())?)
- .await?;
- }
- Ok(poster)
+ async_cache_file(
+ &["federation-asset", role, &identifier.clone()],
+ move |out| async move {
+ let session = session;
+ session.node_asset(identifier.as_str(), role, out).await
+ },
+ )
+ .await
}