#!/usr/bin/perl

use Image::Size 'imgsize';
use DBI;

# makewebimages 
# concept of:     Geir Berset (c) 2001 
#
# developers:     Geir Berset     <geir_at_modula.no    - http://foto.kleif.com>
#                 Morten Jacobsen <morten_at_modula.no  - http://foto.mojaco.com>
#                 Erik Arne Øen   <erikhoo_at_yahoo.com - http://www.ifi.uio.no/~earneoen>
#
$CUR_VERSION = "v0.4";




################################################################################
#                               CONFIGURING                                    #
################################################################################


#
# Sette upload-variable
#

$config{REMOTE_USER} = "kleif";
$config{REMOTE_HOST} = "foto.kleif.com";
$config{REMOTE_BASE} = "/home/kleif/foto_www";



################################################################################
#                               INITIALIZING                                   #
################################################################################


#
# Finner path
#
open CONVERT, "which convert |";
$CONVERT = <CONVERT>; chomp $CONVERT;
close CONVERT;
$CONVERT = "/usr/bin/convert" if !$CONVERT;

#
# Finner path til scp
#
open SCP, "which scp |";
$SCP = <SCP>; chomp $SCP;
close SCP;
$SCP = "/usr/bin/scp" if !$SCP;

#
# Finner path til ssh
# 
$SSH = "/usr/bin/ssh";

#
# Finner path til rm
#
$RM = "/bin/rm";

#
# Finner remote path til echo
#
$REMOTE_ECHO = "/bin/echo";




#
# Setter dato
#
my($min,$hour,$day,$month,$year)=(localtime)[1..5];
$day   =  sprintf("%.2d", $day); $month++; $month =  sprintf("%.2d", $month); $year  += 1900;
$TODAY = "$year-$month-$day";





################################################################################
#                           PARAMETERS AND CONFIG                              #
################################################################################
while( @ARGV ) {
    $_ = shift @ARGV;

    if( $_ eq "-v" ) {
        $VERBOSE = 1;
    }
    #en stygg feil , skal vare \d+ tror jeg
    elsif( $_ eq "-h" ) {
        $IMG_HEIGHT = shift @ARGV;
    }
    elsif( $_ eq "-w" ) {
	$IMG_WIDTH = shift @ARGV;
    }
    elsif( $_ eq "-o" ) {
        $OUTPUTDIR = shift @ARGV;
    }
    elsif( $_ eq "-i" ) {
	$INPUTDIR = shift @ARGV;
    }
    elsif( $_ eq "-t" ) {
	$TEXT = shift @ARGV;
    }
    elsif( $_ eq "-b" ) {
	$BORDER = shift @ARGV;
    }
    elsif( $_ eq "-c" ) {
        $BORDERCOLOR = shift @ARGV;
    }
    elsif( $_ eq "-h" || $_ eq "--help" ) {
        usage();
    }
    elsif( $_ eq "-ni" ) {
	$NO_IMAGESPHP = 1;
    }
    elsif( $_ eq "-noappend" )   {
        $NOAPPEND = 1;
    }
    elsif( $_ eq "-if" )   {
        $IMAGESFILE  = shift @ARGV;
    }
    elsif( $_ eq "-g" ) {
        $USE_GPHOTO = 1;
    }
    elsif($_ eq "--version" ) {
	print "Current Version $CUR_VERSION\n";
        exit;
    }
    elsif( $_ eq "-g" ) {
        $USE_GPHOTO = 1;
    }
    elsif( $_ eq "-na" ) {
        $NOAUTOLEVELS = 1;
    }
    elsif( $_ eq "-upload" ) {
	$UPLOADDIR = shift @ARGV;
    }
    elsif( $_ eq "-host" ) {
	$config{REMOTE_HOST} = shift @ARGV;
    }
    elsif( $_ eq "-user" ) {
	$config{REMOTE_USER} = shift @ARGV;
    }
    elsif( $_ eq "-base" ) {
	$config{REMOTE_BASE} = shift @ARGV;
    }
    else {
	if   ( !$INPUTDIR )  { $INPUTDIR = $_;  }
	elsif( !$OUTPUTDIR ) { $OUTPUTDIR = $_; }
	else                 {  usage(@ARGV);        }
    }
}

#
# Setter noen defaulter
#
if(!$INPUTDIR) {
    print "No -i inputdir given, using current workingdir.\n"if $VERBOSE;
    open PWD, "pwd |";
    $INPUTDIR = <PWD>;
    close PWD;
    chomp $INPUTDIR;
    print "INPUTDIR : $INPUTDIR\n" if $VERBOSE;
}
if(!$OUTPUTDIR) {
    print "No -o outputdir given, attempting to use $INPUTDIR/out.\n"if $VERBOSE;
    $OUTPUTDIR = "$INPUTDIR/out";
}
$THUMBDIR       = "$OUTPUTDIR/thumb";
$IMG_WIDTH      = 800 if !$IMG_WIDTH;
$IMG_HEIGHT     = 800 if !$IMG_HEIGHT;
$IMG_WIDTH_BLOGG  = 450 if !$IMG_WIDTH_BLOGG;
$IMG_HEIGHT_BLOGG = 800 if !$IMG_HEIGHT_BLOGG; 
$TEXT           = "Created with $0 - %m - http://foto.kleif.com" if !$TEXT;
$BORDER         = 0 if !$BORDER;
$BORDERCOLOR    = "BLACK" if !$BORDERCOLOR;
$stringwidth    = length($TEXT) * 7.6;
$stringwidth    =  sprintf("%.2d", $stringwidth);
$IMAGESFILE     = "images.php" if !$IMAGESFILE;

#
# Åpner en fil : images.php eller annen som skal inneholde en array av alle bildene som
# er blitt prosessert. Denne brukes på web for å lage bildegalleri automatisk
# på http://foto.kleif.com
# 
if( !-d $OUTPUTDIR ) {
   mkdir $OUTPUTDIR ,0755 or die "Couldn't create $OUTPUTDIR, check it.\n";
}
if( !-d $THUMBDIR ) {
    mkdir $THUMBDIR ,0755 or die  "Couldn't create $THUMBDIR, check it.\n";
} 

#
# Hent bilder med gphoto hvis vi har fått argumentet -g
#
if( $USE_GPHOTO ) {
    if ( !-d $INPUTDIR ) {
	mkdir $INPUTDIR ,0755 or die "Couldn't create $INPUTDIR, check it.\n";
    }
    chdir $INPUTDIR;

    $args[0]       = "$GPHOTO --port usb: --get-all-images";
    system(@args) == 0 or die "Kunne ikke kjøre @args\n";
}

#
# Dersom en skal skrive images.php-fil
#
if( !$NO_IMAGESPHP ) {
    open IFILE, ">>$OUTPUTDIR/$IMAGESFILE" or die "Kunne ikke åpne $OUTPUTDIR/$IMAGESFILE \n";
    $string = "<?\n#\n# Generated by $0 - $TODAY\n#\n";
    print IFILE $string;
}


#
# Leser alle filene fra $INPUTDIR
#
opendir SDIR, "$INPUTDIR" or die "Couldn't open INPUTDIR : $INPUTDIR\n";
@files = readdir SDIR;
closedir SDIR;

#
# Mortens snippet.
# Sortererer filnavnene slik at de kommer i kronologisk rekkefølge
#
@sortedfiles = sort{$a cmp $b} @files;
@files = @sortedfiles;
print "Processing:\n" if $VERBOSE;
if(!$NOAUTOLEVELS) {
    #$OPTIMIZE = " -normalize -sharpen 1x70";
    $OPTIMIZE = " -normalize";
}





################################################################################
#                               THE SHIT                                       #
################################################################################

#
# Prosesserer alle .jpg / .jpeg - filene i $INPUTDIR
#
$cnt = 0;


while(<@files>) {
    $dbfilename = $_;
    #
    # Driter i directories og filer som ikke er .jpg
    #
    next if( -d $_);
    next if( $_ !~ /\.jpg/ and $_ !~ /\.jpeg/ and $_ !~ /\.JPG/ and $_ !~ /\.JPEG/ );
    
    print "$INPUTDIR/$_ -> $OUTPUTDIR/$_ -->> $THUMBDIR/$_\n" if $VERBOSE;
    #
    # Bygger filnavnene og slikt drit
    #
    $s=$INPUTDIR."/".$_;
    $d=$OUTPUTDIR."/".$_;
    $d2=$OUTPUTDIR."/2".$_;
    $dT=$OUTPUTDIR."/thumb"."/".$_;
    $dblogg=$OUTPUTDIR."/blogg_".$_;

    # 1.
    # Resizer og legger på border i første omgang
    #
    # - bordercolor = ok
    # - frame = ok
    # -geometry <width>x<height>{+-}<x>{+-}<y>{%}{@} {!}{<}{>}

    #  $args[0]       = "$CONVERT -bordercolor $BORDERCOLOR -geometry "."$IMG_WIDTH"."x"."$IMG_WIDTH"." $OPTIMIZE -frame "."$BORDER"."x"."$BORDER"." $s $d";
    $args[0] = "$CONVERT -bordercolor $BORDERCOLOR -geometry "."$IMG_WIDTH"."x"."$IMG_WIDTH"." $OPTIMIZE -frame "."$BORDER"."x"."$BORDER"." $s $d";
#    print $args[0]."\n";

    system(@args)  == 0 or die "1. Kunne ikke kjøre @args\n";



    # 2.
    # Lager et bilde passende for blogg.
    #
    # - bordercolor = ok
    # - frame = ok
    # -geometry <width>x<height>{+-}<x>{+-}<y>{%}{@} {!}{<}{>}

    #  $args[0]       = "$CONVERT -bordercolor $BORDERCOLOR -geometry "."$IMG_WIDTH"."x"."$IMG_WIDTH"." $OPTIMIZE -frame "."$BORDER"."x"."$BORDER"." $s $d";
    $args[0] = "$CONVERT -bordercolor $BORDERCOLOR -geometry "."$IMG_WIDTH_BLOGG"."x"."$IMG_WIDTH_BLOGG"." $OPTIMIZE -frame "."$BORDER"."x"."$BORDER"." $s $dblogg";
#    print $args[0]."\n";

    system(@args)  == 0 or die "2. Kunne ikke kjøre @args\n";


    # 3.
    # Lager IKKE en thumbnail av det genererte bildet (selvom det er noe raskere)
    # borderen blir styggere av det

    $args[0] = "$CONVERT -interlace NONE -bordercolor BLACK -geometry 1000x100 -border 0x0 $OPTIMIZE $s $dT";
    system(@args)  == 0 or die "3. Kunne ikke kjøre @args\n";


    #
    # Setter opp litt drit som jeg skal ha på bildet, og hvor jeg skal ha det

    ($width, $height) = imgsize("$d");
    $textheight = $height- 11;
    $textwidth  = $width - $stringwidth - 10;
    #$date = date("M Y");

    # 3.
    # Legger på skrift på det største bildet, legger ikke på i det minste
    #

    #!!!! Denne er koblet ut fordi jeg får en fontfeil når jeg prøver å kjøre den. (skjønner den ikke heller)
    #convert: Unable to read font (/usr/share/fonts/type1/gsfonts/n019003l.pfb) [No such file or directory].
    #    $args[0]       = "$CONVERT -pen white -draw 'text $textwidth $textheight, \"$TEXT\"' $d $d";
    #    system(@args)  == 0 or die "3. Kunne ikke kjøre @args\n";

    #
    # 4. Skriver til fila
    # 
    if( !$NO_IMAGESPHP ) {
	print IFILE "\$images[\"$_\"] = \"\";\n";
    }


    $cnt++;
}

if( !$NO_IMAGESPHP ) {
    print IFILE "\n?>";
    close IFILE;
}


#
# 5. Laster opp om man det skal
# 
if( $UPLOADDIR ne "" )
{
    $argsu[0] = "$SSH $config{REMOTE_USER}\@$config{REMOTE_HOST} mkdir $config{REMOTE_BASE}/$UPLOADDIR";
    print $argsu[0] . "\n";
    system(@argsu); 
    $argsu[0] = "$SSH $config{REMOTE_USER}\@$config{REMOTE_HOST} mkdir $config{REMOTE_BASE}/$UPLOADDIR/pics";
    print $argsu[0] . "\n";
    system(@argsu);    
    $argsu[0] = "$SSH $config{REMOTE_USER}\@$config{REMOTE_HOST} mkdir $config{REMOTE_BASE}/$UPLOADDIR/pics/thumb";
    print $argsu[0] . "\n";
    system(@argsu);
    $argsu[0] = "mv $OUTPUTDIR/images.php $OUTPUTDIR/images2.php";
    print $argsu[0] . "\n";
    system(@argsu);
    $argsu[0] = "$SCP -r $OUTPUTDIR/$_/* $config{REMOTE_USER}\@$config{REMOTE_HOST}:$config{REMOTE_BASE}/$UPLOADDIR/pics/ ";
    print $argsu[0] . "\n";
    system(@argsu);
    $argsu[0] = "$SSH $config{REMOTE_USER}\@$config{REMOTE_HOST} 'cat $config{REMOTE_BASE}/$UPLOADDIR/pics/images2.php >> $config{REMOTE_BASE}/$UPLOADDIR/pics/images.php'";
    print $argsu[0] . "\n";
    system(@argsu);    
}


print "Done. Processed $cnt files\n" if $VERBOSE;

close SDIR;










#
# usage : Forteller litt om bruken av driten
#

sub usage {

    print shift @ARGV;

    print qq!
 Usage :
 makewebimages [-iohwb] [sourcedir] [destdir]
 -i  inputdir                    (default ./ )
 -o  outputdir                   (default ./out)
 -h  height                      (default 640)
 -w  width                       (default 640)
 -a  = autolevels                  (default off)
 -g  = gphoto                    (use gphoto to collect images from usb-device)
 -b  = borderthickness           (default 10px)
 -c  'bordercolor'               (default BLACK)     
 -t  "text"                      (please use "" when writing multiple words)  
 -ni                             (supress the making of an images.php file)
 -noappend                       (try to append to existing images.php-file)
 -if "filename"                  (use alternate name for images.php-file)
 -upload gallery_catalog_name
 -host   hostname ($config{REMOTE_HOST})
 -user   username ($config{REMOTE_USER})
 -base   basedir ($config{REMOTE_BASE})
 makewebimages -h [--help] to show this helptext

The scripts takes images from -i inputdir, and generates schrunken images for 
web-publishing. It also generates thumbnails and comment the images with
a -t text.

\n!;
    exit 1;
}
























syntax highlighted by Code2HTML, v. 0.9.1