add webp-convert.sh, fix quotes in lastframe.sh
authorAndrew Lorimer <andrew@lorimer.id.au>
Tue, 14 Jun 2022 05:51:16 +0000 (15:51 +1000)
committerAndrew Lorimer <andrew@lorimer.id.au>
Tue, 14 Jun 2022 05:51:16 +0000 (15:51 +1000)
lastframe.sh
webp-convert.sh [new file with mode: 0755]
index 45dd9950317bdc69d21c668a3a005c08a1624114..611c862d8f98f94485311b51122444ea95218ae5 100755 (executable)
@@ -1,9 +1,9 @@
 #!/bin/bash
 
-input_fn='input.mov'
+input_fn="input.mov"
 
 image_fn='output.png'
 
-frame_count=`ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 $input_fn`
+frame_count=`ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 "$input_fn"`
 
-ffmpeg -i $input_fn -vf "select='eq(n,$frame_count-1)'" -vframes 1 "$image_fn" 2> /dev/null
+ffmpeg -i "$input_fn" -vf "select='eq(n,$frame_count-1)'" -vframes 1 "$image_fn" 2> /dev/null
diff --git a/webp-convert.sh b/webp-convert.sh
new file mode 100755 (executable)
index 0000000..be7d1f7
--- /dev/null
@@ -0,0 +1,60 @@
+#!/bin/bash
+#
+# webp-convert.sh
+#
+# Search through HTML and PHP files in a directory, get a list of the image
+# files used (jpg/png), and convert these to webp in the same directory as
+# the originals. Can be used with a rewrite rule on the web server to 
+# serve the webp file when the original is requested.
+#
+# Andrew Lorimer, January 2021
+#
+
+docroot=$1
+if [ ! $docroot ]; then
+  docroot=.
+fi;
+
+convert_count=0
+larger_count=0
+
+echo "Converting files in $docroot"
+convert_webp () {
+  # Perform the conversion. Takes input filename, output filename.
+  if [[ "$1" == *.png ]]; then
+    # PNG conversion
+    convert "$1" -quality 75 -define webp:lossless=true "$2"
+    echo "Converted $1 to $2"
+  else
+    # JPG conversion
+    convert "$1" -quality 75 "$2"
+    echo "Converted $1 to $2"
+  fi
+  ((convert_count+=1))
+
+  # Check if webp is actually smaller than original and remove if not
+  orig_size=$(stat -c%s "$1")
+  webp_size=$(stat -c%s "$2")
+  if (( webp_size > orig_size )); then
+    rm $2
+    echo "Removed $2 as it was larger than $1 ($webp_size > $orig_size)"
+    ((larger_count+=1))
+    return 1
+  fi
+  return 0
+}
+
+while read -r srcfile; do
+    while IFS= read -r file; do
+      file_path=$(echo $file | sed "s|^.|$docroot/|")
+      webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$file_path")
+      
+      # Convert if not already converted
+      if [ ! -f "$webp_path" ]; then
+        convert_webp $file_path $webp_path
+      fi
+    done < <(sed -n "s:.*<img src=\"\([^\"]*\.\(jpe\?g\|png\)\)\".*:\1:p" $srcfile)
+done <<< "$(find $docroot -type f -and \( -iname "*.php" -o -iname "*.html" \))"
+
+net=$((convert_count-larger_count))
+echo "Converted $convert_count of which $larger_count were larger than the original (net $net)"