libheif-add
Some checks failed
deploy / deploy (push) Failing after 6s

This commit is contained in:
Untone 2024-11-13 08:56:18 +03:00
parent be8c03eb11
commit dc543af525
5 changed files with 563 additions and 168 deletions

701
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -26,6 +26,7 @@ env_logger = "0.11.5"
actix = "0.13.5" actix = "0.13.5"
imageproc = "0.25.0" imageproc = "0.25.0"
ab_glyph = "0.2.29" ab_glyph = "0.2.29"
libheif-rs = "1.0.2"
[[bin]] [[bin]]
name = "quoter" name = "quoter"

View File

@ -2,7 +2,8 @@ FROM rust AS build
# had to add this for open-ssl # had to add this for open-ssl
RUN apt-get update -y && \ RUN apt-get update -y && \
apt-get install -y git pkg-config make g++ libssl-dev wget && \ apt-get install -y git pkg-config make g++ libssl-dev wget \
libheif-dev libtiff-dev && \
rustup target add x86_64-unknown-linux-gnu rustup target add x86_64-unknown-linux-gnu
RUN USER=root cargo new --bin quoter RUN USER=root cargo new --bin quoter
@ -28,7 +29,8 @@ FROM rust
ENV RUST_BACKTRACE=full ENV RUST_BACKTRACE=full
ENV RUST_LOG=warn ENV RUST_LOG=warn
RUN apt-get update && apt install -y openssl libssl-dev RUN apt-get update && apt install -y openssl libssl-dev \
libheif1 libtiff5
COPY --from=build /quoter/target/release/quoter . COPY --from=build /quoter/target/release/quoter .

View File

@ -36,6 +36,8 @@ pub async fn proxy_handler(
"webp" => "image/webp", "webp" => "image/webp",
"gif" => "image/gif", "gif" => "image/gif",
"jfif" => "image/jpeg", "jfif" => "image/jpeg",
"heic" | "heif" => "image/heic",
"tif" | "tiff" => "image/tiff",
"mp3" => "audio/mpeg", "mp3" => "audio/mpeg",
"wav" => "audio/x-wav", "wav" => "audio/x-wav",
"ogg" => "audio/ogg", "ogg" => "audio/ogg",

View File

@ -105,8 +105,12 @@ fn determine_image_format(extension: &str) -> Result<ImageFormat, actix_web::Err
"gif" => Ok(ImageFormat::Gif), "gif" => Ok(ImageFormat::Gif),
"bmp" => Ok(ImageFormat::Bmp), "bmp" => Ok(ImageFormat::Bmp),
"ico" => Ok(ImageFormat::Ico), "ico" => Ok(ImageFormat::Ico),
"tiff" => Ok(ImageFormat::Tiff), "tiff" | "tif" => Ok(ImageFormat::Tiff),
"webp" => Ok(ImageFormat::WebP), "webp" => Ok(ImageFormat::WebP),
"heic" | "heif" => {
// Для HEIC мы будем конвертировать в JPEG при сохранении
Ok(ImageFormat::Jpeg)
},
_ => { _ => {
log::error!("Неподдерживаемый формат изображения: {}", extension); log::error!("Неподдерживаемый формат изображения: {}", extension);
Err(ErrorInternalServerError("Неподдерживаемый формат изображения")) Err(ErrorInternalServerError("Неподдерживаемый формат изображения"))
@ -128,7 +132,14 @@ pub async fn thumbdata_save(
let (base_filename, _, extension) = parse_file_path(&original_filename); let (base_filename, _, extension) = parse_file_path(&original_filename);
warn!("detected file extension: {}", extension); warn!("detected file extension: {}", extension);
let ext = extension.to_lowercase(); let ext = extension.to_lowercase();
let filename = format!("{}.{}", base_filename, ext);
// Определяем выходной формат
let output_ext = match ext.as_str() {
"heic" | "heif" => "jpg", // Конвертируем HEIC в JPEG
_ => &ext
};
let filename = format!("{}.{}", base_filename, output_ext);
let img = match image::load_from_memory(&original_data) { let img = match image::load_from_memory(&original_data) {
Ok(img) => img, Ok(img) => img,
@ -140,14 +151,14 @@ pub async fn thumbdata_save(
warn!("generate thumbnails for {}", filename); warn!("generate thumbnails for {}", filename);
// Определяем формат изображения // Определяем формат изображения для сохранения
let format = determine_image_format(&ext)?; let format = determine_image_format(output_ext)?;
// Генерация миниатюр с использованием определённого формата // Генерация миниатюр с использованием определённого формата
match generate_thumbnails(&img, format).await { match generate_thumbnails(&img, format).await {
Ok(thumbnails_bytes) => { Ok(thumbnails_bytes) => {
for (thumb_width, thumbnail) in thumbnails_bytes { for (thumb_width, thumbnail) in thumbnails_bytes {
let thumb_filename = format!("{}_{}.{}", base_filename, thumb_width, ext); let thumb_filename = format!("{}_{}.{}", base_filename, thumb_width, output_ext);
// Загружаем миниатюру в S3 // Загружаем миниатюру в S3
if let Err(e) = upload_to_s3( if let Err(e) = upload_to_s3(
&state.storj_client, &state.storj_client,