source: repository/lib/Metabrik/Image/Exif.pm

Last change on this file was 866:f6ad8c136b19, checked in by GomoR <gomor@…>, 4 months ago
  • update: copyright 2017
File size: 3.8 KB
Line 
1#
2# $Id$
3#
4# image::exif Brik
5#
6package Metabrik::Image::Exif;
7use strict;
8use warnings;
9
10use base qw(Metabrik::Shell::Command Metabrik::System::Package);
11
12sub brik_properties {
13   return {
14      revision => '$Revision$',
15      tags => [ qw(unstable) ],
16      author => 'GomoR <GomoR[at]metabrik.org>',
17      license => 'http://opensource.org/licenses/BSD-3-Clause',
18      attributes_default => {
19         capture_mode => 1,
20      },
21      commands => {
22         install => [ ], # Inherited
23         get_metadata => [ qw(file) ],
24         get_gps_coordinates => [ qw(file) ],
25         get_field => [ qw(file field) ],
26         get_manufacturer => [ qw(file) ],
27         get_model => [ qw(file) ],
28      },
29      require_binaries => {
30         'exif' => [ ],
31      },
32      need_packages => {
33         ubuntu => [ qw(exif) ],
34         debian => [ qw(exif) ],
35      },
36   };
37}
38
39sub get_metadata {
40   my $self = shift;
41   my ($file) = @_;
42
43   $self->brik_help_run_undef_arg('get_metadata', $file) or return;
44   $self->brik_help_run_file_not_found('get_metadata', $file) or return;
45
46   my $cmd = "exif $file";
47   my $lines = $self->execute($cmd) or return;
48
49   my %fields = ();
50   for my $line (@$lines) {
51      my @toks = split(/\s*\|\s*/, $line);
52      if (defined($toks[0]) && defined($toks[1])) {
53         $fields{$toks[0]} = $toks[1];
54      }
55   }
56
57   return \%fields;
58}
59
60sub get_gps_coordinates {
61   my $self = shift;
62   my ($file) = @_;
63
64   $self->brik_help_run_undef_arg('get_gps_coordinates', $file) or return;
65   $self->brik_help_run_file_not_found('get_gps_coordinates', $file) or return;
66
67   my $fields = $self->get_metadata($file) or return;
68
69   my $north_south = $fields->{"North or South Latit"};
70   my $east_west = $fields->{"East or West Longitu"};
71   my $latitude = $fields->{"Latitude"};
72   my $longitude = $fields->{"Longitude"};
73
74   if (defined($north_south) && defined($east_west)
75   &&  defined($latitude) && defined($longitude)) {
76      # Google Maps format: 47°36'16.146"N,7°24'52.48"E
77      my @l = split(/\s*,\s*/, $latitude);
78      my @L = split(/\s*,\s*/, $longitude);
79
80      if (defined($l[0]) && defined($l[1]) && defined($l[2])
81      &&  defined($L[0]) && defined($L[1]) && defined($L[2])) {
82         my $lati = "$l[0]°$l[1]'$l[2]\"$north_south";
83         my $long = "$L[0]°$L[1]'$L[2]\"$east_west";
84
85         return [ $lati, $long ];
86      }
87   }
88
89   return 'undef';
90}
91
92# No check for Args version (internal version)
93sub _get_field {
94   my $self = shift;
95   my ($file, $field) = @_;
96
97   my $fields = $self->get_metadata($file) or return;
98
99   my $info = $fields->{$field};
100   if (defined($info)) {
101      return $info;
102   }
103
104   return 'undef';
105}
106
107# Check for Args vesion (user version)
108sub get_field {
109   my $self = shift;
110   my ($file, $field) = @_;
111
112   $self->brik_help_run_undef_arg('get_field', $file) or return;
113   $self->brik_help_run_undef_arg('get_field', $field) or return;
114   $self->brik_help_run_file_not_found('get_field', $file) or return;
115
116   return $self->_get_field($file, $field);
117}
118
119sub get_manufacturer {
120   my $self = shift;
121   my ($file) = @_;
122
123   $self->brik_help_run_undef_arg('get_manufacturer', $file) or return;
124   $self->brik_help_run_file_not_found('get_manufacturer', $file) or return;
125
126   return $self->_get_field($file, 'Manufacturer');
127}
128
129sub get_model {
130   my $self = shift;
131   my ($file) = @_;
132
133   $self->brik_help_run_undef_arg('get_model', $file) or return;
134   $self->brik_help_run_file_not_found('get_model', $file) or return;
135
136   return $self->_get_field($file, 'Model');
137}
138
1391;
140
141__END__
142
143=head1 NAME
144
145Metabrik::Image::Exif - image::exif Brik
146
147=head1 COPYRIGHT AND LICENSE
148
149Copyright (c) 2014-2017, Patrice E<lt>GomoRE<gt> Auffret
150
151You may distribute this module under the terms of The BSD 3-Clause License.
152See LICENSE file in the source distribution archive.
153
154=head1 AUTHOR
155
156Patrice E<lt>GomoRE<gt> Auffret
157
158=cut
Note: See TracBrowser for help on using the repository browser.