2021-08-29 01:37:53 +00:00
|
|
|
use crate::{config::Format, error::UploadError, magick::ValidInputType, tmp_file};
|
2021-08-28 22:15:14 +00:00
|
|
|
|
|
|
|
pub(crate) fn image_webp() -> mime::Mime {
|
|
|
|
"image/webp".parse().unwrap()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(crate) fn video_mp4() -> mime::Mime {
|
|
|
|
"video/mp4".parse().unwrap()
|
|
|
|
}
|
|
|
|
|
|
|
|
// import & export image using the image crate
|
|
|
|
#[tracing::instrument]
|
|
|
|
pub(crate) async fn validate_image(
|
|
|
|
tmpfile: std::path::PathBuf,
|
|
|
|
prescribed_format: Option<Format>,
|
|
|
|
) -> Result<mime::Mime, UploadError> {
|
2021-08-29 01:37:53 +00:00
|
|
|
let input_type = crate::magick::input_type(&tmpfile).await?;
|
2021-08-28 22:15:14 +00:00
|
|
|
|
|
|
|
match (prescribed_format, input_type) {
|
|
|
|
(_, ValidInputType::Gif) | (_, ValidInputType::Mp4) => {
|
|
|
|
let newfile = tmp_file();
|
|
|
|
crate::safe_create_parent(&newfile).await?;
|
|
|
|
crate::ffmpeg::to_mp4(&tmpfile, &newfile).await?;
|
|
|
|
actix_fs::rename(newfile, tmpfile).await?;
|
|
|
|
|
|
|
|
Ok(video_mp4())
|
|
|
|
}
|
|
|
|
(Some(Format::Jpeg), ValidInputType::Jpeg) | (None, ValidInputType::Jpeg) => {
|
|
|
|
tracing::debug!("Clearing metadata");
|
|
|
|
crate::exiv2::clear_metadata(&tmpfile).await?;
|
|
|
|
tracing::debug!("Validated");
|
|
|
|
|
|
|
|
Ok(mime::IMAGE_JPEG)
|
|
|
|
}
|
|
|
|
(Some(Format::Png), ValidInputType::Png) | (None, ValidInputType::Png) => {
|
|
|
|
tracing::debug!("Clearing metadata");
|
|
|
|
crate::exiv2::clear_metadata(&tmpfile).await?;
|
|
|
|
tracing::debug!("Validated");
|
|
|
|
|
|
|
|
Ok(mime::IMAGE_PNG)
|
|
|
|
}
|
|
|
|
(Some(Format::Webp), ValidInputType::Webp) | (None, ValidInputType::Webp) => {
|
|
|
|
tracing::debug!("Clearing metadata");
|
|
|
|
crate::exiv2::clear_metadata(&tmpfile).await?;
|
|
|
|
tracing::debug!("Validated");
|
|
|
|
|
|
|
|
Ok(image_webp())
|
|
|
|
}
|
|
|
|
(Some(format), _) => {
|
|
|
|
let newfile = tmp_file();
|
|
|
|
crate::safe_create_parent(&newfile).await?;
|
|
|
|
crate::magick::convert_file(&tmpfile, &newfile, format.clone()).await?;
|
|
|
|
|
|
|
|
actix_fs::rename(newfile, tmpfile).await?;
|
|
|
|
|
|
|
|
Ok(format.to_mime())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|