#!/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