#!/bin/bash
# gallery.sh
# Author: Nils Knieling - https://github.com/Cyclenerd/gallery_shell
# Inspired by: Shapor Naghibzadeh - https://github.com/shapor/bashgal
#########################################################################################
#### Configuration Section
#########################################################################################
height_small=187
height_large=768
quality=85
thumbdir=__thumbs
htmlfile=index.html
title="Gallery"
footer='Created with gallery.sh'
# Use convert from ImageMagick
convert="convert"
# Use JHead for EXIF Information
exif="jhead"
# Bootstrap (currently v3.3.7)
# Latest compiled and minified CSS
stylesheet="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
downloadicon=''
movieicon=''
homeicon=''
# Debugging output
# true=enable, false=disable
debug=true
#########################################################################################
#### End Configuration Section
#########################################################################################
me=$(basename "$0")
datetime=$(date -u "+%Y-%m-%d %H:%M:%S")
datetime+=" UTC"
function usage {
returnCode="$1"
echo -e "Usage: $me [-t
] [-h]:
[-t ]\t sets the title (default: $title)
[-h]\t\t displays help (this message)"
exit "$returnCode"
}
function debugOutput(){
if [[ "$debug" == true ]]; then
echo "$1" # if debug variable is true, echo whatever's passed to the function
fi
}
function getFileSize(){
# Be aware that BSD stat doesn't support --version and -c
stat --version &>/dev/null
if [[ "${?}" -eq "0" ]]; then
# GNU
local myfilesize=$(stat -c %s "$1" | awk '{$1/=1000000;printf "%.2fMB\n",$1}')
else
# BSD
local myfilesize=$(stat -f %z "$1" | awk '{$1/=1000000;printf "%.2fMB\n",$1}')
fi
echo "$myfilesize"
}
while getopts ":t:h" opt; do
case $opt in
t)
title="$OPTARG"
;;
h)
usage 0
;;
*)
echo "Invalid option: -$OPTARG"
usage 1
;;
esac
done
debugOutput "- $me : $datetime"
### Check Commands
command -v $convert >/dev/null 2>&1 || { echo >&2 "!!! $convert it's not installed. Aborting."; exit 1; }
command -v $exif >/dev/null 2>&1 || { echo >&2 "!!! $exif it's not installed. Aborting."; exit 1; }
### Create Folders
[[ -d $thumbdir ]] || mkdir $thumbdir || exit 2
heights[0]=$height_small
heights[1]=$height_large
for res in ${heights[*]}; do
[[ -d $thumbdir/$res ]] || mkdir -p $thumbdir/$res || exit 3
done
#### Create Startpage
debugOutput "$htmlfile"
cat > "$htmlfile" << EOF
$title
$title
EOF
### Photos (JPG)
if [[ $(find . -maxdepth 1 -type f -name \*.jpg | wc -l) -gt 0 ]]; then
echo '
' >> "$htmlfile"
## Generate Images
numfiles=0
for filename in *.[jJ][pP][gG]; do
filelist[$numfiles]=$filename
let numfiles++
for res in ${heights[*]}; do
if [[ ! -s $thumbdir/$res/$filename ]]; then
debugOutput "$thumbdir/$res/$filename"
$convert -auto-orient -strip -quality $quality -resize x$res "$filename" "$thumbdir/$res/$filename"
fi
done
cat >> "$htmlfile" << EOF
EOF
# EXIF
if [[ $exifinfo ]]; then
cat >> "$imagehtmlfile" << EOF
$exifinfo
EOF
fi
# Footer
cat >> "$imagehtmlfile" << EOF
EOF
let file++
done
fi
### Movies (MOV or MP4)
if [[ $(find . -maxdepth 1 -type f -name \*.mov -o -name '*.mp4' | wc -l) -gt 0 ]]; then
cat >> "$htmlfile" << EOF
Movies
EOF
if [[ $(find . -maxdepth 1 -type f -name \*.mov | wc -l) -gt 0 ]]; then
for filename in *.[mM][oO][vV]; do
filesize=$(getFileSize "$filename")
cat >> "$htmlfile" << EOF
$movieicon $filename ($filesize)
EOF
done
fi
if [[ $(find . -maxdepth 1 -type f -name \*.mp4 | wc -l) -gt 0 ]]; then
for filename in *.[mM][pP]4; do
filesize=$(getFileSize "$filename")
cat >> "$htmlfile" << EOF
$movieicon $filename ($filesize)
EOF
done
fi
echo '
' >> "$htmlfile"
fi
### Downloads (ZIP)
if [[ $(find . -maxdepth 1 -type f -name \*.zip | wc -l) -gt 0 ]]; then
cat >> "$htmlfile" << EOF
Downloads
EOF
for filename in *.[zZ][iI][pP]; do
filesize=$(getFileSize "$filename")
cat >> "$htmlfile" << EOF
$downloadicon $filename ($filesize)
EOF
done
echo '