From 172e3086c827cdbf6b69d7150490f06da52a0045 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Sat, 22 May 2021 21:56:59 +0200
Subject: [PATCH] Add generate images scripts

---
 assets/files/images.json                   |  4 +-
 scripts/.gitignore                         |  2 +
 scripts/01_optimize_images.sh              | 46 ++++++++++++++++++++++
 scripts/02_build_images_assets_list.sh     | 45 +++++++++++++++++++++
 scripts/cache/01_raw_images/.gitkeep       |  0
 scripts/cache/02_optimized_images/.gitkeep |  0
 6 files changed, 95 insertions(+), 2 deletions(-)
 create mode 100644 scripts/.gitignore
 create mode 100755 scripts/01_optimize_images.sh
 create mode 100755 scripts/02_build_images_assets_list.sh
 create mode 100644 scripts/cache/01_raw_images/.gitkeep
 create mode 100644 scripts/cache/02_optimized_images/.gitkeep

diff --git a/assets/files/images.json b/assets/files/images.json
index 059fd9c..a31f990 100644
--- a/assets/files/images.json
+++ b/assets/files/images.json
@@ -1,9 +1,9 @@
 {
   "images": [
-    "acb90f2491a73ba81e9f3d540ba66ffb",
-    "78edb7a85c822c76eae85da9fcd31324",
     "0962959cf3392e84b9816de7fd80b656",
+    "78edb7a85c822c76eae85da9fcd31324",
     "7c2f42e74e249ce9dad4a0802dde22c2",
+    "acb90f2491a73ba81e9f3d540ba66ffb",
     ""
   ]
 }
diff --git a/scripts/.gitignore b/scripts/.gitignore
new file mode 100644
index 0000000..88cc107
--- /dev/null
+++ b/scripts/.gitignore
@@ -0,0 +1,2 @@
+*.jpg
+*.png
diff --git a/scripts/01_optimize_images.sh b/scripts/01_optimize_images.sh
new file mode 100755
index 0000000..7ff136f
--- /dev/null
+++ b/scripts/01_optimize_images.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+
+command -v convert >/dev/null 2>&1 || { echo >&2 "I require convert (imagemagick) but it's not installed. Aborting."; exit 1; }
+command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+
+IMAGES_CACHE_FOLDER="${CURRENT_DIR}/cache"
+IMAGES_RAW_FOLDER="${IMAGES_CACHE_FOLDER}/01_raw_images"
+IMAGES_OPTIMIZED_FOLDER="${IMAGES_CACHE_FOLDER}/02_optimized_images"
+
+RESIZE_OPTION="640x640"
+CROP_PARAMETERS="-auto-orient -trim +repage -gravity center -background white -extent ${RESIZE_OPTION}^"
+CONVERT_OPTIONS="-alpha off +dither -colors 256 -depth 4"
+
+OPTIPNG_OPTIONS="-preserve -quiet -o7"
+
+echo "Cleaning empty/temp files..."
+find "${IMAGES_CACHE_FOLDER}" -type f -name "*.png" -empty -exec rm {} \;
+find "${IMAGES_CACHE_FOLDER}" -type f -name "*.tmp*" -exec rm {} \;
+
+echo "Cleaning existing optimized images..."
+find "${IMAGES_OPTIMIZED_FOLDER}" -type f -name "*.png" -exec rm {} \;
+
+IMAGES="$(find "${IMAGES_RAW_FOLDER}" -type f -name "*.??g" | sort)"
+
+while read -r INPUT_FILE; do
+  if [[ -n "${INPUT_FILE}" ]]; then
+    HASH="$(echo "${INPUT_FILE%.*}" | md5sum | cut -c1-32)"
+    OUTPUT_FILE="${IMAGES_OPTIMIZED_FOLDER}/${HASH}.png"
+    echo "  OUTPUT_FILE: ${OUTPUT_FILE}"
+
+    if [[ -f "${OUTPUT_FILE}" ]]; then
+      echo "   - Already optimized"
+    else
+      mkdir -p "$(dirname ${OUTPUT_FILE})"
+
+      echo "   + Converting..."
+      convert "${INPUT_FILE}" -resize "${RESIZE_OPTION}^" ${CROP_PARAMETERS} ${CONVERT_OPTIONS} "${OUTPUT_FILE}"
+      echo "   + Optimizing..."
+      optipng ${OPTIPNG_OPTIONS} "${OUTPUT_FILE}"
+    fi
+  fi
+done < <(echo "${IMAGES}")
+
+echo "done."
diff --git a/scripts/02_build_images_assets_list.sh b/scripts/02_build_images_assets_list.sh
new file mode 100755
index 0000000..3e9e3db
--- /dev/null
+++ b/scripts/02_build_images_assets_list.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+
+command -v jq >/dev/null 2>&1 || { echo >&2 "I require jq (json parser) but it's not installed. Aborting."; exit 1; }
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+BASE_DIR="$(dirname "${CURRENT_DIR}")"
+
+ASSETS_BASE_FOLDER="${BASE_DIR}/assets"
+OUTPUT_ASSETS_FILE="${ASSETS_BASE_FOLDER}/files/images.json"
+IMAGES_ASSETS_FOLDER="${ASSETS_BASE_FOLDER}/images"
+touch "${OUTPUT_ASSETS_FILE}"
+
+IMAGES_CACHE_FOLDER="${CURRENT_DIR}/cache"
+IMAGES_OPTIMIZED_FOLDER="${IMAGES_CACHE_FOLDER}/02_optimized_images"
+
+echo "Cleaning empty/temp files..."
+find "${IMAGES_OPTIMIZED_FOLDER}" -type f -name "*.png" -empty -exec rm {} \;
+find "${IMAGES_OPTIMIZED_FOLDER}" -type f -name "*.tmp*" -exec rm {} \;
+
+echo "Move new optimized images..."
+find "${IMAGES_OPTIMIZED_FOLDER}" -type f -name "*.png" -exec mv -v {} "${IMAGES_ASSETS_FOLDER}" \;
+
+echo "Building assets json file..."
+
+FILES="$(find "${IMAGES_ASSETS_FOLDER}" -type f -name "*.png" | sed "s|^${IMAGES_OPTIMIZED_FOLDER}/||g" | sort)"
+
+OUTPUT_ASSETS_FILE_TMP="${OUTPUT_ASSETS_FILE}.tmp"
+echo "{" > "${OUTPUT_ASSETS_FILE_TMP}"
+echo "  \"images\": [" >> "${OUTPUT_ASSETS_FILE_TMP}"
+while read -r FILE; do
+  FILE_CODE="$(basename "${FILE%.*}")"
+  if [[ -n "${FILE}" ]]; then
+    echo "- ${FILE_CODE}"
+    echo "    \"${FILE_CODE}\"," >> "${OUTPUT_ASSETS_FILE_TMP}"
+  fi
+done < <(echo "${FILES}")
+echo "    \"\"" >> "${OUTPUT_ASSETS_FILE_TMP}"
+echo "  ]" >> "${OUTPUT_ASSETS_FILE_TMP}"
+echo "}" >> "${OUTPUT_ASSETS_FILE_TMP}"
+
+# Format json
+cat "${OUTPUT_ASSETS_FILE_TMP}" | jq > "${OUTPUT_ASSETS_FILE}"
+rm "${OUTPUT_ASSETS_FILE_TMP}"
+
+echo "done."
diff --git a/scripts/cache/01_raw_images/.gitkeep b/scripts/cache/01_raw_images/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/scripts/cache/02_optimized_images/.gitkeep b/scripts/cache/02_optimized_images/.gitkeep
new file mode 100644
index 0000000..e69de29
-- 
GitLab