parse App12
authorEugene Crosser <crosser@average.org>
Thu, 2 Mar 2006 23:15:14 +0000 (23:15 +0000)
committerEugene Crosser <crosser@average.org>
Thu, 2 Mar 2006 23:15:14 +0000 (23:15 +0000)
README
mkgallery.pl

diff --git a/README b/README
index 7dc1cd98ded795a9c71fa9550ff8bc4bc414295d..a09590b8d14fcd6a447c040c6bf74714f0517ff3 100644 (file)
--- a/README
+++ b/README
@@ -54,9 +54,7 @@ Download:
 svn co svn://svn.average.org/mkgallery/trunk mkgallery
 
 TODO:
-- center info window relative to scroll position
 - tooltips for info and full image links
-- try to get info from APP12 marker for non-EXIF files
 - make Image::Magick optional
 - anything else that I forgot
 
index a6252e6403d4c9c7d50e3b5ab61bc02e66189d10..5927e144567130db3092ed6ff3d9f5ea600465f3 100755 (executable)
@@ -28,7 +28,7 @@ package FsObj;
 
 use strict;
 use Carp;
-use POSIX qw/getcwd/;
+use POSIX qw/getcwd strftime/;
 use CGI qw/:html *table *Tr *center *div/;
 use Image::Info qw/image_info dim/;
 use Term::ReadLine;
@@ -216,11 +216,49 @@ sub isimg {
                }
                return 0;
        }
+
+       tryapp12($info) unless ($info->{'ExifVersion'});
+
        $self->{-isimg} = 1;
        $self->{-info} = $info;
        return 1;
 }
 
+sub tryapp12 {
+       my $info = shift;       # this is not a method
+       my $app12;
+       # dirty hack to take care of Image::Info parser strangeness
+       foreach my $k(keys %$info) {
+               $app12=substr($k,6).$info->{$k} if ($k =~ /^App12-/);
+       }
+       return unless ($app12); # bad luck
+       my $seenfirstline=0;
+       foreach my $ln(split /[\r\n]+/,$app12) {
+               $ln =~ s/[[:^print:]\000]/ /g;
+               unless ($seenfirstline) {
+                       $seenfirstline=1;
+                       $info->{'Make'}=$ln;
+                       next;
+               }
+               my ($k,$v)=split /=/,$ln,2;
+               if ($k eq 'TimeDate') {
+                       $info->{'DateTime'} =
+                               strftime("%Y:%m:%d %H:%M:%S", localtime($v))
+                                                       unless ($v < 0);
+               } elsif ($k eq 'Shutter') {
+                       $info->{'ExposureTime'} = '1/'.int(1000000/$v+.5);
+               } elsif ($k eq 'Flash') {
+                       $info->{'Flash'} = $v?'Flash fired':'Flash did not fire';
+               } elsif ($k eq 'Type') {
+                       $info->{'Model'} = $v;
+               } elsif ($k eq 'Version') {
+                       $info->{'Software'} = $v;
+               } elsif ($k eq 'Fnumber') {
+                       $info->{'FNumber'} = $v;
+               }
+       }
+}
+
 sub initdir {
        my $self = shift;
        my $fullpath = $self->{-fullpath};