#!/bin/bash

# little script to generate image galleries for use with original.
# uses imagemagick's convert
# (c) 2005 boris de laage <bdelaage@free.fr>
# based on imgconv by Jakub Steiner
#
#�The 'help' section sucks, as my english does.


#default options
dir=./web-gallery
zip=0
rotate=0
mq=0
hq=0
interactive=0
verbose=echo

#info.txt stuff
gal_auth=""
gal_name=""
gal_desc=""
gal_date=""
gal_user=""
gal_pass=""

# convert options
convertor=`which convert`
jhead=`which jhead`
extra_ops="-strip"

# This script
name=`basename $0`

# getopt stuff
shortopts="a:hHin:d:D:Mqo:Zr"
longopts="author:quiet,help,interactive,name:,date:,description:,\
mq,hq,output:,archive,rotate"



function echo_help {
cat <<EOF
Usage : $1 [OPTIONS]... [FILE]...
Convert FILEs

  -o, --output DIR           make gallery in DIR
  -M, --mq                   include 1024x768 images (MQ)
  -H, --hq                   include original images (HQ)
  -Z, --archive              make archives
  -i, --interactive          edit gallery informations interactively
  -a, --author NAME          set author's name
  -n, --name NAME            set gallery's name
  -d, --date DATE            set date to DATE
  -D, --description DESC     description
  -r, --rotate               automatically rotate image based on EXIF
  -q, --quiet                don't say anything
  -h, --help                 display this help and exit

FILEs must be JPG, JPEG or PNG. if DIR is not given, the
gallery will be created in $dir.

EOF

}

good_file() {
    local ftype

    ftype=`file -b "$1" | cut -d " " -f 1`

    if [ "$ftype" == "JPG" ] || [ "$ftype" == "JPEG" ] || [ "$ftype" == "PNG" ]
    then
	return 0
    else
	return 1
    fi

}


# If we don't have ImageMagick, cry & exit
if [ -z $convertor ]; then
    echo "convert not found... Please install ImageMagick."
    exit 1
fi


# Parse options
TEMP=`getopt -o $shortopts --long $longopts -n $name -- "$@"`
[ $? != 0 ] && exit 1

eval set -- "$TEMP"
while true; do
    case "$1" in
	-h|--help)
	    echo_help $name ; exit 0 ;;

	-i|--interactive)
	    interactive=1 ; shift ;;

	-n|--name)
	    gal_name=$2 ; shift 2 ;;

	-d|--date)
	    gal_date=$2 ; shift 2 ;;

	-D|--description)
	    gal_desc=$2 ; shift 2 ;;

	-a|--author)
	    gal_auth=$2 ; shift 2 ;;

	-o|--output)
	    dir=$2 ; shift 2 ;;

	-Z|--zip)
	    zip=1 ; shift ;;

	-r|--rotate)
	    rotate=1 ; shift ;;

	-q|--quiet)
	    verbose=false ; shift ;;

	-M|--mq)
	    mq=1 ;  shift ;;

	-H|--hq)
	    hq=1 ; shift ;;

	--)
	    shift ; break ;;

	*)
	    echo "OOops.. getopt error !" ; echo $@ ; exit 1 ;;
    esac
done



# If we don't have JHead and we want to auto-rotate images, cry & exit
if [ $rotate -gt 0 ] && [ -z $jhead ]; then
    echo "jhead not found... Please install JHead."
    exit 1
fi



# If no input files are given, display usage & exit
if [ $# == 0 ]; then
    cat <<EOF
Usage: $name [-hMHZ] [-o directory] file...
       $name -o Gallery *.jpg
Try \`$name --help' for more information.
EOF
    exit 1
fi

# make dirs
mkdir -p $dir/thumbs
mkdir -p $dir/lq
mkdir -p $dir/comments
chmod o+w $dir/comments
[ $mq -gt 0 ] && mkdir -p $dir/mq
[ $hq -gt 0 ] && mkdir -p $dir/hq
[ $zip -gt 0 ] && mkdir -p $dir/zip

# Protect info.txt, even if we don't make it.
echo "<Files info.txt>" > $dir/.htaccess
echo "        deny from all" >> $dir/.htaccess
echo "</Files>" >> $dir/.htaccess


$verbose "Generating O.R.I.G.I.N.A.L gallery in $dir"

files=$(echo $@ | sed 's/ /\n/g' | sort)

#files=$@

i=1
for imagefile in $files; do

    good_file "$imagefile"
    if [ $? != 0 ]; then
	$verbose "$imagefile is not a JPG, JPEG or PNG file, skipped"
	continue
    fi

  $verbose -n "converting $imagefile "

  $verbose -n "."
  $convertor -geometry 120x120 -modulate 100,140,100 -unsharp 1x20 \
      -quality 60 $extra_opts "$imagefile" $dir/thumbs/img-$i.jpg

  $verbose -n "."
  $convertor -geometry 640x480 -modulate 100,130,100 -unsharp 1x5 \
      -quality 90 "$imagefile" $dir/lq/img-$i.jpg

  if [ $mq -gt 0 ]; then
      $verbose -n "."
      $convertor -geometry 1024x768 -modulate 100,130,100 -unsharp 1x5 \
	  -quality 80 "$imagefile" $dir/mq/img-$i.jpg
  fi

  if [ $hq -gt 0 ] ; then
      $verbose -n "."
      cp "$imagefile" $dir/hq/img-$i.jpg
  fi

  # template for comment
  echo "<span>Photo $i</span>
" > $dir/comments/$i.txt


  i=`expr $i + 1`
  $verbose " done"
done

# auto-rotate stuff
if [ $rotate -gt 0 ]; then
    $verbose "rotating"
    jhead -autorot $dir/thumbs/*.jpg
    jhead -autorot $dir/lq/*.jpg
    [ $mq ] && jhead -autorot $dir/mq/*.jpg
    [ $hq ] && jhead -autorot $dir/hq/*.jpg
fi

#�zip stuff
if [ $zip -gt 0 ]; then
    $verbose "archiving"
    [ $mq ] && zip -R $dir/zip/mq.zip  $dir/mq/*.jpg
    [ $hq ] && zip -R $dir/zip/hq.zip  $dir/hq/*.jpg
fi

#info.txt
protect=n
if [ $interactive == 1 ]; then
    echo -n "Gallery name [$gal_name]: "
    read gal_name
    echo -n "Description: "
    read gal_desc
    echo -n "Author [$gal_auth]: "
    read gal_auth
    echo -n "Date [$gal_date]: "
    read gal_date
    echo -n "Resctrict access ? [y/N]: "
    read protect
    if [ "$protect" == "y" ] || [ "$protect" == "Y" ]; then
	echo -n "restricted user [$gal_user]: "
	read gal_user
	echo -n "restricted password [$gal_pass]: "
	read gal_pass
    fi
fi

[ "$gal_name" != "" ] && echo "name|$gal_name" >> $dir/info.txt
[ "$gal_auth" != "" ] && echo "author|$gal_auth" >> $dir/info.txt
[ "$gal_date" != "" ] && echo "date|$gal_date" >> $dir/info.txt
[ "$gal_desc" != "" ] && echo "description|$gal_desc" >> $dir/info.txt
[ "$gal_user" != "" ] && echo "restricted_user|$gal_user" >> $dir/info.txt
[ "$gal_pass" != "" ] && echo "restricted_password|$gal_pass" >> $dir/info.txt