diff --git a/scripts/index.sh b/scripts/index.sh index 5c2c984..55348d1 100755 --- a/scripts/index.sh +++ b/scripts/index.sh @@ -4,4 +4,7 @@ source ~/.scripts/debloc.sh source ~/.scripts/dotfiles.sh source ~/.scripts/installPreferences.sh source ~/.scripts/installArch.sh +function optimize { + bash ~/.scripts/optimize.sh +} alias beep=~/.scripts/beep.sh diff --git a/scripts/optimize.sh b/scripts/optimize.sh new file mode 100755 index 0000000..67af906 --- /dev/null +++ b/scripts/optimize.sh @@ -0,0 +1,136 @@ +#!/usr/bin/env bash + +# Optimizes everything the script can find in a folder, +# meaning it will compress files as much as possible, +# without losing any data (verification will be done +# in order to verify that no data has been done) +# (executable) + +# TODO Run in parallel + +dir=${1:-$PWD} +total=$(mktemp) +echo -n 0 > $total + +function showtotal { + echo "Total saved: $(cat "$total") bytes" + rm $total + exit +} + +trap showtotal SIGTERM SIGINT SIGFPE + +function replaceImg { # candidate original + + c="$1" + o="$2" + + # File verifications + if [ ! -f "$o" ]; then + echo "→ Original is inexistant, skipping!" + return + fi + if [ ! -f "$c" ]; then + echo "→ Candidate is inexistant, skipping!" + return + fi + + # Size verifications + cs=$(wc -c "$c" | cut -d' ' -f1) + os=$(wc -c "$o" | cut -d' ' -f1) + if [ $cs -le 0 ]; then + echo "→ Candidate is empty, skipping!" + rm "$c" + return + fi + if [ $cs -eq $os ]; then + echo "→ Candidate weight the same, skipping." + rm "$c" + return + fi + if [ $cs -gt $os ]; then + echo "→ Candidate is larger, skipping." + rm "$c" + return + fi + + # Bitmap verification + ppmc="$(mktemp --suffix .ppm)" + ppmo="$(mktemp --suffix .ppm)" + convert "$c" "$ppmc" + convert "$o" "$ppmo" + + if cmp --silent "$ppmo" "$ppmc"; then + mv "$c" "$o" + saved=$(($os - $cs)) + echo "→ $os ⇒ $cs (saved $saved bytes)" + newtotal=$(($(cat $total) + $saved)) + echo -n $newtotal > $total + else + echo "→ Candidate don't have the same bit map as original, skipping!" + fi + rm "$ppmc" "$ppmo" + +} + +# JPEG (requires jpegtran) +while read image +do + echo Processing $image + + prog=$(mktemp --suffix .jpg) + jpegtran -copy all -progressive "$image" > "$prog" + echo "→ Progressive done" + + optz=$(mktemp --suffix .jpg) + jpegtran -copy all -optimize "$image" > "$optz" + echo "→ Optimize done" + + progs=$(wc -c "$prog" | cut -d' ' -f1) + optzs=$(wc -c "$optz" | cut -d' ' -f1) + if [[ $progs -le $optzs ]]; then + echo "→ Using progressive" + replaceImg "$prog" "$image" + rm "$optz" + else + echo "→ Using optimized" + replaceImg "$optz" "$image" + rm "$prog" + fi + +done <<< "$(find $dir -type f -iregex ".+.jpe?g$")" + +# PNG (requires optipng) +while read image +do + echo Processing $image + + temp=$(mktemp --suffix .png) + cp "$image" "$temp" + optipng -o7 -quiet "$temp" + echo "→ Optimize done" + + replaceImg "$temp" "$image" + +done <<< "$(find $dir -type f -iname "*.png")" + +# SVG (requires svgo) +while read image +do + echo Processing $image + + temp=$(mktemp --suffix .svg) + cp "$image" "$temp" + svgo --quiet "$temp" + echo "→ Optimize done" + + replaceImg "$temp" "$image" + +done <<< "$(find $dir -type f -iname "*.svg")" + +# GIT (requires git) +find $dir -type d -name .git -print0 | while IFS= read -r -d '' dir; do + (cd "$dir"; git gc) +done + +showtotal