Ignore errors when fetching avatar or banner of remote actor

This commit is contained in:
silverpill 2022-07-22 23:02:14 +00:00
parent e581f8efae
commit 5b0cfe1f6b
3 changed files with 43 additions and 21 deletions

View file

@ -133,31 +133,50 @@ pub async fn fetch_actor(
Ok(actor) Ok(actor)
} }
pub async fn fetch_avatar_and_banner( pub async fn fetch_actor_avatar(
actor: &Actor, actor: &Actor,
media_dir: &Path, media_dir: &Path,
) -> Result<(Option<String>, Option<String>), FetchError> { default: Option<String>,
let avatar = match &actor.icon { ) -> Option<String> {
match &actor.icon {
Some(icon) => { Some(icon) => {
let (file_name, _) = fetch_file( match fetch_file(&icon.url, media_dir).await {
&icon.url, Ok((file_name, _)) => Some(file_name),
media_dir, Err(error) => {
).await?; log::warn!(
Some(file_name) "failed to fetch avatar for {} ({})",
actor.id,
error,
);
default
},
}
}, },
None => None, None => None,
}; }
let banner = match &actor.image { }
pub async fn fetch_actor_banner(
actor: &Actor,
media_dir: &Path,
default: Option<String>,
) -> Option<String> {
match &actor.image {
Some(image) => { Some(image) => {
let (file_name, _) = fetch_file( match fetch_file(&image.url, media_dir).await {
&image.url, Ok((file_name, _)) => Some(file_name),
media_dir, Err(error) => {
).await?; log::warn!(
Some(file_name) "failed to fetch banner for {} ({})",
actor.id,
error,
);
default
},
}
}, },
None => None, None => None,
}; }
Ok((avatar, banner))
} }
pub async fn fetch_object( pub async fn fetch_object(

View file

@ -22,7 +22,8 @@ use crate::models::profiles::queries::{
use crate::models::profiles::types::{DbActorProfile, ProfileCreateData}; use crate::models::profiles::types::{DbActorProfile, ProfileCreateData};
use super::fetchers::{ use super::fetchers::{
fetch_actor, fetch_actor,
fetch_avatar_and_banner, fetch_actor_avatar,
fetch_actor_banner,
fetch_object, fetch_object,
perform_webfinger_query, perform_webfinger_query,
FetchError, FetchError,
@ -66,7 +67,8 @@ async fn prepare_remote_profile_data(
if actor_address.is_local { if actor_address.is_local {
return Err(ImportError::LocalObject); 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 (identity_proofs, extra_fields) = actor.parse_attachments();
let profile_data = ProfileCreateData { let profile_data = ProfileCreateData {
username: actor.preferred_username.clone(), username: actor.preferred_username.clone(),

View file

@ -5,7 +5,7 @@ use tokio_postgres::GenericClient;
use crate::activitypub::{ use crate::activitypub::{
activity::Activity, activity::Activity,
actor::Actor, actor::Actor,
fetcher::fetchers::fetch_avatar_and_banner, fetcher::fetchers::{fetch_actor_avatar, fetch_actor_banner},
fetcher::helpers::ImportError, fetcher::helpers::ImportError,
vocabulary::PERSON, vocabulary::PERSON,
}; };
@ -54,7 +54,8 @@ pub async fn update_remote_profile(
actor.public_key.public_key_pem, 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 (identity_proofs, extra_fields) = actor.parse_attachments();
let mut profile_data = ProfileUpdateData { let mut profile_data = ProfileUpdateData {
display_name: actor.name.clone(), display_name: actor.name.clone(),