File Coverage

blib/lib/Image/Nikon/Index.pm
Criterion Covered Total %
statement 39 94 41.4
branch 3 10 30.0
condition 5 12 41.6
subroutine 7 13 53.8
pod 0 4 0.0
total 54 133 40.6


line stmt bran cond sub pod time code
1             package Image::Nikon::Index;
2              
3             #use 5.018002;
4 1     1   20113 use strict;
  1         2  
  1         24  
5 1     1   6 use warnings;
  1         1  
  1         29  
6 1     1   2184 use Image::ExifTool;
  1         70107  
  1         1318  
7              
8             our @ISA = qw();
9             our $VERSION = '0.01';
10              
11             # methods
12             sub new {
13 1     1 0 12 my $class = shift;
14 1         2 my %args = @_;
15             my $self = {
16             folder => ".", # present working directory
17             prefix => $args{'prefix'} || undef,
18             suffix => $args{'suffix'} || undef,
19             exif => Image::ExifTool->new,
20             tags => [ 'SubSecDateTimeOriginal', 'ModifyDate' ],
21             tree => undef,
22             # tree => {
23             # date => {
24             # key => {
25             # name=>'original name',
26             # code=>'new date code',
27             # index=>'sequence number',
28             # },
29             # },
30             # }
31             files => undef,
32             inityear=> $args{'initialyear'} || 2011,
33 1   50     19 debug => $args{'debug'} || 1,
      50        
      50        
      50        
34             };
35 1         34716 bless $self, $class;
36 1         6 return $self;
37             }
38              
39             # list directory and populate files
40             sub _list {
41 1     1   3 my ($self)=(@_);
42 1         2 my @files;
43              
44             # always open current directory
45 1   50     77 opendir DIR, $self->{'folder'} || die "$!\n";
46 1         74 @files = readdir DIR;
47 1         19 closedir DIR;
48 1         5 chomp @files;
49              
50 1         3 @files = grep { !/^\.+/ } @files; # ignore hidden files, starting with dot
  15         37  
51 1 50       5 @files = grep { /^$self->{'prefix'}/ } @files if defined $self->{'prefix'}; # match prefix
  0         0  
52 1 50       5 @files = grep { /$self->{'suffix'}$/ } @files if defined $self->{'suffix'}; # match extension
  0         0  
53 1         8 $self->{'files'} = \@files;
54             }
55              
56             # extract file name and process
57             sub _file {
58 13     13   36 my ($self, %opts)=(@_);
59 13         16 my %dummy;
60 13         19 my $f = $opts{'file'};
61 13         24 my $t = $self->{'exif'};
62              
63 13 50       270 $t->ExtractInfo ( $f, \%dummy ) || return; # if not an image, skip.
64             #my $value = $t->GetValue('SubSecDateTimeOriginal', 1) || return; # if not an image, skip.
65 0   0     0 my $value = $t->GetValue($self->{'tags'}->[0], 1) || return; # if not an image, skip.
66 0         0 my ($date, $time) = split /\s+/, $value, 2 || die $!;
67 0         0 my $datestr = $self->_date ($date);
68              
69 0         0 $date =~ s/\://g;
70 0         0 $time =~ s/\:|\.//g;
71 0         0 $time = $date.$time;
72              
73 0         0 my ($updated) = $t->GetValue($self->{'tags'}->[1], 1);
74 0         0 $updated =~ s/\:|\s+//g;
75              
76 0         0 $f =~ s/\_//g;
77 0         0 $f =~ s/\./\_/g;
78              
79 0         0 $self->{'tree'}->{$date}->{$time.$updated.$f}->{'name'} = $opts{'file'};
80 0         0 $self->{'tree'}->{$date}->{$time.$updated.$f}->{'code'} = $datestr;
81             }
82              
83             # changing date format
84             sub _date {
85 0     0   0 my ($self, $datestr) = (@_);
86 0         0 my ($y, $m, $d) = split /:/, $datestr;
87            
88 0         0 $datestr =~ s/^\s+|\s+$//g;
89 0         0 ($y, $m, $d) = split /:/, $datestr;
90 0         0 $y = chr ( $y - $self->{'inityear'} + ord('A') );
91 0         0 $datestr = sprintf "%s%1X%02d", $y, $m, $d;
92 0         0 return $datestr;
93             }
94              
95             # indexing
96             sub _index {
97 0     0   0 my ($self, %opts) = (@_);
98 0         0 my $hash = $opts{'hash'};
99 0         0 my $i = 1;
100              
101 0         0 foreach my $key ( sort keys %{$hash} ) {
  0         0  
102 0         0 $hash->{$key}->{'index'} = sprintf "%03d", $i;
103 0         0 $i++;
104             }
105             }
106              
107             # file extension
108             sub _ext {
109 0     0   0 my ($self, $name) = (@_);
110 0         0 my ($junk, $x) = split /\./, $name;
111 0         0 return $x;
112             }
113              
114             # print all files - key, oldname, newname
115             sub print {
116 0     0 0 0 my ($self) = (@_);
117 0         0 my $hash;
118             my $newname;
119              
120 0         0 foreach my $date ( keys %{$self->{'tree'}} ) {
  0         0  
121 0 0       0 print "__".$date."__\n" if $self->{'debug'};
122 0         0 $hash = $self->{'tree'}->{$date};
123              
124 0         0 foreach my $key ( sort keys %{$hash} ) {
  0         0  
125 0         0 $newname = $hash->{$key}->{'code'}."_".$hash->{$key}->{'index'}.".".$self->_ext($hash->{$key}->{'name'});
126 0         0 print sprintf " %-45s %-15s %-15s\n", $key, $hash->{$key}->{'name'}, " ".$newname;
127             }
128             }
129             }
130              
131             # rename of each file
132             sub _rename {
133 0     0   0 my ($self, %opts) =(@_);
134 0         0 rename ($opts{'oldname'}, $opts{'newname'});
135             }
136              
137             # mass rename
138             sub transform {
139 0     0 0 0 my ($self) =(@_);
140 0         0 my $hash;
141             my $newname;
142              
143 0         0 foreach my $date ( keys %{$self->{'tree'}} ) {
  0         0  
144 0         0 $hash = $self->{'tree'}->{$date};
145 0         0 foreach my $key ( sort keys %{$hash} ) {
  0         0  
146 0         0 $newname = $hash->{$key}->{'code'}."_".$hash->{$key}->{'index'}.".".$self->_ext($hash->{$key}->{'name'});
147 0 0       0 print $hash->{$key}->{'name'}." ".$newname."\n" if $self->{'debug'};
148 0         0 $self->_rename ( oldname=>$hash->{$key}->{'name'}, newname=>$newname );
149             }
150             }
151             }
152              
153             sub process {
154 1     1 0 7 my ($self) = (@_);
155 1         6 my $list = $self->_list;
156 1         2 my $hash;
157              
158             # create node for each file
159 1         3 foreach my $f ( @{$list} ) {
  1         3  
160 13         82084 $self->_file (file=>$f);
161             }
162              
163             # do indexing for each available date
164 1         4000 foreach my $date ( keys %{$self->{'tree'}} ) {
  1         6  
165 0         0 $hash = $self->{'tree'}->{$date};
166 0         0 $self->_index (hash=>$hash);
167             }
168 1         4 return $self;
169             }
170              
171              
172             1;
173             __END__