diff --git a/src/blob.rs b/src/blob.rs index a75021747..40072cb53 100644 --- a/src/blob.rs +++ b/src/blob.rs @@ -388,9 +388,12 @@ impl<'a> BlobObject<'a> { max_bytes: usize, strict_limits: bool, ) -> Result> { - tokio::task::block_in_place(move || { - let mut img = image::open(&blob_abs).context("image decode failure")?; + let mut no_exif = false; + let no_exif_ref = &mut no_exif; + let res = tokio::task::block_in_place(move || { let (nr_bytes, exif) = self.metadata()?; + *no_exif_ref = exif.is_none(); + let mut img = image::open(&blob_abs).context("image decode failure")?; let orientation = exif.as_ref().map(|exif| exif_orientation(exif, context)); let mut encoded = Vec::new(); let mut changed_name = None; @@ -505,7 +508,21 @@ impl<'a> BlobObject<'a> { } Ok(changed_name) - }) + }); + match res { + Ok(_) => res, + Err(err) => { + if !strict_limits && no_exif { + warn!( + context, + "Cannot recode image, using original data: {err:#}.", + ); + Ok(None) + } else { + Err(err) + } + } + } } /// Returns image file size and Exif. diff --git a/src/chat.rs b/src/chat.rs index 27fa71c73..387593e90 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -2035,13 +2035,8 @@ async fn prepare_msg_blob(context: &Context, msg: &mut Message) -> Result<()> { let mut maybe_sticker = msg.viewtype == Viewtype::Sticker; if msg.viewtype == Viewtype::Image || maybe_sticker { - // TODO: Ignore errors only if the image has no Exif. - if let Err(err) = blob.recode_to_image_size(context, &mut maybe_sticker).await { - warn!( - context, - "Cannot recode image, using original data: {err:#}." - ); - } + blob.recode_to_image_size(context, &mut maybe_sticker) + .await?; if !maybe_sticker { msg.viewtype = Viewtype::Image; }