From 94e51bfb9b7d9b267c348e2562de84a1c76d54ae Mon Sep 17 00:00:00 2001 From: montehurd Date: Tue, 18 Jun 2024 15:13:45 -0700 Subject: [PATCH 1/7] Use parallel's -j flag properly --- png-optimizer.sh | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/png-optimizer.sh b/png-optimizer.sh index bc4063c1..2ecdc52a 100755 --- a/png-optimizer.sh +++ b/png-optimizer.sh @@ -101,14 +101,8 @@ optimize_pngs_in_dir_recursively() { local dir dir=$1 - # Parallel run - one job per processor - local processor_count - processor_count=$(nproc) - local jobs_per_processor - jobs_per_processor=1 - local jobs - jobs=$((processor_count * jobs_per_processor)) - find "$dir" -type f -iname "*.png" -print0 | parallel -0 --jobs "$jobs" optimize_png {} + # Parallel run, "-j+0" keeps each core fed with one job at a time + find "$dir" -type f -iname "*.png" -print0 | parallel -0 -j+0 optimize_png {} # Series run # find "$dir" -type f -iname "*.png" -print0 | while read -r -d '' file; do optimize_png "$file"; done From 4847262a174a25acade3d477ee97fca3f4657276 Mon Sep 17 00:00:00 2001 From: montehurd Date: Tue, 18 Jun 2024 15:54:58 -0700 Subject: [PATCH 2/7] Remove png file size stability wait No longer triggering optimization on png file creation - this stability check was needed because I think I was using inotifywait incorrectly and it sometimes triggered when the pngs were created (expected) but also sometimes afterwards while they were being written to. Perhaps related to writing exifdata? --- png-optimizer.sh | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/png-optimizer.sh b/png-optimizer.sh index 2ecdc52a..db0d5bb9 100755 --- a/png-optimizer.sh +++ b/png-optimizer.sh @@ -21,35 +21,10 @@ remove_lock_file() { fi } -wait_for_stable_file_size() { - local file=$1 - local max_attempts=20 - local attempt=0 - local size1=0 - local size2=1 - while [ "$size1" != "$size2" ] || [ "$size1" -eq 0 ]; do - size1=$(stat -c%s "$file") - sleep 0.1 - size2=$(stat -c%s "$file") - attempt=$((attempt + 1)) - if [ "$attempt" -eq "$max_attempts" ]; then - debug_log "File is empty or size is unstable - $file" - return 1 - fi - done - debug_log "wait_for_stable_file_size attempts: $attempt" - return 0 -} - optimize_png() { local file file=$1 - if ! wait_for_stable_file_size "$file"; then - debug_log "Skipping optimization for unstable file: $file" - return - fi - if exiftool -quiet -Software "$file" | grep -q "$OPTIMIZATION_TAG"; then debug_log "$file already optimized, skipping" return From b58fbc010a72922885f5f28913b248ac6cb1567c Mon Sep 17 00:00:00 2001 From: montehurd Date: Tue, 18 Jun 2024 16:09:59 -0700 Subject: [PATCH 3/7] Remove no longer needed lockfile bits --- png-optimizer.sh | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/png-optimizer.sh b/png-optimizer.sh index db0d5bb9..f0450cfc 100755 --- a/png-optimizer.sh +++ b/png-optimizer.sh @@ -13,14 +13,6 @@ debug_log() { echo "$(date +"%Y-%m-%d %H:%M:%S") - Job $PARALLEL_SEQ - $1" } -remove_lock_file() { - local lock_file - lock_file=$1 - if [ -f "$lock_file" ]; then - rm -f "$lock_file" || true - fi -} - optimize_png() { local file file=$1 @@ -30,16 +22,6 @@ optimize_png() { return fi - local lock_file - lock_file="/tmp/$(echo "$file" | sed 's/\//_/g').lock" - - if [ -f "$lock_file" ]; then - debug_log "$file already being processed, skipping" - return - fi - - touch "$lock_file" - local size_before size_before=$(stat -c%s "$file") @@ -49,7 +31,6 @@ optimize_png() { if ! exiftool -quiet -Software "$file" | grep -q "$OPTIMIZATION_TAG"; then debug_log "$file failed to write processed flag" - remove_lock_file "$lock_file" return fi @@ -66,8 +47,6 @@ optimize_png() { fi echo "$file optimized: Size reduction = $size_percent_reduction%" - - remove_lock_file "$lock_file" } optimize_pngs_in_dir_recursively() { From 2bdd426e1d8ee0e6225f303bf5e36983fcfe0f72 Mon Sep 17 00:00:00 2001 From: montehurd Date: Tue, 18 Jun 2024 16:14:13 -0700 Subject: [PATCH 4/7] Remove dangling exiftool temp files --- png-optimizer.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/png-optimizer.sh b/png-optimizer.sh index f0450cfc..2f6e1221 100755 --- a/png-optimizer.sh +++ b/png-optimizer.sh @@ -55,6 +55,9 @@ optimize_pngs_in_dir_recursively() { local dir dir=$1 + # Remove any dangling exiftool temp files + find "$dir" -type f -iname "*.png_exiftool_tmp" -delete + # Parallel run, "-j+0" keeps each core fed with one job at a time find "$dir" -type f -iname "*.png" -print0 | parallel -0 -j+0 optimize_png {} From f7156a1b0f54263f3743547a0810189071053353 Mon Sep 17 00:00:00 2001 From: montehurd Date: Tue, 18 Jun 2024 16:28:50 -0700 Subject: [PATCH 5/7] Use faster -overwrite_original flag No longer need -overwrite_original_in_place flag because we're no longer worried about png creation triggering optimization --- png-optimizer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/png-optimizer.sh b/png-optimizer.sh index 2f6e1221..667c00f6 100755 --- a/png-optimizer.sh +++ b/png-optimizer.sh @@ -27,7 +27,7 @@ optimize_png() { optipng -silent -fix -o2 "$file" - exiftool -quiet -overwrite_original_in_place -Software="$OPTIMIZATION_TAG" "$file" + exiftool -quiet -overwrite_original -Software="$OPTIMIZATION_TAG" "$file" if ! exiftool -quiet -Software "$file" | grep -q "$OPTIMIZATION_TAG"; then debug_log "$file failed to write processed flag" From 32339f94dfa1bf714e6b4b9321e92b585808db63 Mon Sep 17 00:00:00 2001 From: montehurd Date: Tue, 18 Jun 2024 22:01:15 -0700 Subject: [PATCH 6/7] Use oxipng for optimization instead of optipng --- Dockerfile.png-optimizer | 6 +-- docker-compose.yml | 1 - png-optimizer.sh | 87 ---------------------------------------- 3 files changed, 2 insertions(+), 92 deletions(-) delete mode 100755 png-optimizer.sh diff --git a/Dockerfile.png-optimizer b/Dockerfile.png-optimizer index 936ef451..dc5d1a2d 100644 --- a/Dockerfile.png-optimizer +++ b/Dockerfile.png-optimizer @@ -1,9 +1,7 @@ FROM alpine -COPY png-optimizer.sh /opt/scripts/png-optimizer.sh - WORKDIR /pixel/report -RUN apk add --no-cache inotify-tools optipng exiftool bash parallel +RUN apk add --no-cache oxipng -CMD ["/bin/bash", "/opt/scripts/png-optimizer.sh", "/pixel/report"] +CMD ["oxipng", "--fix", "--recursive", "-o", "2", "."] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 1a72076e..ba93b1d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -102,5 +102,4 @@ services: dockerfile: Dockerfile.png-optimizer volumes: - ./report:/pixel/report - - ./png-optimizer.sh:/opt/scripts/png-optimizer.sh working_dir: /pixel/report diff --git a/png-optimizer.sh b/png-optimizer.sh deleted file mode 100755 index 667c00f6..00000000 --- a/png-optimizer.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash - -set -e - -OPTIMIZATION_TAG="OptimizedWithOptiPNG" - -ENABLE_DEBUG_LOGGING=1 - -debug_log() { - if [ "$ENABLE_DEBUG_LOGGING" -ne 1 ]; then - return - fi - echo "$(date +"%Y-%m-%d %H:%M:%S") - Job $PARALLEL_SEQ - $1" -} - -optimize_png() { - local file - file=$1 - - if exiftool -quiet -Software "$file" | grep -q "$OPTIMIZATION_TAG"; then - debug_log "$file already optimized, skipping" - return - fi - - local size_before - size_before=$(stat -c%s "$file") - - optipng -silent -fix -o2 "$file" - - exiftool -quiet -overwrite_original -Software="$OPTIMIZATION_TAG" "$file" - - if ! exiftool -quiet -Software "$file" | grep -q "$OPTIMIZATION_TAG"; then - debug_log "$file failed to write processed flag" - return - fi - - local size_after - size_after=$(stat -c%s "$file") - - local size_reduction - size_reduction=$((size_before - size_after)) - local size_percent_reduction - if [ "$size_before" -ne 0 ]; then - size_percent_reduction=$(echo "scale=2; ($size_reduction / $size_before) * 100" | bc) - else - size_percent_reduction=0 - fi - - echo "$file optimized: Size reduction = $size_percent_reduction%" -} - -optimize_pngs_in_dir_recursively() { - local start_time end_time duration - start_time=$(date +%s) - local dir - dir=$1 - - # Remove any dangling exiftool temp files - find "$dir" -type f -iname "*.png_exiftool_tmp" -delete - - # Parallel run, "-j+0" keeps each core fed with one job at a time - find "$dir" -type f -iname "*.png" -print0 | parallel -0 -j+0 optimize_png {} - - # Series run - # find "$dir" -type f -iname "*.png" -print0 | while read -r -d '' file; do optimize_png "$file"; done - - end_time=$(date +%s) - duration=$((end_time - start_time)) - echo "Duration: $duration seconds" -} - -export_all_functions_and_variables() { - local func var - for func in $(declare -F | awk '{print $3}'); do - export -f $func - done - for var in $(compgen -v); do - export "$var" - done -} - -# Needed to use "parallel" -export_all_functions_and_variables - -if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then - optimize_pngs_in_dir_recursively "$1" -fi \ No newline at end of file From 9c93b76f9011f74e58c488bbf1136a9ea172403e Mon Sep 17 00:00:00 2001 From: montehurd Date: Thu, 20 Jun 2024 17:48:58 -0700 Subject: [PATCH 7/7] Echo png optimization duration --- optimize-pngs.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/optimize-pngs.sh b/optimize-pngs.sh index 6e33f918..c9ff61f9 100755 --- a/optimize-pngs.sh +++ b/optimize-pngs.sh @@ -1,3 +1,10 @@ #!/bin/bash -docker compose run --rm png-optimizer \ No newline at end of file +start_time=$(date +%s) + +docker compose run --rm png-optimizer + +end_time=$(date +%s) +duration=$((end_time - start_time)) + +echo -e "\033[0;32mpng-optimizer duration: $duration seconds\033[0m" \ No newline at end of file