#!/usr/bin/perl # # make_exif # Generate RDF and HTML EXIF metadata for picture # # Hugo Haas, 7 July 2002 # # Some code was originally stolen from: # http://impressive.net/people/gerald/2000/09/captivate # By Gerald Oskoboiny # # $Id: make_exif 1724 2002-07-07 15:06:41Z hugo $ use strict; my $thumb_suffix = "-th"; my $small_suffix = "-sm"; my $med_suffix = "-med"; my $exif_suffix = "-exif"; my $generator = "http://larve.net/people/hugo/2002/07/psw/make_exif"; sub gen_name() { my ($name, $suffix, $type) = @_; $name =~ s/\.[^.]+$/${suffix}.${type}/; return($name); } # Originally stolen from Gerald sub exif_date_to_iso8601 { # convert an exif-format date to an iso-8601 format date # e.g.: "2001:09:08 15:21:29" -> 2001-09-08T15:21:29Z my $date = shift; $date =~ s/\"//g; $date =~ s/:/-/; $date =~ s/:/-/; # just the first two, not all of them $date =~ s/ /T/; $date =~ s/$/Z/; return $date; } # Originally stolen from Gerald sub read_epinfo_from_file { my ($file) = @_; my $metadata; open(EPINFO, "epinfo $file |" ) or do { warn "could not open pipe to epinfo for file $file because $!"; return -1; }; undef my %epinfo; while () { next unless /=/; chomp; my ($key,$value) = split(/=/,$_,2); next if ($key =~ /\#/); next if ($key =~ /^(MakerNote|UserComment)$/); $epinfo{$key} = $value; } close EPINFO or warn "error closing epinfo pipe: $!"; if (defined $epinfo{DateTime}) { $metadata->{"dc:date"} = &exif_date_to_iso8601($epinfo{DateTimeOriginal}); } foreach my $field (keys(%epinfo)) { next if $field eq 'DateTime'; next unless defined $epinfo{$field}; if ($field =~ /^DateTime/) { $epinfo{$field} = &exif_date_to_iso8601($epinfo{$field}); } elsif ($field =~ /^(Make|Model)$/) { $epinfo{$field} =~ s/\"//g; } $metadata->{"exif:$field"} = $epinfo{$field}; } return($metadata); } sub get_dim() { use Image::Info qw(image_info dim); my ($name) = @_; my $info = image_info($name); return(dim($info)); } sub filename() { my ($file) = @_; $file =~ s%^(.*/)?([^/]+)$%\2%; return($file); } sub gen_link() { my ($file, $name) = @_; if (! -r $file) { return(''); } my ($w, $h) = &get_dim($file); $file = &filename($file); return ("
$name (${w}x${h})
\n"); } # Originally stolen from Gerald sub generate_html { my ($metadata, $file) = @_; my $htmlfile = &gen_name($file, $exif_suffix, 'html'); $file = &filename($file); my $rdffile = &gen_name($file, $exif_suffix, 'rdf'); my $thumb = $file; $thumb =~ s/(\.[^.]+)$/-th\1/; my $alt; $alt .= &gen_link(&gen_name($file, $small_suffix, 'jpg'), 'small'); $alt .= &gen_link(&gen_name($file, $med_suffix, 'jpg'), 'medium'); $alt .= &gen_link($file, 'large'); open(HTMLFILE, "> $htmlfile" ) or warn "error trying to write to $htmlfile file: $!"; my $title = "Information about $file"; print HTMLFILE <<"EOHD"; Photo: $title

$title

Photo

Thumbnail of photo described
$alt

Metadata

See also the RDF version.

EOHD foreach my $field (keys(%$metadata)) { next if $field =~ /^cap:/; # don't output captivate prefs my $short_field = $field; $short_field =~ s/^[^:]+://; # strip ns prefix if ( $short_field =~ m/^[a-z]/ ) { # starts with lowercase char? $short_field =~ s/./\U$&/; # initial-case it } print HTMLFILE " \n"; print HTMLFILE " \n"; my $value; if ($short_field eq 'ExposureTime') { $value = sprintf("%.3f\s (%s)", eval($metadata->{$field}), $metadata->{$field}); } elsif ($short_field eq 'FocalLength') { $value = sprintf("%.2f\mm (%s)", eval($metadata->{$field}), $metadata->{$field}); } elsif ($short_field eq 'FlashUsed') { if ($metadata->{$field}) { $value = 'Yes'; } else { $value = 'No'; } } else { $value = $metadata->{$field}; } print HTMLFILE " \n"; print HTMLFILE " \n"; } print HTMLFILE "
$short_field$value

Generated by make_exif.


Last modified: \$Date\$
Copyright © 2002 Hugo Haas, <hugo\@larve.net>
See my public picture page.
See my picture page (restricted).

"; close( HTMLFILE ) or warn "error closing $htmlfile: $!"; } # Originally stolen from Gerald sub generate_rdf { my ($metadata, $file) = @_; my $rdffile = &gen_name($file, $exif_suffix, 'rdf'); $file = &filename($file); open( RDFFILE, "> $rdffile" ) or warn "could not write to RDF file $rdffile because $!"; print RDFFILE <<"EOHD"; EOHD foreach my $field (keys(%$metadata)) { print RDFFILE " <$field>".$metadata->{$field}."\n"; } print RDFFILE <<"EOHD"; EOHD close RDFFILE or warn "error closing RDF file $rdffile: $!"; } my $file; foreach $file (@ARGV) { if ( ! -r $file ) { print STDERR "Can't read $file! skipping it...\n"; next; } if ($file =~ m/${thumb_suffix}|${small_suffix}|${med_suffix}/) { print STDERR "Not master: skipping it...\n"; next; } print STDERR "Processing $file:"; my $metadata = &read_epinfo_from_file($file); &generate_rdf($metadata, $file); &generate_html($metadata, $file); print STDERR " done.\n"; }