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

Last change on this file was 992:6bd6acfc81d5, checked in by GomoR <gomor@…>, 2 weeks ago
  • update: copyright notice
  • new: support for Kali Linux operating system
  • remove: api::onyphe is no more included, it use handled in its own repository
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         kali => [ qw(exif) ],
36      },
37   };
38}
39
40sub get_metadata {
41   my $self = shift;
42   my ($file) = @_;
43
44   $self->brik_help_run_undef_arg('get_metadata', $file) or return;
45   $self->brik_help_run_file_not_found('get_metadata', $file) or return;
46
47   my $cmd = "exif $file";
48   my $lines = $self->execute($cmd) or return;
49
50   my %fields = ();
51   for my $line (@$lines) {
52      my @toks = split(/\s*\|\s*/, $line);
53      if (defined($toks[0]) && defined($toks[1])) {
54         $fields{$toks[0]} = $toks[1];
55      }
56   }
57
58   return \%fields;
59}
60
61sub get_gps_coordinates {
62   my $self = shift;
63   my ($file) = @_;
64
65   $self->brik_help_run_undef_arg('get_gps_coordinates', $file) or return;
66   $self->brik_help_run_file_not_found('get_gps_coordinates', $file) or return;
67
68   my $fields = $self->get_metadata($file) or return;
69
70   my $north_south = $fields->{"North or South Latit"};
71   my $east_west = $fields->{"East or West Longitu"};
72   my $latitude = $fields->{"Latitude"};
73   my $longitude = $fields->{"Longitude"};
74
75   if (defined($north_south) && defined($east_west)
76   &&  defined($latitude) && defined($longitude)) {
77      # Google Maps format: 47°36'16.146"N,7°24'52.48"E
78      my @l = split(/\s*,\s*/, $latitude);
79      my @L = split(/\s*,\s*/, $longitude);
80
81      if (defined($l[0]) && defined($l[1]) && defined($l[2])
82      &&  defined($L[0]) && defined($L[1]) && defined($L[2])) {
83         my $lati = "$l[0]°$l[1]'$l[2]\"$north_south";
84         my $long = "$L[0]°$L[1]'$L[2]\"$east_west";
85
86         return [ $lati, $long ];
87      }
88   }
89
90   return 'undef';
91}
92
93# No check for Args version (internal version)
94sub _get_field {
95   my $self = shift;
96   my ($file, $field) = @_;
97
98   my $fields = $self->get_metadata($file) or return;
99
100   my $info = $fields->{$field};
101   if (defined($info)) {
102      return $info;
103   }
104
105   return 'undef';
106}
107
108# Check for Args vesion (user version)
109sub get_field {
110   my $self = shift;
111   my ($file, $field) = @_;
112
113   $self->brik_help_run_undef_arg('get_field', $file) or return;
114   $self->brik_help_run_undef_arg('get_field', $field) or return;
115   $self->brik_help_run_file_not_found('get_field', $file) or return;
116
117   return $self->_get_field($file, $field);
118}
119
120sub get_manufacturer {
121   my $self = shift;
122   my ($file) = @_;
123
124   $self->brik_help_run_undef_arg('get_manufacturer', $file) or return;
125   $self->brik_help_run_file_not_found('get_manufacturer', $file) or return;
126
127   return $self->_get_field($file, 'Manufacturer');
128}
129
130sub get_model {
131   my $self = shift;
132   my ($file) = @_;
133
134   $self->brik_help_run_undef_arg('get_model', $file) or return;
135   $self->brik_help_run_file_not_found('get_model', $file) or return;
136
137   return $self->_get_field($file, 'Model');
138}
139
1401;
141
142__END__
143
144=head1 NAME
145
146Metabrik::Image::Exif - image::exif Brik
147
148=head1 COPYRIGHT AND LICENSE
149
150Copyright (c) 2014-2019, Patrice E<lt>GomoRE<gt> Auffret
151
152You may distribute this module under the terms of The BSD 3-Clause License.
153See LICENSE file in the source distribution archive.
154
155=head1 AUTHOR
156
157Patrice E<lt>GomoRE<gt> Auffret
158
159=cut
Note: See TracBrowser for help on using the repository browser.