diff --git a/src/activitypub/fetcher/fetchers.rs b/src/activitypub/fetcher/fetchers.rs index 4965963..e23176f 100644 --- a/src/activitypub/fetcher/fetchers.rs +++ b/src/activitypub/fetcher/fetchers.rs @@ -133,31 +133,50 @@ pub async fn fetch_actor( Ok(actor) } -pub async fn fetch_avatar_and_banner( +pub async fn fetch_actor_avatar( actor: &Actor, media_dir: &Path, -) -> Result<(Option, Option), FetchError> { - let avatar = match &actor.icon { + default: Option, +) -> Option { + match &actor.icon { Some(icon) => { - let (file_name, _) = fetch_file( - &icon.url, - media_dir, - ).await?; - Some(file_name) + match fetch_file(&icon.url, media_dir).await { + Ok((file_name, _)) => Some(file_name), + Err(error) => { + log::warn!( + "failed to fetch avatar for {} ({})", + actor.id, + error, + ); + default + }, + } }, None => None, - }; - let banner = match &actor.image { + } +} + +pub async fn fetch_actor_banner( + actor: &Actor, + media_dir: &Path, + default: Option, +) -> Option { + match &actor.image { Some(image) => { - let (file_name, _) = fetch_file( - &image.url, - media_dir, - ).await?; - Some(file_name) + match fetch_file(&image.url, media_dir).await { + Ok((file_name, _)) => Some(file_name), + Err(error) => { + log::warn!( + "failed to fetch banner for {} ({})", + actor.id, + error, + ); + default + }, + } }, None => None, - }; - Ok((avatar, banner)) + } } pub async fn fetch_object( diff --git a/src/activitypub/fetcher/helpers.rs b/src/activitypub/fetcher/helpers.rs index 6073068..b5035b9 100644 --- a/src/activitypub/fetcher/helpers.rs +++ b/src/activitypub/fetcher/helpers.rs @@ -22,7 +22,8 @@ use crate::models::profiles::queries::{ use crate::models::profiles::types::{DbActorProfile, ProfileCreateData}; use super::fetchers::{ fetch_actor, - fetch_avatar_and_banner, + fetch_actor_avatar, + fetch_actor_banner, fetch_object, perform_webfinger_query, FetchError, @@ -66,7 +67,8 @@ async fn prepare_remote_profile_data( if actor_address.is_local { return Err(ImportError::LocalObject); }; - let (avatar, banner) = fetch_avatar_and_banner(&actor, media_dir).await?; + let avatar = fetch_actor_avatar(&actor, media_dir, None).await; + let banner = fetch_actor_banner(&actor, media_dir, None).await; let (identity_proofs, extra_fields) = actor.parse_attachments(); let profile_data = ProfileCreateData { username: actor.preferred_username.clone(), diff --git a/src/activitypub/handlers/update_person.rs b/src/activitypub/handlers/update_person.rs index e37c09b..c6ac920 100644 --- a/src/activitypub/handlers/update_person.rs +++ b/src/activitypub/handlers/update_person.rs @@ -5,7 +5,7 @@ use tokio_postgres::GenericClient; use crate::activitypub::{ activity::Activity, actor::Actor, - fetcher::fetchers::fetch_avatar_and_banner, + fetcher::fetchers::{fetch_actor_avatar, fetch_actor_banner}, fetcher::helpers::ImportError, vocabulary::PERSON, }; @@ -54,7 +54,8 @@ pub async fn update_remote_profile( actor.public_key.public_key_pem, ); }; - let (avatar, banner) = fetch_avatar_and_banner(&actor, media_dir).await?; + let avatar = fetch_actor_avatar(&actor, media_dir, profile.avatar_file_name).await; + let banner = fetch_actor_banner(&actor, media_dir, profile.banner_file_name).await; let (identity_proofs, extra_fields) = actor.parse_attachments(); let mut profile_data = ProfileUpdateData { display_name: actor.name.clone(),