2
0
Fork 0
mirror of https://git.asonix.dog/asonix/pict-rs synced 2024-11-10 06:25:00 +00:00
pict-rs/src/exiftool.rs

59 lines
1.6 KiB
Rust
Raw Normal View History

2023-07-10 20:29:41 +00:00
use crate::process::{Process, ProcessError};
use actix_web::web::Bytes;
2022-10-15 16:13:24 +00:00
use tokio::io::{AsyncRead, AsyncReadExt};
2023-07-10 20:29:41 +00:00
#[derive(Debug, thiserror::Error)]
pub(crate) enum ExifError {
#[error("Error in process")]
Process(#[source] ProcessError),
#[error("Error reading process output")]
Read(#[source] std::io::Error),
#[error("Invalid media file provided")]
CommandFailed(ProcessError),
}
impl From<ProcessError> for ExifError {
fn from(value: ProcessError) -> Self {
match value {
e @ ProcessError::Status(_, _) => Self::CommandFailed(e),
otherwise => Self::Process(otherwise),
}
}
2023-07-10 20:29:41 +00:00
}
impl ExifError {
pub(crate) fn is_client_error(&self) -> bool {
// if exiftool bails we probably have bad input
2023-08-05 21:18:06 +00:00
matches!(
self,
Self::CommandFailed(_) | Self::Process(ProcessError::Timeout(_))
)
2023-07-10 20:29:41 +00:00
}
}
2022-10-15 16:13:24 +00:00
#[tracing::instrument(level = "trace", skip(input))]
2023-08-05 17:41:06 +00:00
pub(crate) async fn needs_reorienting(timeout: u64, input: Bytes) -> Result<bool, ExifError> {
let process = Process::run("exiftool", &["-n", "-Orientation", "-"], timeout)?;
2022-10-15 16:13:24 +00:00
let mut reader = process.bytes_read(input);
let mut buf = String::new();
2023-07-10 20:29:41 +00:00
reader
.read_to_string(&mut buf)
.await
.map_err(ExifError::Read)?;
2022-10-15 16:13:24 +00:00
Ok(!buf.is_empty())
}
#[tracing::instrument(level = "trace", skip(input))]
2023-08-05 17:41:06 +00:00
pub(crate) fn clear_metadata_bytes_read(
timeout: u64,
input: Bytes,
) -> Result<impl AsyncRead + Unpin, ExifError> {
let process = Process::run("exiftool", &["-all=", "-", "-out", "-"], timeout)?;
2022-04-07 02:40:49 +00:00
Ok(process.bytes_read(input))
}