Sunday, December 24, 2017

IMAGE THUMBNAILER

#!/bin/bash
#set -x 
declare -i THUMBCLOBBER=${2:-0}
declare -i REBUILDHTML=${1:-0}
declare -r THUMBNAILSIZE="100x100"
declare -r THUMBDIR=".thumb" 
declare -r IMGEXT="{jpg,jpeg,img,gif,png}"
declare -r THUMBSHTML=".thumbs.html" 
declare -r THUMBPREFIX="_thumb_"
declare -r TOGGLENULLGLOB="$(shopt -p nullglob)"
declare -r TOGGLEFAILGLOB="$(shopt -p failglob)"
declare -i CLOSEHTMLFLAG=0 

  ## any additional argument means rebuild all thumbnails 
[[ ! -z $1 ]] && THUMBCLOBBER=1
[[ ! -z $2 ]] && THUMBCLOBBER=0 && REBUILDHTML=1 

function get_html_clock() { 
cat << EOF

<script>
var clsStopwatch = function() {
  // Private vars
  var startAt = 0; // Time of last start / resume. (0 if not running)
  var lapTime = 0; // Time on the clock when last stopped in milliseconds

  var now = function() {
    return (new Date()).getTime(); 
   }; 
 
  // Public methods
  // Start or resume
  this.start = function() {
    startAt = startAt ? startAt : now();
   };

  // Stop or pause
  this.stop = function() {
    // If running, update elapsed time otherwise keep it
    lapTime = startAt ? lapTime + now() - startAt : lapTime;
    startAt = 0; // Paused
   };

  // Reset
  this.reset = function() {
    lapTime = startAt = 0;
   };

  // Duration
  this.time = function() {
    return lapTime + (startAt ? now() - startAt : 0); 
   };
};

var x = new clsStopwatch();
var \$time;
var clocktimer;

function pad(num, size) {
 var s = "0000" + num;
 return s.substr(s.length - size);
}

function formatTime(time) {
 var h = m = s = ms = 0;
 var newTime = '';

 h = Math.floor( time / (60 * 60 * 1000) );
 time = time % (60 * 60 * 1000);
 m = Math.floor( time / (60 * 1000) );
 time = time % (60 * 1000);
 s = Math.floor( time / 1000 );
 ms = time % 1000;

 newTime = pad(h, 2) + ':' + pad(m, 2) + ':' + pad(s, 2);
 return newTime;
}

function startTime() {
 \$time = document.getElementById('clock');
 update();
    start(); 
}

function update() {
 \$time.innerHTML = formatTime(x.time());
}

function start() {
 clocktimer = setInterval("update()", 1);
 x.start();
}

function stop() {
 x.stop();
 clearInterval(clocktimer);
}

function reset() {
 stop();
 x.reset();
 update();
}
</script>

<style type="text/css">
.clock {
    position: fixed;
    background: rgba(255,255,255,.5);
    bottom: 0px;
    padding: 10px;
    left: 40%;
    width: 180px;
}
</style>
EOF
}

[[ ! -d "$THUMBDIR" ]] && mkdir "$THUMBDIR"
if [[ ! -f "$THUMBSHTML" ]] || (($THUMBCLOBBER)) || (($REBUILDHTML)); then
 echo "Begin - searching for images, generating thumbnails and index file ... "  
 echo "<html><head><title>generated thumbs</title>$(get_html_clock)</head><body onload=\"startTime()\"><div class=\"clock\" id=\"clock\"></div>" > "$THUMBSHTML"
else 
   ## rid the last line since we will be appending.. 
 echo "Appending to existing thumbnail file $THUMBSHTML ... "  
 sed -i '$d' "$THUMBSHTML"
fi 

echo "Making thumbnails for all $IMGEXT files ... " 
## use ls not echo in the eval since the echo is eval'd and the glob needs to match we can't add a newline 
## ls will parse the glob and spit out newlines that we can use 
#set -x 
shopt -s nullglob  
shopt -s failglob

 ## Url encodes the troublesome ascii range of 20-47. 
function urlencode() { 
 ## Note, keep the % replacement all the way on the lefthand side so it doesn't 
 ## get applied to the subsequent subtitutions. \x25 the period '.' was removed 
 ## since it causes trouble to sed and isn't necessary. 
 sed 's/\x25/%25/g;s/\x20/%20/g;s/\x21/%21/g;s/\x22/%22/g;s/\x23/%23/g;s/\x5c\x24/%24/g;s/\x26/%26/g;s/\x27/%27/g;s/\x28/%28/g;s/\x29/%29/g;s/\x2A/%2A/g;s/\x2B/%2B/g;s/\x2C/%2C/g;s/\x2D/%2D/g;s/\x3A/%3A/g;s/\x3F/%3F/g;s/\x7C/%7C/g;s/\x5c\x5B/%5B/g'  <<< "${1}"
} 

while IFS= read -r -d '' each_img; do 
 THUMBNAME="${THUMBDIR}/${THUMBPREFIX}$(basename "${each_img}")" ## get the base name, we're following links
if [[ ! -f "$THUMBNAME" ]] || (($THUMBCLOBBER)) || (($REBUILDHTML)); then 
 ((! $REBUILDHTML)) && echo "Creating $THUMBNAILSIZE thumbnail for $each_img in ${PWD}/${THUMBDIR} ... "  
  ((! $REBUILDHTML)) && /usr/bin/convert -- "${each_img}" -resize "$THUMBNAILSIZE" "$THUMBNAME"  
 if (($REBUILDHTML)); then 
   if [[ -f "$THUMBNAME" ]]; then 
      echo "Rebuilding Html skipping create thumb for $THUMBNAME exists already.. " 
   else 
      echo "*** Rebuilding html file yet $THUMBNAME does not yet exist !! .. " 
      continue; ## jump to top of for loop without writing this html entry
   fi  
 fi    
   ## Encode any %'s into a percent in html, %25. URL Encode single quotes \x27->%27, #'s \x23->%23.                 
 echo "<a href='${each_img}'><img src='http://localhost:8000$(pwd)/$(urlencode "${THUMBNAME}")' alt='${each_img}'/></a>" >> "$THUMBSHTML"
 CLOSEHTMLFLAG=1 
else 
 echo "Skipping ${PWD}/${THUMBDIR} file already exists ... "
fi 
done < <(find . -maxdepth 1 \( -type f -o -type l \) ! -path .thumb \( -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' -o -name '*.JPG' -o -name '*.gif' \) -exec readlink -fz {} \;);          

if (($CLOSEHTMLFLAG)); then 
 echo -en "</body></html>" >> "$THUMBSHTML"
else 
 IMAGES=$(grep -c "img src" "$THUMBSHTML") 
 if ((! ! $IMAGES)); then 
   echo "</body></html>" >> "$THUMBSHTML"
 else 
   rm "$THUMBSHTML"; # no images so html file is empty.. better to be tidy and nip it here than
 fi                  # offload to other programs that use this file..  
 echo "No images to process .. " 
fi  

eval "$TOGGLENULLGLOB"
eval "$TOGGLEFAILGLOB"
echo "Done ..."
exit 0 
alias mvthm='_(){ thumbs.bsh "$1" "$2";if [[ -f ".thumbs.html" ]];then firefox ".thumbs.html"; fi; }; _'

No comments:

Post a Comment