From cf126a8722526a25290dfe8a68a5c20ca7322d3b Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sat, 29 Dec 2012 15:48:35 +0100 Subject: [PATCH] Gallery2: gal-scan --update supported --- gal2/bin/gal-scan | 142 +++++++++++++++++++++++++++------------------- 1 file changed, 83 insertions(+), 59 deletions(-) diff --git a/gal2/bin/gal-scan b/gal2/bin/gal-scan index 4610980..72834dd 100755 --- a/gal2/bin/gal-scan +++ b/gal2/bin/gal-scan @@ -9,19 +9,35 @@ 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 @files = (); -if (@ARGV) { +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 @files, $in; + push @source, { file => $in }; } elsif (-d $in) { opendir D, $in or die "Cannot scan directory $in: $!\n"; my @p = (); @@ -32,7 +48,7 @@ if (@ARGV) { } } closedir D; - push @files, sort @p; + push @source, map { { file => $_ } } sort @p; } else { die "$in is neither file nor directory\n"; } @@ -40,74 +56,82 @@ if (@ARGV) { } else { while () { chomp; - push @files, $_; + push @source, { file => $_ }; } } -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); +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$rel_name: "; + print "\t$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 $path = File::Spec->rel2abs($name, $gal->get('OrigDir')); + -f $path or die "Cannot find $path\n"; - 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"; + 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}; -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}; + 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 "\t$id: new\n"; + # 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; } - delete $old_by_id{$id}; } - for my $id (keys %old_by_id) { - print "\t$id: removed\n"; + 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"; + } } } -- 2.39.2