$(eval $(dir-setup))
$(call lib-copy, UCW/Gallery.pm)
-$(call lib-copy, $(addprefix UCW/Gallery/, Web.pm Archive.pm))
+$(call lib-copy, $(addprefix UCW/Gallery/, Web.pm HashCache.pm Archive.pm))
$(call lib-copy, $(addprefix UCW/Gallery/Web/, Plain.pm NrtBlue.pm HighSlide.pm))
$(call copy, $(addprefix nrt-blue/,back.png bot.png left.png next.png prev.png right.png top.png style.css))
ThumbFormats => [ "114x94" ], # Built-in themes use the first size,
# but more can be generated
CacheExif => 0, # Cache selected EXIF meta-data
+ CacheHashes => 1, # Let gal-scan cache file hashes
# Titles and navigation
Title => 'An Unnamed Gallery',
--- /dev/null
+# Simple Photo Gallery: Image Hashes
+# (c) 2015 Martin Mares <mj@ucw.cz>
+
+package UCW::Gallery::Hashes;
+
+use strict;
+use warnings;
+
+use File::stat ();
+use Digest::SHA;
+
+sub new {
+ my ($class, $gal) = @_;
+ my $self = { gal => $gal };
+
+ if ($gal->get('CacheHashes') && -f 'gallery.cache') {
+ print "Loading gallery.cache\n";
+ $self->{cache} = $gal->read_meta('gallery.cache');
+ } else {
+ $self->{cache} = {};
+ }
+
+ return bless $self, $class;
+}
+
+sub write {
+ my ($self) = @_;
+ my $gal = $self->{gal};
+ if ($gal->get('CacheHashes')) {
+ print "Writing gallery.cache\n";
+ $gal->write_meta('gallery.cache', $self->{cache});
+ }
+}
+
+sub hash_image {
+ my ($self, $path) = @_;
+ my $cache = $self->{cache};
+
+ my $st = File::stat::stat($path) or die "Cannot access $path: $!\n";
+ my $key_text = join(":", $path, $st->dev, $st->ino, $st->mtime);
+ my $key = Digest::SHA->sha1_base64($key_text);
+
+ if (!exists $cache->{$key}) {
+ my $sha = Digest::SHA->new(1);
+ $sha->addfile($path) or die "Cannot hash $path\n";
+ $cache->{$key} = substr($sha->hexdigest, 0, 16);
+ }
+ return $cache->{$key};
+}
+
+42;
#!/usr/bin/perl
# UCW Gallery: Scan images and generate image list
-# (c) 2004--2012 Martin Mares <mj@ucw.cz>
+# (c) 2004--2015 Martin Mares <mj@ucw.cz>
use strict;
use warnings;
use UCW::Gallery;
+use UCW::Gallery::Hashes;
use File::Spec;
use Image::EXIF;
-use Digest::SHA;
use Getopt::Long;
if (@ARGV && $ARGV[0] eq '--help') {
}
}
+my $hashes = UCW::Gallery::Hashes->new($gal);
+
print "Scanning photos\n";
my @images = ();
foreach my $src (@source) {
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);
- }
+ $src->{id} = $hashes->hash_image($path);
print " id=", $src->{id};
if (!defined $src->{orientation} || $src->{orientation} eq '-') {
$gal->write_list('gallery.list', \@images);
print "Written gallery.list (", (scalar @images), " items)\n";
+$hashes->write;