#!/usr/bin/perl use LWP::UserAgent; use XML::Parser; use CGI; my $c = new CGI; my $apikey = ""; my $url = "http://www.flickr.com/services/rest/?api_key=$apikey&method="; sub parseElem { my $e = shift; my $attr = shift; shift; $$e = shift; for (my $i = 0; $i < scalar(@_); $i += 2) { $$attr{ $_[ $i ] } = $_[ $i+1 ]; } } sub handle_lookupUser { my $e, %attr; parseElem(\$e,\%attr,@_); if ($e eq "user") { $id = $attr{"id"}; die; } elsif ($e eq "group") { $id = $attr{"id"}; die; } } sub handle_photoSearch { my $e, %attr; parseElem(\$e,\%attr,@_); if ($e eq "photo") { $photos{ $attr{"id"} } = $attr{"server"} . ":" . $attr{"secret"}; } } sub handle_getInfo { my $e, %attr; parseElem(\$e,\%attr,@_); $desc = ""; if ($e eq "description") { $desc = "doit"; } if ($e eq "tag") { push @tags, $attr{"raw"}; if ($attr{"raw"} =~ /geo:lat=(.*)/) { $photos{ $photoid } .= ":lat=$1"; } elsif ($attr{"raw"} =~ /geo:long=(.*)/) { $photos{ $photoid } .= ":long=$1"; } elsif ($attr{"raw"} =~ /geo:lon=(.*)/) { $photos{ $photoid } .= ":long=$1"; } } elsif ($e eq "owner") { $nsid = $attr{"nsid"}; } } sub handle_infoChar { my ($p,$data) = @_; if ($desc eq "doit") { $desctext .= $data; } } sub handle_infoClose { $desc = ""; } sub handle_getExif { my $e, %attr; parseElem(\$e, \%attr, @_); if ($attr{"tagspace"} eq "GPS") { if ($attr{"label"} eq "North or South Latitude") { $currtag = "ns"; } elsif ($attr{"label"} eq "East or West Longitude") { $currtag = "ew"; } elsif ($attr{"label"} eq "Latitude") { $currtag = "lat"; } elsif ($attr{"label"} eq "Longitude") { $currtag = "long"; } #} else { if (($currtag eq "ns" || $currtag eq "ew") && $e eq "raw") { $currtag .= "raw"; } elsif (($currtag eq "lat" || $currtag eq "long") && $e eq "clean") { $currtag .= "clean"; } } } sub handle_exifChar { my ($p,$data) = @_; if ($currtag eq "nsraw") { $exifns = $data; $currtag = ""; } elsif ($currtag eq "ewraw") { $exifew = $data; $currtag = ""; } elsif ($currtag eq "latclean") { $data =~ s/\./_/; $data =~ s/\s/x/g; $data =~ s/\W//g; $data =~ s/_/\./; my ($d,$m,$s) = split("x", $data); $exiflat = $d + ($m / 60) + ($s / 3600); $currtag = ""; } elsif ($currtag eq "longclean") { $data =~ s/\./_/; $data =~ s/\s/x/g; $data =~ s/\W//g; $data =~ s/_/\./; my ($d,$m,$s) = split("x", $data); $exiflon = $d + ($m / 60) + ($s / 3600); $currtag = ""; } } my $tag, $group, $user, $exif; my $request = $c->param('request') || "/photos/mikel_maron/tags/exif/"; if (defined($c->param('exif'))) { ;$exif = 1; } else { $exif = 0; } if ($request !~ /\/$/) { $request .= "/"; } if ($request =~ /\/in\/pool-(.*?)\//) { #group $group = $1; } elsif ($request =~ /photos\/tags\/(.*?)\//) { #tag $tag = $1; } elsif ($request =~ /photos\/(.*?)\/tags\/(.*?)\//) { #user tag $user = $1; $tag = $2; } elsif ($request =~ /photos\/(.*?)\//) { #user $user = $1; } elsif ($request =~ /groups\/(.*?)\/pool\/tags\/(.*?)\//) {#group tag $group = $1; $tag = $2; } elsif ($request =~ /groups\/(.*?)\//) { #group $group = $1; } my $file = "$user-$tag-$group-$exif.flickr"; if (defined($c->param('nocache'))) { system("rm cache/$file"); } if (! -e "cache/$file") { open(CACHE, ">cache/$file"); my $xp; my $ua; my $response; $ua = LWP::UserAgent->new('worldKit','http://brainoff.com/worldkit/ @'); if (defined($user)) { $response = $ua->get($url . "flickr.urls.lookupUser&url=http://www.flickr.com/photos/$user/"); } elsif (defined($group)) { $response = $ua->get($url . "flickr.urls.lookupGroup&url=http://www.flickr.com/groups/$group/"); } if (defined($response)) { if ($response->is_success()) { $xp = new XML::Parser(Handlers => {Start => \&handle_lookupUser}); eval { $xp->parse($response->content); }; } else { die; } } my $searchargs; if (defined $group) { $searchargs = "&group_id=$id" . (defined $tag ? "&tags=$tag" : ""); $response = $ua->get($url . "flickr.groups.pools.getPhotos" . $searchargs); } else { $searchargs = (defined $id ? "&user_id=$id" : "") . (defined $tag ? "&tags=$tag" : ""); $response = $ua->get($url . "flickr.photos.search". $searchargs); } if ($response->is_success()) { $xp = new XML::Parser(Handlers => {Start => \&handle_photoSearch}); eval { $xp->parse($response->content); }; } else { die; } print CACHE "Content-type: text/xml\n\n\n\n"; $num = 0; foreach $photoid (keys %photos) { #print STDERR "photoid = $photoid\n"; undef @tags; undef $xp; $response = $ua->get($url . "flickr.photos.getInfo&photo_id=$photoid"); if ($response->is_success()) { $xp = new XML::Parser(Handlers => {Start => \&handle_getInfo, Char => \&handle_infoChar}); $desc = ""; $desctext = ""; $lat = ""; $lon = ""; eval { $xp->parse($response->content); }; if ($exif == 1) { $response = $ua->get($url . "flickr.photos.getExif&photo_id=$photoid"); if ($response->is_success()) { $xp = new XML::Parser(Handlers => {Start => \&handle_getExif, Char => \&handle_exifChar}); $currtag = ""; $exifns = ""; $exiflat = ""; $exifew = ""; $exiflon = ""; eval { $xp->parse($response->content); }; if ($exifns ne "" && $exiflat ne "" && $exifew ne "" && $exiflon ne "") { if ($exifns eq "N") { $lat = $exiflat; } else { $lat = 0 - $exiflat; } if ($exifew eq "W") { $lon = 0 - $exiflon; } else { $lon = $exiflon; } $photos{$photoid} .= ":lat=" . $lat . ":long=" . $lon; } } } if( ($desctext =~ /geo\:lat/ && $desctext =~ /geo\:long/ ) || ($photos{$photoid} =~ /\:lat/ && $photos{$photoid} =~ /\:long/)) { @a = split(":", $photos{$photoid}); $server= $a[0]; $secret = $a[1]; if ($a[2] =~ /lat=(.*)/) { $lat = $1; if ($a[3] =~ /long=(.*)/) { $lon = $1; } } elsif ($a[2] =~ /long=(.*)/) { $lon = $1; if ($a[3] =~ /lat=(.*)/) { $lat = $1; } } print CACHE "\t\n\t\thttp://flickr.com/photos/" . (defined($user) ? $user : $nsid) . "/$photoid" . (defined($group) ? "/in/pool-$group/" : "") . "\n\t\thttp://static.flickr.com/" . $server . "/" . $photoid . "_" . $secret . "_t.jpg\n\t\t$lat$lon\n\t\t\n\t\n"; $num++; } } } if ($num == 0) { print CACHE "No geotagged photos foundClick here to read about how to add geotags to flickrhttp://brainoff.com/worldkit/flickr/00\n"; } print CACHE ""; close(CACHE); } system("cat cache/$file");