# Album Plugin: captions/exif/gps
# Author : Andreas K Huettel
# Description : Adds artifical exif tags for use in exif_caption, e.g.
# : gpscaption_gmaps_url or gpscaption_nice.
# Use : Just use the additional keywords as exif caption tags.
# : Defined right now:
# : gpscaption_lat_hem, gpscaption_lat_deg, gpscaption_lat_min
# : gpscaption_lat_sec, gpscaption_lon_hem, gpscaption_lon_deg
# : gpscaption_lon_min, gpscaption_lon_sec, gpscaption_nice
# : gpscaption_gmaps_url
# : Example:
# : exif_image "
%gpscaption_nice%"
# License : This code is licensed under the terms of the LGPL. If a copy of the license
# : is not available with this source, it can be viewed at
# : http://www.gnu.org/licenses/lgpl.html
# $Id: gpscaption.alp 181 2008-10-18 12:32:14Z huettel $
use strict;
sub start_plugin {
my ( $opt, $plugin, $path ) = @_;
my $ret = {
author => 'Andreas K Huettel',
href => 'http://www.akhuettel.de/',
version => '1.0',
description => "Enables ouput of formatted GPS data in captions, e.g. google maps links.
Options: none
",
};
album::hook( $opt, 'got_exif_info', \&got_exif_info );
$ret;
}
my $origlat;
my $origlon;
sub get_lat_deg()
{
my $deg = $origlat;
$deg =~ s/^[NS ]*//;
$deg =~ s/d[0-9ms \.]*//;
return $deg;
};
sub get_lat_hem()
{
my $hemi = $origlat;
$hemi =~ s/[ 0-9dms.]*//g;
return $hemi;
};
sub get_lon_deg()
{
my $deg = $origlon;
$deg =~ s/^[EW ]*//;
$deg =~ s/d[0-9ms \.]*$//;
return $deg;
};
sub get_lon_hem()
{
my $hemi = $origlon;
$hemi =~ s/[ 0-9dms.]*$//g;
return $hemi;
};
sub get_lat_min()
{
my $min = $origlat;
$min =~ s/^[NS 0-9]*d *//;
$min =~ s/m[0-9s \.]*$//;
return $min;
};
sub get_lat_sec()
{
my $sec = $origlat;
$sec =~ s/^[NS 0-9d]*m *//;
$sec =~ s/s$//;
return $sec;
};
sub get_lon_min()
{
my $min = $origlon;
$min =~ s/^[EW 0-9]*d *//;
$min =~ s/m[0-9s \.]*$//;
return $min;
};
sub get_lon_sec()
{
my $sec = $origlon;
$sec =~ s/^[EW 0-9d]*m *//;
$sec =~ s/s$//;
return $sec;
};
sub get_lat_number()
{
my $number=abs(get_lat_deg())+get_lat_min()/60+get_lat_sec/60/60;
if (get_lat_hem() eq "S") {$number=-$number; };
return $number;
};
sub get_lon_number()
{
my $number=abs(get_lon_deg())+get_lon_min()/60+get_lon_sec/60/60;
if (get_lon_hem() eq "W") {$number=-$number; };
return $number;
};
sub get_gmaps_url()
{
return "http://maps.google.com/maps?q=".get_lat_number().",+".get_lon_number();
};
sub get_nicepos()
{
my $val = get_lat_deg()."° ".get_lat_min()."' ".get_lat_sec()."\" ".get_lat_hem().", ";
$val = $val.get_lon_deg()."° ".get_lon_min()."' ".get_lon_sec()."\" ".get_lon_hem();
return $val;
}
sub got_exif_info {
my ($opt,$data,$hookname,$pic,$exif) = @_;
# isolate latitude and logitude from the hash
$origlat=$exif->{"GPS Latitude"};
$origlon=$exif->{"GPS Longitude"};
if (! $origlat) { return $exif; };
my %gpsexif = %{$exif};
$gpsexif{"gpscaption_lat_hem"}=get_lat_hem();
$gpsexif{"gpscaption_lat_deg"}=get_lat_deg();
$gpsexif{"gpscaption_lat_min"}=get_lat_min();
$gpsexif{"gpscaption_lat_sec"}=get_lat_sec();
$gpsexif{"gpscaption_lon_hem"}=get_lon_hem();
$gpsexif{"gpscaption_lon_deg"}=get_lon_deg();
$gpsexif{"gpscaption_lon_min"}=get_lon_min();
$gpsexif{"gpscaption_lon_sec"}=get_lon_sec();
$gpsexif{"gpscaption_nice"}=get_nicepos();
$gpsexif{"gpscaption_gmaps_url"}=get_gmaps_url();
$gpsexif{"gpscaption_version"}='$Id: gpscaption.alp 181 2008-10-18 12:32:14Z huettel $';
return \%gpsexif;
}
# Plugins always end with:
1;