From a89f2eee3e06facd7b9b2cfce35e2c38828b4134 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 8 Feb 2015 19:14:15 +0100 Subject: [PATCH] Added caching of image hashes (optional) --- gal/Makefile | 2 +- gal/UCW/Gallery.pm | 1 + gal/UCW/Gallery/Hashes.pm | 51 +++++++++++++++++++++++++++++++++++++++ gal/bin/gal-scan | 13 +++++----- 4 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 gal/UCW/Gallery/Hashes.pm diff --git a/gal/Makefile b/gal/Makefile index fcab413..5c6a23b 100644 --- a/gal/Makefile +++ b/gal/Makefile @@ -1,7 +1,7 @@ $(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)) diff --git a/gal/UCW/Gallery.pm b/gal/UCW/Gallery.pm index c5d5c9b..1e7bba3 100644 --- a/gal/UCW/Gallery.pm +++ b/gal/UCW/Gallery.pm @@ -32,6 +32,7 @@ sub new($) { 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', diff --git a/gal/UCW/Gallery/Hashes.pm b/gal/UCW/Gallery/Hashes.pm new file mode 100644 index 0000000..d0414e9 --- /dev/null +++ b/gal/UCW/Gallery/Hashes.pm @@ -0,0 +1,51 @@ +# Simple Photo Gallery: Image Hashes +# (c) 2015 Martin Mares + +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; diff --git a/gal/bin/gal-scan b/gal/bin/gal-scan index a1f5e5b..4424cc3 100755 --- a/gal/bin/gal-scan +++ b/gal/bin/gal-scan @@ -1,14 +1,14 @@ #!/usr/bin/perl # UCW Gallery: Scan images and generate image list -# (c) 2004--2012 Martin Mares +# (c) 2004--2015 Martin Mares 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') { @@ -60,6 +60,8 @@ if ($update) { } } +my $hashes = UCW::Gallery::Hashes->new($gal); + print "Scanning photos\n"; my @images = (); foreach my $src (@source) { @@ -75,11 +77,7 @@ 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 '-') { @@ -141,3 +139,4 @@ if (!$update) { $gal->write_list('gallery.list', \@images); print "Written gallery.list (", (scalar @images), " items)\n"; +$hashes->write; -- 2.39.2