From 59a3b47f367bfad0dadb88c61e74714dbb62574f Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Wed, 25 Sep 2024 10:07:46 +0300 Subject: [PATCH] fix zip_image.sh --- meta/files/zip_image.sh | 130 +++++++++++++++++++++++++++++++++------- 1 file changed, 109 insertions(+), 21 deletions(-) diff --git a/meta/files/zip_image.sh b/meta/files/zip_image.sh index 65f51638..c3e40578 100755 --- a/meta/files/zip_image.sh +++ b/meta/files/zip_image.sh @@ -9,8 +9,8 @@ THREADS=$(getconf _NPROCESSORS_ONLN) echo "Используется $THREADS потоков для обработки." # Файлы логирования -LOG_FILE="./compression.log" -ERROR_LOG_FILE="./error.log" +LOG_FILE="./zip_image_compression.log" +ERROR_LOG_FILE="./zip_image_error.log" # Инициализируем файлы логов (удалены строки, чтобы не затирать логи) # : > "$LOG_FILE" @@ -67,6 +67,13 @@ process_png() { mkdir -p "$output_dir" + # Проверка файла ошибки + local error_file="${output_file}.error" + if [ -f "$error_file" ]; then + # Файл ошибки существует, пропускаем обработку + return + fi + # Проверка хеша файла local hash_file="${output_file}.md5" local current_hash @@ -81,40 +88,64 @@ process_png() { fi fi - cp "$input_file" "$output_file" + # Используем временный файл для обработки + local temp_output_file="${output_file}.tmp" + cp "$input_file" "$temp_output_file" # Размер до сжатия local original_size - original_size=$(get_file_size "$output_file") + original_size=$(get_file_size "$input_file") # Используем pngquant - if ! pngquant --quality=90-100 --speed 1 --output "$output_file" --force "$input_file"; then - log_error "Ошибка при сжатии $input_file с помощью pngquant" + if ! pngquant --quality=90-100 --speed 1 --output "$temp_output_file" --force "$input_file"; then + local error_msg="Ошибка при сжатии $input_file с помощью pngquant" + log_error "$error_msg" + echo "$error_msg" > "$error_file" + rm -f "$temp_output_file" return 1 fi # Дополнительная оптимизация с помощью zopflipng - if ! zopflipng -y "$output_file" "$output_file"; then - log_error "Ошибка при оптимизации $output_file с помощью zopflipng" + if ! zopflipng -y "$temp_output_file" "$temp_output_file"; then + local error_msg="Ошибка при оптимизации $temp_output_file с помощью zopflipng" + log_error "$error_msg" + echo "$error_msg" > "$error_file" + rm -f "$temp_output_file" return 1 fi # Размер после сжатия local new_size - new_size=$(get_file_size "$output_file") + new_size=$(get_file_size "$temp_output_file") # Проверка, что original_size не равен нулю if [ "$original_size" -eq 0 ]; then - log_error "Ошибка: размер оригинального файла равен 0 для $output_file" + local error_msg="Ошибка: размер оригинального файла равен 0 для $input_file" + log_error "$error_msg" + echo "$error_msg" > "$error_file" + rm -f "$temp_output_file" return 1 fi + # Проверка, уменьшился ли размер файла + if [ "$new_size" -ge "$original_size" ]; then + log_success "Сжатие не уменьшило размер файла $input_file, пропускаем сохранение" + # Сохраняем хеш, чтобы не обрабатывать файл снова + echo "$current_hash" > "$hash_file" + rm -f "$temp_output_file" + return + fi + # Процент сжатия local reduction reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}") log_success "Сжат PNG файл: $input_file на $reduction% ($original_size байт -> $new_size байт)" + # Перемещаем временный файл на место выходного + mv "$temp_output_file" "$output_file" + + # Сохраняем хеш echo "$current_hash" > "$hash_file" } export -f process_png @@ -129,6 +160,13 @@ process_jpeg() { mkdir -p "$output_dir" + # Проверка файла ошибки + local error_file="${output_file}.error" + if [ -f "$error_file" ]; then + # Файл ошибки существует, пропускаем обработку + return + fi + # Проверка хеша файла local hash_file="${output_file}.md5" local current_hash @@ -143,34 +181,55 @@ process_jpeg() { fi fi - cp "$input_file" "$output_file" + # Используем временный файл для обработки + local temp_output_file="${output_file}.tmp" + cp "$input_file" "$temp_output_file" # Размер до сжатия local original_size - original_size=$(get_file_size "$output_file") + original_size=$(get_file_size "$input_file") # Используем mozjpeg - if ! mozjpeg -quality 95 -progressive -optimize -outfile "$output_file" "$input_file"; then - log_error "Ошибка при сжатии $input_file с помощью mozjpeg" + if ! cjpeg -quality 95 -progressive -optimize -outfile "$temp_output_file" "$input_file"; then + local error_msg="Ошибка при сжатии $input_file с помощью mozjpeg" + log_error "$error_msg" + echo "$error_msg" > "$error_file" + rm -f "$temp_output_file" return 1 fi # Размер после сжатия local new_size - new_size=$(get_file_size "$output_file") + new_size=$(get_file_size "$temp_output_file") # Проверка, что original_size не равен нулю if [ "$original_size" -eq 0 ]; then - log_error "Ошибка: размер оригинального файла равен 0 для $output_file" + local error_msg="Ошибка: размер оригинального файла равен 0 для $input_file" + log_error "$error_msg" + echo "$error_msg" > "$error_file" + rm -f "$temp_output_file" return 1 fi + # Проверка, уменьшился ли размер файла + if [ "$new_size" -ge "$original_size" ]; then + log_success "Сжатие не уменьшило размер файла $input_file, пропускаем сохранение" + # Сохраняем хеш, чтобы не обрабатывать файл снова + echo "$current_hash" > "$hash_file" + rm -f "$temp_output_file" + return + fi + # Процент сжатия local reduction reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}") log_success "Сжат JPEG файл: $input_file на $reduction% ($original_size байт -> $new_size байт)" + # Перемещаем временный файл на место выходного + mv "$temp_output_file" "$output_file" + + # Сохраняем хеш echo "$current_hash" > "$hash_file" } export -f process_jpeg @@ -186,6 +245,13 @@ process_webp() { mkdir -p "$output_dir" + # Проверка файла ошибки + local error_file="${output_file}.error" + if [ -f "$error_file" ]; then + # Файл ошибки существует, пропускаем обработку + return + fi + # Проверка хеша файла local hash_file="${output_file}.md5" local current_hash @@ -204,27 +270,49 @@ process_webp() { local original_size original_size=$(get_file_size "$input_file") - if ! cwebp -mt -af -quiet -m 6 -q 95 -pass 10 "$input_file" -o "$output_file"; then - log_error "Ошибка при конвертации $input_file в WebP" + # Создаем временный файл для вывода + local temp_output_file="${output_file}.tmp" + + if ! cwebp -mt -af -quiet -m 6 -q 95 -pass 10 "$input_file" -o "$temp_output_file"; then + local error_msg="Ошибка при конвертации $input_file в WebP" + log_error "$error_msg" + echo "$error_msg" > "$error_file" + rm -f "$temp_output_file" return 1 fi # Размер после конвертации local new_size - new_size=$(get_file_size "$output_file") + new_size=$(get_file_size "$temp_output_file") # Проверка, что original_size не равен нулю if [ "$original_size" -eq 0 ]; then - log_error "Ошибка: размер оригинального файла равен 0 для $input_file" + local error_msg="Ошибка: размер оригинального файла равен 0 для $input_file" + log_error "$error_msg" + echo "$error_msg" > "$error_file" + rm -f "$temp_output_file" return 1 fi + # Проверка, уменьшился ли размер файла + if [ "$new_size" -ge "$original_size" ]; then + log_success "Конвертация в WebP не уменьшила размер файла $input_file, пропускаем сохранение" + # Сохраняем хеш, чтобы не обрабатывать файл снова + echo "$current_hash" > "$hash_file" + rm -f "$temp_output_file" + return + fi + # Процент сжатия local reduction reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}") log_success "Конвертирован в WebP: $input_file на $reduction% ($original_size байт -> $new_size байт)" + # Перемещаем временный файл на место выходного + mv "$temp_output_file" "$output_file" + + # Сохраняем хеш echo "$current_hash" > "$hash_file" } export -f process_webp @@ -244,6 +332,6 @@ find "$IMAGE_DIR" -type f \ xargs -0 -P "$THREADS" -I {} bash -c 'process_jpeg "$@"' _ {} # Конвертация в WebP -find ./images/comp -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \) \ +find "$COMP_DIR" -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \) \ -print0 | \ xargs -0 -P "$THREADS" -I {} bash -c 'process_webp "$@"' _ {} \ No newline at end of file