--- /dev/null
+# Simple Photo Gallery
+# (c) 2003--2012 Martin Mares <mj@ucw.cz>
+
+package UCW::Gallery;
+
+use strict;
+use warnings;
+
+BEGIN {
+ # Standard Perl module stuff
+ use Exporter();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+ $VERSION = 1.00;
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&SetOptions);
+ %EXPORT_TAGS = ();
+ @EXPORT_OK = qw(%CF);
+}
+
+our %CF;
+our $th;
+
+BEGIN {
+ $CF{"Title"} = "An Unnamed Gallery",
+ $CF{"HeadExtras"} = "",
+ $CF{"TopExtras"} = "",
+ $CF{"BotExtras"} = "",
+ $CF{"ParentURL"} = "../",
+ $CF{"BackURL"} = "",
+ $CF{"FwdURL"} = "",
+ $CF{"ImageSubpages"} = 1,
+ $CF{"AllowArchives"} = 1,
+ $CF{"PhotoUrlPrefix"} = "",
+ $CF{"ThumbUrlPrefix"} = "",
+ $CF{"MetaDataDir"} = ".",
+ $CF{"PhotoDir"} = ".",
+
+ $CF{'ScanDefaultTransform'} = 'n';
+ $CF{'OrigDir'} = '.';
+ $CF{'PhotoDir'} = 'photo';
+ $CF{"CacheDir"} = "cache",
+}
+
+sub LoadConfig() {
+ my $cfg = "./gallery.cf";
+ unless (defined do $cfg) {
+ if ($@) {
+ die "Error parsing $cfg: $@";
+ } elsif ($!) {
+ die "Cannot load $cfg: $!\n";
+ } else {
+ die "Cannot load $cfg, check that it returns true\n";
+ }
+ }
+}
+
+sub SetOptions(@) {
+ while (my $o = shift @_) {
+ my $v = shift @_;
+ $CF{$o} = $v;
+ if ($o eq "Theme") {
+ require $CF{"GalDir"} . "/$v/theme.pm";
+ Gallery::Theme::Init($CF{"GalURL"} . "/$v");
+ }
+ }
+}
+
+sub WriteList($$) {
+ my ($file, $images) = @_;
+ open LIST, '>', "$file.new" or die "Cannot create $file.new: $!\n";
+ print LIST "# Image\tID\tRotate\tXform\tTitle\n";
+ for my $i (@$images) {
+ print LIST join("\t",
+ $i->{file},
+ $i->{id},
+ $i->{orientation},
+ $i->{xfrm},
+ ($i->{title} eq '' ? '-' : $i->{title}),
+ ), "\n";
+ }
+ close LIST;
+ rename "$file.new", $file or die "Cannot rename $file.new to $file: $!\n";
+}
+
+sub ReadList($) {
+ my ($file) = @_;
+ my @images = ();
+ open LIST, '<', $file or return;
+ while (<LIST>) {
+ chomp;
+ /^$/ and next;
+ /^#/ and next;
+ my $i = {};
+ ($i->{file}, $i->{id}, $i->{orientation}, $i->{xfrm}, $i->{title}) = split /\t/;
+ if ($i->{title} eq '-') { $i->{title} = ""; }
+ push @images, $i;
+ }
+ close LIST;
+ return \@images;
+}
+
+1;
--- /dev/null
+#!/usr/bin/perl
+# UCW Gallery: Scan images and generate image list
+# (c) 2004--2012 Martin Mares <mj@ucw.cz>
+
+use strict;
+use warnings;
+
+use lib '/home/mj/web/gal2';
+use UCW::Gallery;
+
+use File::Spec;
+use Image::EXIF;
+use Digest::SHA;
+
+if (@ARGV && $ARGV[0] eq '--help') {
+ die <<AMEN ;
+Usage: cat list | $0
+ or: $0 <files and directories>
+AMEN
+}
+
+my @files = ();
+if (@ARGV) {
+ for my $in (@ARGV) {
+ if (-f $in) {
+ push @files, $in;
+ } elsif (-d $in) {
+ opendir D, $in or die "Cannot scan directory $in: $!\n";
+ my @p = ();
+ while (my $e = readdir D) {
+ my $f = File::Spec->canonpath(File::Spec->catfile($in, $e));
+ if ($f =~ m{\.jpe?g$}i) {
+ push @p, $f;
+ }
+ }
+ closedir D;
+ push @files, sort @p;
+ } else {
+ die "$in is neither file nor directory\n";
+ }
+ }
+} else {
+ while (<STDIN>) {
+ chomp;
+ push @files, $_;
+ }
+}
+
+UCW::Gallery::LoadConfig;
+
+print "Scanning photos\n";
+my @images = ();
+foreach my $f (@files) {
+ my ($fv, $fd, $ff) = File::Spec->splitpath($f);
+ print "\t$ff: ";
+
+ my $sha = Digest::SHA->new(1);
+ $sha->addfile($f) or die "Cannot hash $f\n";
+ my $id = substr($sha->hexdigest, 0, 16);
+ print "id=$id ";
+
+ my $e = new Image::EXIF($f);
+ my $i = $e->get_all_info();
+ if ($e->error) { print "EXIF error: ", $e->error, "\n"; }
+ else {
+ # print STDERR Dumper($i), "\n";
+ my $o = $i->{'image'}->{'Image Orientation'} || "Top, Left-Hand";
+ if ($o eq "Top, Left-Hand") { $o = "."; }
+ elsif ($o eq "Right-Hand, Top") { $o = "r"; }
+ elsif ($o eq "Left-Hand, Bottom") { $o = "l"; }
+ elsif ($o eq "Bottom, Right-Hand") { $o = "d"; }
+ else {
+ print "Unrecognized orientation: $o\n";
+ $o = ".";
+ }
+ push @images, {
+ file => $f,
+ id => $id,
+ orientation => $o,
+ xfrm => $UCW::Gallery::CF{'ScanDefaultTransform'},
+ title => '',
+ };
+ print "ori=$o\n";
+ }
+}
+
+my $old = UCW::Gallery::ReadList('gallery.list');
+if ($old) {
+ print "Updating gallery.list\n";
+ my %old_by_id = map { $_->{id} => $_ } @$old;
+ for my $i (@images) {
+ my $id = $i->{id};
+ my $o = $old_by_id{$id};
+ if ($o) {
+ print "\t$id: updated\n";
+ $i->{orientation} = $o->{orientation};
+ $i->{xfrm} = $o->{xfrm};
+ $i->{title} = $o->{title};
+ } else {
+ print "\t$id: new\n";
+ }
+ delete $old_by_id{$id};
+ }
+ for my $id (keys %old_by_id) {
+ print "\t$id: removed\n";
+ }
+}
+
+UCW::Gallery::WriteList('gallery.list', \@images);
+print "Written gallery.list (", (scalar @images), " items)\n";