#!/bin/sh printf '%s' \ '/*! * mkpicindex.sh - v0.1 * https://codevoid.de * Copyright (c) 2019 Stefan Hagen * Licensed under the ISC license. */ ' > LICENSE # CONFIGURE TITLE="My Gallery" # browser title WIDTH=850 # how wide will the gallery be ROW_HEIGHT=180 # how high will the justified rows be? THUMB_QUALITY=83 # quality for thumbnails THUMB_PATH="thm" # relative path to thumbnail folder THUMB_PADDING="6" # image padding # TECHNICAL STUFF DEBUG=0 # debug output THREADS=4 # PRINT HELP / USAGE TEXT usage() { printf '%s\n' \ 'Usage: mkpicindex [option] > outfile.html Options: -t "My Gallery" - Title -w 850 - Width -h 180 - Row height -q 83 - Thumbnail quality -b 6 - Thumbnail border -p 8 - Max convert processes -d - Debug mode -h - This help ' exit 2 } # OVERIDE DEFAULTS while getopts 't:w:h:b:q:p:d' c do case $c in t) TITLE="$OPTARG" ;; w) WIDTH="$OPTARG" ;; h) ROW_HEIGHT="$OPTARG" ;; q) QUALITY="$OPTARG" ;; b) THUMB_PADDING="$OPTARG" ;; p) THREADS="$OPTARG" ;; d) DEBUG=1 ;; ?|*) usage; ;; esac done # PRINT USAGE IF OUTPUT IS NOT REDIRECTED [ "$DEBUG" != 1 ] && test -t 1 && usage; # GLOBAL TMP VARIABLES G_ROW_WIDTH=0 # combined pic width < WIDTH @ ROW_HEIGHT G_ROW_FILES="" # pipe separated files < WIDTH MORE=1 # trigger next loop ### ZE PROGAM STARTZ HERE ############################################## # CREATE THUMBNAIL DIRECTORY mkdir -p "$THUMB_PATH" # OUTPUT HELPER debug() { [ "$DEBUG" == "1" ] && printf '%s\n' "Debug: $1" >&2; } console() { printf '%s\n' "$1" >&2; } # CALCULATE BY ASPECT RATIO get_width_by_height() { # returns aspect ratio calculated width local F="$1" # image file local TH="$2" # target height local WH="$(identify -format ' %w %h ' "$1" | awk '{ printf("%.3f %.3f",$1,$2) }')" local R="$(printf "$WH" | awk -vTH=$TH '{ printf("%.0f", TH*($1/$2)) }')" printf '%.0f' "$R" debug "get_width_by_height: FILE=$F TARGET_HEIGHT=$TH FILE_WxH=$WH RET_WIDTH=$R" } # TOO MANY CONVERT PROCSSES => WAIT thread_check() { while [ $(pgrep convert | wc -l | awk '{ print $1 }') -gt $THREADS ]; do console "More than $THREADS convert threads. Waiting..."; sleep 2; done } # CREATE THUMBNAIL create_thumb() { local F="$1" # original local W="$2" # width local H="$3" # height local T="${F%%.*}-$H" if [ -f "$THUMB_PATH/$T.gif" ]; then printf '%s' "$THUMB_PATH/$T.gif" elif [ -f "$THUMB_PATH/$T.jpeg" ]; then printf '%s' "$THUMB_PATH/$T.jpeg" else thread_check case $(printf '%s' "${F##*.}" | tr '[:upper:]' '[:lower:]') in gif) console "Creating Thumbnail: $THUMB_PATH/$T.gif" nohup convert -quality $THUMB_QUALITY -sharpen 2x2 \ -coalesce -resize 6000x$H\> \ -deconstruct "$F" \ "$THUMB_PATH/$T.gif" >/dev/null 2>&1 & printf '%s' "$THUMB_PATH/$T.gif" ;; *) console "Creating Thumbnail: $THUMB_PATH/$T.jpeg" nohup convert -quality $THUMB_QUALITY -sharpen 2x2 \ -resize 6000x$H\> "$F" \ "$THUMB_PATH/$T.jpeg" >/dev/null 2>&1 & printf '%s' "$THUMB_PATH/$T.jpeg" ;; esac fi } # ADD IMAGE LOOP add_image() { local F="$1" # image file # How wide would the image be when we rescale it to $ROW_HEIGHT? local NW=$(get_width_by_height "$F" "$ROW_HEIGHT") debug "add_image: FILE=$F NW=${NW}x$ROW_HEIGHT" # We add images and their width to $G_ROW_WIDTH until $WIDTH will # be exceeded. if [ "$(( $G_ROW_WIDTH + $NW ))" -gt "$WIDTH" ]; then debug "add_image: max width reached with F=$F @ $G_ROW_WIDTH" # we're building a row now printf "