#!/usr/bin/perl
#
# Version 0.2 - 2008-01-11
#
# (C)2008 Marcus Bauer, License: GPLv2, marus.bauer@gmail.com
#
# program crawls directories for geo tagged photos,
# extracts GPS lat/lon from exif data and
# inserts it into database
#
# needs: jhead, sqlite3
#
# 	 geophoto.db:
# 	 CREATE TABLE photo 
# 	 (filename TEXT primary key, name TEXT, lat REAL, lon REAL, desc TEXT);
# 
# usage: geotag2db.pl /FULL/PATH/TO/DIR/WITH/PHOTOS
#
#


$dir = $ARGV[0];
$db = "/tmp/geophoto.db";



if(!( $dir =~ /^\// )) { 
	print "aieeee!!! \n";
	die "full path needed, starting with a slash\n";
}


$res = `sqlite3 $db 'CREATE TABLE photo (filename TEXT primary key, name TEXT, lat REAL, lon REAL, desc TEXT)'`;
print $res;


&traverse_dirs($dir);

### END MAIN ###


#---------------------------------------
# recursively run through directories
#---------------------------------------

sub traverse_dirs
{

local($dir) = @_;

opendir(DIR,$dir) || die "can't open $dir'";
local(@filenames) = readdir(DIR);
closedir(DIR);

for(@filenames) {

	next if $_ eq '.';
	next if $_ eq '..';

	lstat("$dir/$_");

	if (-d _) {
		print "$_ is dir\n";
		&traverse_dirs("$dir/$_");
	}

	else {
		print "$dir/$_ \n";
		&exif2db("$dir/$_");
	}
}


} #END sub traverse_dirs

#---------------------------------------------
# get exif info from photo and put into db
#---------------------------------------------

sub exif2db
{

local($photo) = @_;

$lat_string = `jhead $photo | grep "GPS Latitude" `;
$lon_string = `jhead $photo | grep "GPS Longitude" `;


($lat_half, $lat_deg, $lat_min, $lat_sec) =
	$lat_string =~ /^GPS Latitude : (N|S) +(\d+)d +(\d+)m +(\d+\.\d+)s$/;

($lon_half, $lon_deg, $lon_min, $lon_sec) =
	$lon_string =~ /^GPS Longitude: (E|W) +(\d+)d +(\d+)m +(\d+\.\d+)s$/;

$lat = $lat_deg + $lat_min/60 + $lat_sec/3600;
$lat = ($lat_half eq "N") ? $lat : -$lat;

$lon = $lon_deg + $lon_min/60 + $lon_sec/3600;
$lon = ($lon_half eq "E") ? $lon : -$lon;



$filename = "\"" . $photo . "\"";
$file =  `basename $filename` ;
chop $file;
$file = "\"" . $file . "\"";
$desc = "\"unset\"";



print "$file $lat - $lon\n";

if ($lat !=0 && $lon !=0)
{
	$res = `sqlite3 $db 'INSERT INTO photo VALUES ($filename,$file,$lat,$lon,$desc)'`;

	print $res;
}

}
