################################################################################ # # # ############################################################################ # # # Title : move_n_sort # # # # Description : Copies, parses, sorts. # # # # Coded by : Justin Lee # # # # Version : 0.0.1-RC2 # # # # Date : Monday, February 17, 2008 # # # # License : GNU General Public License v.2 # # # # Copyright (C) 2008 Justin Lee # # # ############################################################################ # # # # ############################################################################ # # # This program is free software; you can redistribute it and/or # # # # modify it under the terms of the GNU General Public License version 2 # # # # as published by the Free Software Foundation. # # # # # # # # This program is distributed in the hope that it will be useful, # # # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # # # GNU General Public License for more details. # # # # # # # # You should have received a copy of the GNU General Public License # # # # along with this program; if not, write to the Free Software # # # # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # # # # 02110-1301, USA. Or, see: # # # ############################################################################ # # # ################################################################################ use strict; use warnings; use File::Basename; use IO::Handle; use FileHandle; use File::Copy qw(cp); use File::Find; use Image::MetaData::JPEG; use Getopt::Long qw(:config bundling); use Tie::Simple; use constant { NAME => basename($0), HOME => @{[ fileparse($0) ]}[1] }; #use lib HOME . 'lib'; my ( $use_cli_progress_bar, # Use a crazy text-only progress bar. (Cross platform.) $use_gfx_progress_bar, # Use Win32::GUI (for now) to create a graphical progress bar. $use_hidden_root_window, # Use Win32::GUI (for always) to hide the CMD window. $use_verbose, # Display the log file in real time, as it's created. $no_logging, # Disable saving of the log file... Not recomended. $raw_dir_orig, # Specify where the camera stores it's pictures. $raw_dir_new, # Specify where raw pictures are copied to for compressing. ) = ( '','','', '','', join('/',split(/\\|\//,$ENV{USERPROFILE},'Desktop/pics')), join('/',split(/\\|\//,$ENV{USERPROFILE},'Desktop/new_pics')) ); GetOptions( 'progress-bar|P' => \$use_cli_progress_bar, 'gfx-progress-bar' => \$use_gfx_progress_bar, 'hide-window|w' => \$use_hidden_root_window, 'verbose|v!' => \$use_verbose, 'raw-directory|R=s' => \$raw_dir_orig, 'local-directory|L=s' => \$raw_dir_new, 'no-logging' => \$no_logging, # 'help|h|H' => \&print_help ); if ($use_hidden_root_window) { require Win32::GUI; my $root = Win32::GUI::GetPerlWindow(); Win32::GUI::Hide($root); } # fill our pipe my ($inbox, $outbox); pipe $inbox, $outbox or die; $outbox->autoflush(1); # and make sure we got a lighter tie my $processing, 'Tie::Simple', $inbox, FETCH => sub { my $self = shift; die unless ref $self; chomp(my $in = <$self>); return 0 unless $in; return 0 if $in =~ /^(?:0|n(?:o(?:pe)?)?|done)$/io; return 1 if $in =~ /^(?:1|y(?:e(?:a?h|s)|up)?|copy(?:ing)?|start(?:up)?)$/io; return $in; }; # enter new raw directory chdir($raw_dir_new) or die $!; unlink(<*>) or warn $!; if (my $pid = fork) { sleep 1; if ($processing) { while ($processing) { my $path = $processing; # get date my $image = new Image::MetaData::JPEG ($path); my $exif = $image->get_Exif_data('IMAGE_DATA', 'TEXTUAL'); my ($date) = split(/\s+/,$exif->{DateTimeOriginal}->[0]); $date =~ s/:/-/go; # make if check fails unless (-d $date) { mkdir($date,0777) or die; } # move the pic rename($path,join('/',$date,$path)); } } } elsif (defined $pid) { # start smoking print $outbox "start\n"; find( { no_chdir => 1, wanted => sub { next unless $_ =~ /jpe?g$/oi; print $outbox "copying\n"; print $outbox move($_), "\n"; } }, $raw_dir_orig ); print $outbox "done\n"; } else { exit 1; } # pretty *drools* sub move { my $o_pth = shift; my $n_pth = $raw_dir_new . '/' . basename($o_path); my $o_fh = new FileHandle $o_path, "<"; my $n_fh = new FileHandle $n_path, ">"; return unless defined $o_fh; return unless defined $n_fh; return unless cp($o_fh,$n_fh); undef $o_fh; undef $n_fh; return unless unlink($o_path); return basename($n_path); } exit 0;