pict-rs/src/exiftool.rs

61 lines
1.7 KiB
Rust
Raw Normal View History

2023-09-02 01:50:10 +00:00
use crate::{
2024-02-22 22:02:33 +00:00
bytes_stream::BytesStream,
2023-09-02 01:50:10 +00:00
error_code::ErrorCode,
process::{Process, ProcessError, ProcessRead},
2023-09-02 01:50:10 +00:00
};
2024-02-22 22:03:49 +00:00
2022-10-15 16:13:24 +00:00
2023-07-10 20:29:41 +00:00
#[derive(Debug, thiserror::Error)]
pub(crate) enum ExifError {
#[error("Error in process")]
Process(#[source] ProcessError),
#[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 {
2023-09-02 01:50:10 +00:00
pub(crate) const fn error_code(&self) -> ErrorCode {
match self {
Self::Process(e) => e.error_code(),
Self::CommandFailed(_) => ErrorCode::COMMAND_FAILURE,
}
}
2023-07-10 20:29:41 +00:00
pub(crate) fn is_client_error(&self) -> bool {
// if exiftool bails we probably have bad input
2023-12-23 03:00:37 +00:00
match self {
Self::CommandFailed(_) => true,
Self::Process(e) => e.is_client_error(),
}
2023-07-10 20:29:41 +00:00
}
}
2022-10-15 16:13:24 +00:00
#[tracing::instrument(level = "trace", skip(input))]
2024-02-22 22:02:33 +00:00
pub(crate) async fn needs_reorienting(timeout: u64, input: BytesStream) -> Result<bool, ExifError> {
let buf = Process::run("exiftool", &["-n", "-Orientation", "-"], &[], timeout)?
2024-02-22 22:02:33 +00:00
.bytes_stream_read(input)
2023-12-23 17:58:20 +00:00
.into_string()
.await?;
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,
2024-02-22 22:02:33 +00:00
input: BytesStream,
) -> Result<ProcessRead, ExifError> {
let process = Process::run("exiftool", &["-all=", "-", "-out", "-"], &[], timeout)?;
2024-02-22 22:02:33 +00:00
Ok(process.bytes_stream_read(input))
}