feat: updated and optimized optimize-pictures
This commit is contained in:
1 parent
1caf2a2590
commit
ededc51718
1 file changed
+203
-5
+203
-5
@@ -384,7 +384,7 @@ end
|
|||||||
|
|
||||||
function optimize-jpegs
|
function optimize-jpegs
|
||||||
if command -q jpegoptim
|
if command -q jpegoptim
|
||||||
find . -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.jpe' \) -exec jpegoptim --strip-none {} +
|
find . -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.jpe' -o -iname '*.jif' -o -iname '*.jfif' -o -iname '*.jfi' \) -exec jpegoptim --strip-none {} +
|
||||||
else
|
else
|
||||||
echo "jpegoptim is not installed. Install it with: sudo pacman -S jpegoptim"
|
echo "jpegoptim is not installed. Install it with: sudo pacman -S jpegoptim"
|
||||||
end
|
end
|
||||||
@@ -406,8 +406,206 @@ function optimize-gifs
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function optimize-pictures
|
function optimize-webps
|
||||||
optimize-jpegs
|
if command -q cwebp
|
||||||
optimize-pngs
|
find . -type f -iname '*.webp' -exec sh -c 'for f; do cwebp -lossless -quiet "$f" -o "$f.tmp" && mv "$f.tmp" "$f"; done' sh {} +
|
||||||
optimize-gifs
|
else
|
||||||
|
echo "cwebp is not installed. Install it with: sudo pacman -S libwebp-utils"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function optimize-svgs
|
||||||
|
if command -q svgo
|
||||||
|
find . -type f -iname '*.svg' -exec svgo {} +
|
||||||
|
else
|
||||||
|
echo "svgo is not installed. Install it with: sudo pacman -S svgo"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function __opt_size --description "Format a byte count as human-readable"
|
||||||
|
set -l b $argv[1]
|
||||||
|
if test $b -ge 1073741824
|
||||||
|
printf '%.1fG' (math "$b / 1073741824")
|
||||||
|
else if test $b -ge 1048576
|
||||||
|
printf '%.1fM' (math "$b / 1048576")
|
||||||
|
else if test $b -ge 1024
|
||||||
|
printf '%.1fK' (math "$b / 1024")
|
||||||
|
else
|
||||||
|
printf '%dB' $b
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function optimize-pictures --description "Optimize images in one pass. Flags: --continue resume, -v/--verbose show tool output"
|
||||||
|
set -l cache_file "$PWD/.optimize-pictures.cache"
|
||||||
|
set -l state_file "$PWD/.optimize-pictures.state"
|
||||||
|
set -l rebuild 1
|
||||||
|
set -l verbose 0
|
||||||
|
|
||||||
|
for arg in $argv
|
||||||
|
switch $arg
|
||||||
|
case --continue
|
||||||
|
set rebuild 0
|
||||||
|
case --verbose -v
|
||||||
|
set verbose 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if test $rebuild -eq 0
|
||||||
|
if not test -f "$cache_file"
|
||||||
|
echo "optimize-pictures: no cache file found at $cache_file" >&2
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
else
|
||||||
|
find . -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.jpe' -o -iname '*.jif' -o -iname '*.jfif' -o -iname '*.jfi' -o -iname '*.png' -o -iname '*.gif' -o -iname '*.webp' -o -iname '*.svg' \) > "$cache_file"
|
||||||
|
end
|
||||||
|
|
||||||
|
if not test -s "$cache_file"
|
||||||
|
echo "optimize-pictures: no images to optimize."
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
set -l remaining_file "$cache_file.tmp"
|
||||||
|
: > "$remaining_file"
|
||||||
|
|
||||||
|
set -l total (count (cat $cache_file))
|
||||||
|
set -l done 0
|
||||||
|
set -l saved 0
|
||||||
|
set -l original 0
|
||||||
|
|
||||||
|
if test $rebuild -eq 0
|
||||||
|
set -l st (string split ' ' -- (cat "$state_file" 2>/dev/null))
|
||||||
|
if test (count $st) -ge 2
|
||||||
|
set saved $st[1]
|
||||||
|
set original $st[2]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
set -l live 0
|
||||||
|
if isatty stdout; and test $verbose -eq 0
|
||||||
|
set live 1
|
||||||
|
end
|
||||||
|
|
||||||
|
while read -l file
|
||||||
|
set done (math $done + 1)
|
||||||
|
set -l ext (string lower -- (string split -r '.' -- $file)[-1])
|
||||||
|
set -l before (stat -c%s -- "$file" 2>/dev/null; or echo 0)
|
||||||
|
set -l ok 1
|
||||||
|
|
||||||
|
switch $ext
|
||||||
|
case jpg jpeg jpe jif jfif
|
||||||
|
if command -q jpegoptim
|
||||||
|
if test $verbose -eq 1
|
||||||
|
jpegoptim --strip-none "$file"
|
||||||
|
else
|
||||||
|
jpegoptim --strip-none "$file" >/dev/null 2>&1
|
||||||
|
end
|
||||||
|
set ok $status
|
||||||
|
else
|
||||||
|
echo "jpegoptim not installed, skipping: $file" >&2
|
||||||
|
end
|
||||||
|
case png
|
||||||
|
if command -q oxipng
|
||||||
|
if test $verbose -eq 1
|
||||||
|
oxipng "$file"
|
||||||
|
else
|
||||||
|
oxipng "$file" >/dev/null 2>&1
|
||||||
|
end
|
||||||
|
set ok $status
|
||||||
|
else
|
||||||
|
echo "oxipng not installed, skipping: $file" >&2
|
||||||
|
end
|
||||||
|
case gif
|
||||||
|
if command -q gifsicle
|
||||||
|
if test $verbose -eq 1
|
||||||
|
gifsicle -b -O3 "$file"
|
||||||
|
else
|
||||||
|
gifsicle -b -O3 "$file" >/dev/null 2>&1
|
||||||
|
end
|
||||||
|
set ok $status
|
||||||
|
else
|
||||||
|
echo "gifsicle not installed, skipping: $file" >&2
|
||||||
|
end
|
||||||
|
case webp
|
||||||
|
if command -q cwebp
|
||||||
|
if test $verbose -eq 1
|
||||||
|
cwebp -lossless "$file" -o "$file.tmp"
|
||||||
|
else
|
||||||
|
cwebp -lossless -quiet "$file" -o "$file.tmp" >/dev/null 2>&1
|
||||||
|
end
|
||||||
|
set ok $status
|
||||||
|
if test $ok -eq 0
|
||||||
|
mv "$file.tmp" "$file"
|
||||||
|
set ok $status
|
||||||
|
end
|
||||||
|
else
|
||||||
|
echo "cwebp not installed, skipping: $file" >&2
|
||||||
|
end
|
||||||
|
case svg
|
||||||
|
if command -q svgo
|
||||||
|
if test $verbose -eq 1
|
||||||
|
svgo "$file"
|
||||||
|
else
|
||||||
|
svgo "$file" >/dev/null 2>&1
|
||||||
|
end
|
||||||
|
set ok $status
|
||||||
|
else
|
||||||
|
echo "svgo not installed, skipping: $file" >&2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
set original (math $original + $before)
|
||||||
|
if test $ok -eq 0
|
||||||
|
set -l after (stat -c%s -- "$file" 2>/dev/null; or echo 0)
|
||||||
|
if test $after -lt $before
|
||||||
|
set saved (math $saved + $before - $after)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
echo "$file" >> "$remaining_file"
|
||||||
|
end
|
||||||
|
|
||||||
|
echo "$saved $original" > "$state_file"
|
||||||
|
|
||||||
|
set -l pct 0
|
||||||
|
if test $original -gt 0
|
||||||
|
set pct (math "round($saved * 100 / $original)")
|
||||||
|
end
|
||||||
|
|
||||||
|
if test $live -eq 1
|
||||||
|
printf '\r\033[2K[%d/%d] %s saved %s (%d%%)' $done $total $file (__opt_size $saved) $pct
|
||||||
|
else if test $verbose -eq 0
|
||||||
|
printf '[%d/%d] %s saved %s (%d%%)\n' $done $total $file (__opt_size $saved) $pct
|
||||||
|
end
|
||||||
|
end < "$cache_file"
|
||||||
|
|
||||||
|
if test $live -eq 1
|
||||||
|
echo
|
||||||
|
end
|
||||||
|
|
||||||
|
mv "$remaining_file" "$cache_file"
|
||||||
|
|
||||||
|
set -l pct 0
|
||||||
|
if test $original -gt 0
|
||||||
|
set pct (math "round($saved * 100 / $original)")
|
||||||
|
end
|
||||||
|
set -l sz (__opt_size $saved)
|
||||||
|
|
||||||
|
if not test -s "$cache_file"
|
||||||
|
rm -f "$cache_file" "$state_file"
|
||||||
|
echo "optimize-pictures: optimized $done images, saved $sz ($pct%)."
|
||||||
|
else
|
||||||
|
set -l remaining (count (cat $cache_file))
|
||||||
|
echo "optimize-pictures: $remaining images remaining (saved so far: $sz, $pct%). Run 'optimize-pictures --continue' to resume."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function install-optimizer --description "Install image optimizer packages (Arch/pacman)"
|
||||||
|
if not command -q pacman
|
||||||
|
echo "install-optimizer: pacman not found. This helper is for Arch Linux." >&2
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
set -l pkgs jpegoptim oxipng gifsicle libwebp-utils svgo
|
||||||
|
if test (count $argv) -gt 0
|
||||||
|
set pkgs $argv
|
||||||
|
end
|
||||||
|
sudo pacman -S --needed $pkgs
|
||||||
end
|
end
|
||||||
Reference in new issue
Block a user