💾 Archived View for gmn.clttr.info › sources › photo-helpers.git › tree › afm.txt captured on 2023-04-26 at 13:19:21.

View Raw

More Information

⬅️ Previous capture (2023-01-29)

-=-=-=-=-=-=-

#!/usr/bin/perl
# Copyright(c) René Wagner 2019-2021
# https://src.clttr.info/rwa/photo-helpers
# published under BSD 3-Clause License 

use Modern::Perl '2019';
use Cwd;
use File::Basename;
use File::Copy;
use File::Find::Rule;
use File::Spec::Functions;
use File::HomeDir;
use Getopt::Std;

$Getopt::Std::STANDARD_HELP_VERSION = 'true';

my $VERSION = '1.0';
my $PROGRAM = 'ART File Mover';

my $configfile = catfile(File::HomeDir->my_home, '.afm.conf');

# read commandline switches
our $opt_l = 0;
our $opt_R = 'DNG';
our $opt_F = 'JPEG';
our $opt_E = 'jpe{0,1}g';
our $opt_C = '';
our $opt_f = '';

getconfig();

getopts('lR:F:E:C:f:') or	die "Invalid parameters provided! See 'afm --help' for more details.";

# read remaining commandline args für destination dir
# last dir will win
# fallback to list-only mode when no dir is given
my $destination_dir = getcwd;
foreach my $arg ( @ARGV ) 
{
	$destination_dir = $arg;
}

if ($destination_dir eq getcwd) { $opt_l = 1; }

writeconfig();

move_files($destination_dir);

exit 0;

sub move_files
{
	my ( $destination_dir ) = @_;
	my $move_counter = 0;

	say "destination dir  : $destination_dir";
	($opt_C eq '') or say "copy dir         : $opt_C";
	say "file filter      : $opt_f";
	say "raw file ext     : $opt_R";
	say "output file dir  : $opt_F";
	say "output file ext  : $opt_E";
	say 'action           : '. ($opt_l ? 'list only' : 'move');
	say '';
	my $converted_destination_dir = catfile($destination_dir, $opt_F);

	if ( !$opt_l && (! -d $destination_dir || ! -d $converted_destination_dir))
	{
		if (! -d $destination_dir ) { mkdir $destination_dir or die "Could not create destination dir $_ : $!"; }
		if (! -d $converted_destination_dir ) { mkdir $converted_destination_dir or die "Could not create destination dir $_ : $!"; }
	}

	# find all jpegs in current dir
	my @files = File::Find::Rule->file()->name( qr/\.$opt_E$/i )->name( qr/$opt_f/ )->maxdepth(1)->in( catfile(getcwd, $opt_F) );

	foreach my $converted_file ( @files )
	{
		my ( $filename, $path, $ext ) = fileparse($converted_file, qr/\.[^.]*/);
		my $outarp_file = $converted_file. '.out.arp';
		my $raw_file = catfile(dirname($path), $filename .'.'. $opt_R);
		my $rawarp_file = $raw_file. '.arp';
		my $rawarp2_file = $filename. '.arp';
		my $xmp_file = $raw_file. '.xmp';
		my $xmp2_file = $filename. '.xmp';

		print $raw_file .'...';

		$move_counter++;
		# do not move files that have no raw-file anymore
		if ( ! -e $raw_file )
		{
			print 'raw-file not found!';
		}
		elsif ( !$opt_l )
		{
			# only warn if JPEG or RAW file could not be moved
			# the processing files *.arp are optional and are fine to be absent
			move($outarp_file, catfile($converted_destination_dir, basename($outarp_file)));
			move($rawarp_file, catfile($destination_dir, basename($rawarp_file)));
			move($rawarp2_file, catfile($destination_dir, basename($rawarp2_file)));
			move($xmp_file, catfile($destination_dir, basename($xmp_file)));
			move($xmp2_file, catfile($destination_dir, basename($xmp2_file)));

			if ($opt_C ne '' && -d $opt_C)
			{
				copy($converted_file, catfile($opt_C, basename($converted_file)));
			}

			if ( move($converted_file, catfile($converted_destination_dir, basename($converted_file))) && 
				 move($raw_file, catfile($destination_dir, basename($raw_file))	)) 
			{ 
				print 'moved.';
			}
			else
			{
				print "move failed: $!";
			}
		}
		say '';
	}
	
	say "\r\nfound $move_counter files.";
}

sub getconfig
{
	if ( -f $configfile ) { do $configfile; }
}

sub writeconfig
{
	open(my $filehandle, '>', $configfile) or die "Could not open file '$configfile': $!";
	say $filehandle '$opt_F="'. $opt_F .'";';
	say $filehandle '$opt_E="'. $opt_E .'";';
	say $filehandle '$opt_R="'. $opt_R .'";';
	say $filehandle '$opt_C="'. $opt_C .'";';
	close $filehandle;
}

sub main::VERSION_MESSAGE()
{
	say $PROGRAM . ' - version ' . $VERSION;
	say 'published under BSD 3 - Clause License';
	say 'Copyright(c) 2019-2020 René Wagner';
	say 'https://git.sr.ht/~rwa/photo-helpers';
}

sub main::HELP_MESSAGE
{
	say '';
	say 'Find all by ART converted files in the current folder and their corresponding RAWs and move them to specified directory.';
	say '';
	say 'usage: afm [options] <target folder>';
	say '';
	say 'options:';
	say '   -l          : list-only mode - does not move files but only lists which files would be moved';
	say '   -f <exp>    : filter files by regex - only raw files that match the PCRE are processed';
	say '                 needs to be quoted';
	say '   -R <raw>    : override the raw extensions, defaults to "DNG"';
	say '                 This option is automatically saved in the user config and can be omitted on the next run';
	say '   -F <folder> : override the folder for converted files, defaults to "JPEG"';
	say '                 This option is automatically saved in the user config and can be omitted on the next run';
	say '   -E <ext>    : override the converted file extenion (case-insensitive), defaults to "jp(e)g"';
	say '                 Perl-compatible regular expressions allowed';
	say '                 This option is automatically saved in the user config and can be omitted on the next run';
	say '   -C <folder> : copy the converted (output) files (ie jpegs) to an additional directory';
	say '                 This option is automatically saved in the user config and can be omitted on the next run';
	say '   --help      : show this help';
}