App-PhotoDB
view release on metacpan or search on metacpan
lib/App/PhotoDB/funcs.pm view on Meta::CPAN
$duration = 1 / $1;
# Expressed like 0.3 or 1
} elsif ($shutter_speed =~ m/((0\.)?\d+)/) {
$duration = $1;
}
return $duration;
}
=head2 tag
This func reads data from PhotoDB and writes EXIF tags
to the JPGs that have been scanned from negatives
=head4 Usage
&tag({db=>$db, where=>$where});
&tag({db=>$db, where=>{film_id=1}});
&tag({db=>$db, where=>{negative_id=100}});
=head4 Arguments
=item * C<$db> DB handle
=item * C<$where> hash to specify which scans should be tagged. Tags all scans if not set!
=head4 Returns
Nothing
=cut
sub tag {
# Read in cmdline args
my $href = shift;
my $db = $href->{db};
my $where = $href->{where};
# Make sure basepath is valid
my $basepath = &basepath;
# Crank up an instance of ExifTool
my $exifTool = Image::ExifTool->new;
$exifTool->Options(CoordFormat => q{%+.6f});
# Specify which attributes we want to write
# If any are specified here but not available, they will be ignored
my @attributes = (
'Make',
'Model',
'Lens',
'LensModel',
'ExposureTime',
'MaxApertureValue',
'FNumber',
'ApertureValue',
'FocalLength',
'ISO',
'Author',
'ImageDescription',
'DateTimeOriginal',
'ExposureProgram',
'MeteringMode',
'Flash',
'GPSLatitude',
'GPSLongitude',
'FocalLengthIn35mmFormat',
'LensSerialNumber',
'SerialNumber',
'LensMake',
'Copyright',
'UserComment',
);
# This is the query that fetches (and calculates) values from the DB that we want to write as EXIF tags
my $sql = SQL::Abstract->new;
my($stmt, @bind) = $sql->select('exifdata', '*', $where);
# Prepare and execute the SQL
my $sth = $db->prepare($stmt) or die "Couldn't prepare statement: " . $db->errstr;
my $rows = $sth->execute(@bind);
$rows = &unsci($rows);
# Get confirmation
if ($rows == 0) {
print "No scans be will tagged\n";
return;
}
return unless &prompt({prompt=>"This will review and potentially update the tags of $rows scans. Proceed?", type=>'boolean'});
# Set some globals
my $foundcount=0;
my $changedcount=0;
my @missingfiles;
# Loop through our result set
while (my $ref = $sth->fetchrow_hashref()) {
# First check the path is defined in MySQL
if (defined($ref->{'path'})) {
# Now make sure the path actually exists on the system
if (-e "$basepath/$ref->{'path'}") {
# File exists, so we go on and do stuff to it.
# Grab the existing EXIF tags for comparison
my $exif = $exifTool->ImageInfo("$basepath/$ref->{'path'}");
my $changeflag = 0;
$foundcount++;
# For each of the attributes on our list...
foreach my $var (@attributes) {
# Test if it exists in the DB
if (defined($ref->{$var})) {
# Test if it already exists in the file AND has the correct value, either string OR numeric format
if (defined($exif->{$var}) && ($exif->{$var} ~~ $ref->{$var})) {
# Tag already has correct value, skip
next;
} else {
# Set the value of the tag and flag that a change was made
if (defined($exif->{$var})) {
# Already defined, update it
print "\tChanging $var: $exif->{$var} => $ref->{$var}\n";
} else {
( run in 2.598 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )