#!/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; use Getopt::Long; if (@ARGV && $ARGV[0] eq '--help') { die < or: gal scan --update AMEN } my $update; GetOptions( 'update!' => \$update, ) or die "Try gal scan --help\n"; STDOUT->autoflush(1); my $gal = UCW::Gallery->load_config; my $orig_prefix = $gal->get('OrigDir'); $orig_prefix =~ m{/$} or $orig_prefix .= '/'; my @source = (); if ($update) { print "Loading previous gallery.list\n"; my $pg = $gal->read_list('gallery.list') or die "Unable to load gallery.list\n"; @source = @{$pg}; } elsif (@ARGV) { for my $in (@ARGV) { if (-f $in) { push @source, { file => $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 @source, map { { file => $_ } } sort @p; } else { die "$in is neither file nor directory\n"; } } } else { while () { chomp; push @source, { file => $_ }; } } print "Scanning photos\n"; my @images = (); foreach my $src (@source) { my $name = $src->{file}; if ($name =~ m{^/}) { # Try to relativize to OrigDir if (substr($name, 0, length $orig_prefix) eq $orig_prefix) { $src->{file} = $name = substr($name, length $orig_prefix); } } print "\t$name:"; my $path = File::Spec->rel2abs($name, $gal->get('OrigDir')); -f $path or die "Cannot find $path\n"; if (!defined $src->{id}) { my $sha = Digest::SHA->new(1); $sha->addfile($path) or die "Cannot hash $path\n"; $src->{id} = substr($sha->hexdigest, 0, 16); } print " id=", $src->{id}; if (!defined $src->{orientation} || $src->{orientation} eq '-') { my $e = new Image::EXIF($path); my $i = $e->get_all_info(); if ($e->error) { print "EXIF error: ", $e->error, "\n"; $src->{orientation} = '.'; } 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 = "."; } $src->{orientation} = $o; } } print " ori=", $src->{orientation}; defined $src->{xfrm} or $src->{xfrm} = $gal->get('ScanDefaultTransform'); print " xfrm=", $src->{xfrm}; push @images, $src; print "\n"; } if (!$update) { 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";