#!/usr/bin/perl # UCW Gallery: Scan images and generate image list # (c) 2004--2012 Martin Mares use strict; use warnings; use UCW::Gallery; use File::Spec; use Image::EXIF; use Digest::SHA; if (@ARGV && $ARGV[0] eq '--help') { die < 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|png)$}i) { push @p, $f; } } closedir D; push @files, sort @p; } else { die "$in is neither file nor directory\n"; } } } else { while () { chomp; push @files, $_; } } STDOUT->autoflush(1); my $gal = UCW::Gallery->load_config; my $orig_prefix = $gal->get('OrigDir'); $orig_prefix =~ m{/$} or $orig_prefix .= '/'; print "Scanning photos\n"; my @images = (); foreach my $f (@files) { my $rel_name = $f; if (substr($rel_name, 0, length $orig_prefix) eq $orig_prefix) { $rel_name = substr($rel_name, length $orig_prefix); } print "\t$rel_name: "; 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 => $rel_name, id => $id, orientation => $o, xfrm => $gal->get('ScanDefaultTransform'), title => '', }; print "ori=$o\n"; } } my $old = $gal->read_list('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"; } } $gal->write_list('gallery.list', \@images); print "Written gallery.list (", (scalar @images), " items)\n";