3 #=======================================================================
5 # File ID: 18245170-f924-11dd-93fc-0001805bf4b1
6 # Extract EXIF data from pictures for use with COPY in Postgres
9 # ©opyleft 2008– Øyvind A. Holm <sunny@sunbase.org>
10 # License: GNU General Public License version 2 or later, see end of
11 # file for legal stuff.
12 #=======================================================================
22 push(@INC, "$ENV{'HOME'}/bin/src/gpstools");
35 'output-format' => 'pgtab',
45 'output-format' => $Std{'output-format'},
46 'strip-whitespace' => 0,
47 'timezone' => $Std{'timezone'},
54 $progname =~ s/^.*\/(.*?)$/$1/;
57 my $id_date = $rcs_id;
58 $id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/;
60 push(@main::version_array
, $rcs_id);
62 Getopt
::Long
::Configure
("bundling");
65 "author|a=s" => \
$Opt{'author'},
66 "debug" => \
$Opt{'debug'},
67 "description|d=s" => \
$Opt{'description'},
68 "help|h" => \
$Opt{'help'},
69 "output-format|o=s" => \
$Opt{'output-format'},
70 "strip-whitespace|w" => \
$Opt{'strip-whitespace'},
71 "timezone|T=s" => \
$Opt{'timezone'},
72 "verbose|v+" => \
$Opt{'verbose'},
73 "version" => \
$Opt{'version'},
75 ) || die("$progname: Option error. Use -h for help.\n");
77 $Opt{'debug'} && ($Debug = 1);
78 $Opt{'help'} && usage
(0);
79 if ($Opt{'version'}) {
84 $GPST::Spc
= $Opt{'strip-whitespace'} ?
"" : " ";
85 my $Spc = $GPST::Spc
; # FIXME
87 if (length($Opt{'timezone'})) {
88 if ($Opt{'timezone'} =~ /^[\+\-][0-2][0-9]{3}$/) {
89 $tz_str = $Opt{'timezone'};
90 } elsif ($Opt{'timezone'} =~ /^z$/i) {
91 $tz_str = $Opt{'timezone'};
92 } elsif ($Opt{'timezone'} =~ /^[a-z]+$/i) {
93 $tz_str = " $Opt{'timezone'}";
95 die("$progname: $Opt{'timezone'}: Invalid time zone\n");
97 $tz_str = uc($tz_str);
100 if ($Opt{'output-format'} eq "xml") {
101 print("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<gpstpic>\n");
110 for my $fname (@ARGV) {
115 if ($Opt{'output-format'} eq "xml") {
116 print("</gpstpic>\n");
121 my $filename = shift;
127 D
("filename = '$filename'");
128 if (open(PicFP
, "exifprobe -L \"$filename\" |")) { # FIXME: Quick & Dirty™
133 $date =~ s/^(\d\d\d\d)(.)(\d\d)(.)(\d\d)(.)(\d\d:\d\d:\d\d)(.*)/$1-$3-${5}T$7$8/;
139 @Dates = reverse sort @Dates;
141 defined($date) || ($date = '');
142 D
("final date = '$date'");
143 if ($date =~ /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d$/) {
144 $filename =~ s/^.*\/(.*?)$/$1/;
146 if ($Opt{'output-format'} eq "xml") {
147 if (length("$filename$date")) {
151 ?
sprintf("$Spc$Spc$Spc$Spc<filename>%s</filename>\n",
152 txt_to_xml
($filename))
155 ?
sprintf("$Spc$Spc$Spc$Spc<date>%s</date>\n",
156 txt_to_xml
("$date$tz_str"))
158 length($Opt{'description'})
159 ?
sprintf("$Spc$Spc$Spc$Spc<desc>%s</desc>\n",
160 txt_to_xml
($Opt{'description'}))
162 length($Opt{'author'})
163 ?
sprintf("$Spc$Spc$Spc$Spc<author>%s</author>\n",
164 txt_to_xml
($Opt{'author'}))
169 } elsif ($Opt{'output-format'} eq "pgtab") {
170 # Version information {{{
171 # Without version field (same as version 1):
173 # "(lat,lon)"-coordinates \t
180 # "(lat,lon)"-coordinates \t
185 $Output = pgtab_entry
(
194 die("$progname: $Opt{'output-format'}: Unknown output format\n");
197 $Opt{'verbose'} && print(STDERR
$Output);
200 warn("$filename: $date: Invalid date format");
205 warn("$filename: Cannot open exifprobe(1) pipe: $!");
214 my ($Version, $Date, $Coor, $Descr, $Filename, $Author) = @_;
215 defined($Date) || ($Date = $NA);
216 defined($Coor) || ($Coor = $NA);
217 defined($Descr) || ($Descr = $NA);
218 defined($Filename) || ($Filename = $NA);
219 defined($Author) || ($Author = $NA);
224 postgresql_copy_safe
($Date) . $tz_str,
226 ? postgresql_copy_safe
($Coor)
228 length($Opt{'description'})
229 ? postgresql_copy_safe
($Opt{'description'})
232 ? postgresql_copy_safe
($Filename)
234 length($Opt{'author'})
235 ? postgresql_copy_safe
($Opt{'author'})
244 # Print program version {{{
245 for (@main::version_array
) {
252 # Send the help message to stdout {{{
255 if ($Opt{'verbose'}) {
261 Usage: $progname [options] [file [files [...]]]
263 Extract EXIF info from pictures for use with PostgreSQL's COPY command.
264 If no filenames are specified on the command line, file names are read
270 Specify author of picture.
272 Specify description for picture.
276 Increase level of verbosity. Can be repeated.
277 -o x, --output-format x
278 Create output of type x:
281 Default: "$Std{'output-format'}".
283 Prepend X as timezone to the date. Valid formats:
285 A '+' or '-' followed by a four-digit number (HHMM) which
286 indicates the offset relative to UTC. Examples:
290 Time zone abbreviation. Examples:
294 -w, --strip-whitespace
295 Strip all unnecessary whitespace.
297 Print version information.
299 Print debugging messages.
307 # Print a status message to stderr based on verbosity level {{{
308 my ($verbose_level, $Txt) = @_;
310 if ($Opt{'verbose'} >= $verbose_level) {
311 print(STDERR
"$progname: $Txt\n");
317 # Print a debugging message {{{
319 my @call_info = caller;
320 chomp(my $Txt = shift);
321 my $File = $call_info[1];
323 $File =~ s
#^.*/(.*?)$#$1#;
324 print(STDERR
"$File:$call_info[2] $$ $Txt\n");
331 # Plain Old Documentation (POD) {{{
345 [options] [file [files [...]]]
355 =item B<-h>, B<--help>
357 Print a brief help summary.
359 =item B<-v>, B<--verbose>
361 Increase level of verbosity. Can be repeated.
365 Print version information.
369 Print debugging messages.
379 Made by Øyvind A. Holm S<E<lt>sunny@sunbase.orgE<gt>>.
383 Copyleft © Øyvind A. Holm E<lt>sunny@sunbase.orgE<gt>
384 This is free software; see the file F<COPYING> for legalese stuff.
388 This program is free software; you can redistribute it and/or modify it
389 under the terms of the GNU General Public License as published by the
390 Free Software Foundation; either version 2 of the License, or (at your
391 option) any later version.
393 This program is distributed in the hope that it will be useful, but
394 WITHOUT ANY WARRANTY; without even the implied warranty of
395 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
396 See the GNU General Public License for more details.
398 You should have received a copy of the GNU General Public License along
399 with this program; if not, write to the Free Software Foundation, Inc.,
400 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
408 # vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w :