X-Git-Url: https://diplodocus.org/git/flac-archive/blobdiff_plain/c47f24178a0ff695262801bf9ca9b0efc9fa56e6..a156fab67d9d5bf4dd092850fdb0d57f545aca01:/fa-flacd diff --git a/fa-flacd b/fa-flacd index 2cc1210..7c89d93 100755 --- a/fa-flacd +++ b/fa-flacd @@ -1,6 +1,7 @@ #! /usr/bin/env perl # $Id$ +# $URL$ =head1 NAME @@ -8,7 +9,7 @@ B - archive CDs to single FLAC files =head1 SYNOPSIS -B [B<-jv>] +B [B<-j> I] [B<-v>] =cut @@ -16,11 +17,11 @@ use strict; use warnings; use File::Basename; -use Getopt::Std; $Getopt::Std::STANDARD_HELP_VERSION = 1; +use Getopt::Long qw(:config gnu_getopt no_ignore_case); use POSIX ':sys_wait_h'; +use Pod::Usage; -our $VERSION = 1; - +my $debug; my $verbose; my @jobs; my @finished; @@ -52,7 +53,7 @@ sub get_tags { verbose("ARTIST $artist from $fn\n"); } elsif (/^ALBUM=/) { $album = $value; - verbose("ALBUM $album from $fn\n"); + verbose("ALBUM $album from $fn\n"); # cperl-mode sucks " } } close(TAGS) or die("close($fn): $!"); @@ -90,12 +91,16 @@ sub flac { 'cue', '--no-padding', '--best', map({ ('-T', $_) } @tags), 'wav'); - if (WIFEXITED($status) and ($status = WEXITSTATUS($status)) != 0) { - die("flac: $status"); + if (WIFEXITED($status)) { + if (($status = WEXITSTATUS($status)) != 0) { + die("flac exited with status $status"); + } } elsif (WIFSIGNALED($status)) { die("flac killed with signal ", WTERMSIG($status)); } elsif (WIFSTOPPED($status)) { die("flac stopped with signal ", WSTOPSIG($status)); + } else { + die("Major horkage on system(flac): \$? = $? \$! = $!"); } verbose("Cleaning up $dir\n"); @@ -104,11 +109,18 @@ sub flac { rename('log', "../$artist/$outfile.log") or die("rename(log, ../$artist/$outfile.log): $!"); chdir('..') or die("chdir(..): $!"); - rmdir($dir) or die("rmdir($dir): $!"); rename("$artist/$outfile.flac-tmp", "$artist/$outfile.flac") or die("rename($artist/$outfile.flac-tmp, $artist/$outfile.flac): $!"); + if (-x "$dir/post-processor") { + verbose("Running './$dir/post-processor $artist/$outfile.flac'\n"); + system("./$dir/post-processor", "$artist/$outfile.flac"); + unlink("$dir/post-processor") or die("unlink($dir/post-processor): $!"); + } + + rmdir($dir) or die("rmdir($dir): $!"); + return 0; } @@ -126,10 +138,14 @@ sub newjob { my $dir = shift; my $pid; - $pid = fork(); - if (not defined($pid)) { - die("fork: $!"); - } elsif ($pid == 0) { + if (not $debug) { + $pid = fork(); + if (not defined($pid)) { + die("fork: $!"); + } + } + + if ($debug or $pid == 0) { $SIG{CHLD} = 'IGNORE'; open(STDERR, ">$dir/log") or die("open(STDERR, >$dir/log): $!"); exit(flac($dir)); @@ -150,11 +166,11 @@ sub deljob { verbose("$pid finished ("); if (WIFEXITED($status)) { - verbose('exited ', WEXITSTATUS($status)); + verbose('exited with status ', WEXITSTATUS($status)); } elsif (WIFSIGNALED($status)) { - verbose('signalled ', WTERMSIG($status)); + verbose('killed with signal ', WTERMSIG($status)); } elsif (WIFSTOPPED($status)) { - verbose('stopped ', WSTOPSIG($status)); + verbose('stopped with signal ', WSTOPSIG($status)); } verbose(")\n"); @@ -189,18 +205,19 @@ sub flacloop { } MAIN: { - my %opts; - - $opts{'j'} = 4; - $opts{'v'} = 0; - if (not getopts('j:v', \%opts)) { - print(STDERR "usage: flacd [-jN -v]\n"); - exit(2); - } - - $verbose = $opts{'v'}; - - flacloop($opts{'j'}); + my $jobs; + my $help; + + $jobs = 4; + GetOptions( + 'debug|X' => \$debug, + 'jobs|j=i' => \$jobs, + 'verbose|v' => \$verbose, + 'help|h|?' => \$help, + ) or pod2usage(); + $help and pod2usage(-exitstatus=>0, -verbose=>1); + + flacloop($jobs); } @@ -237,6 +254,31 @@ the "log" file. Finally, B moves the "cue" and "log" files to the artist directory (named by album) and removes the temporary directory. +If the temporary directory contains an executable file named +"post-processor", B executes that file with the relative +path to the output FLAC file as an argument. The output files are in +their final location when "post-processor" starts. Possible uses are +running B, moving the output files to a different location, +removing the lock file, or adding to a database. The standard input, +output, and error streams are inherited from B, so they may +be connected to anything from a tty to /dev/null. This means that you +may want to redirect these streams, if you want to save them or do any +logging. + +=head1 OPTIONS + +=over 4 + +=item B<-j> [B<--jobs>] I + +Run up to I jobs instead of the default 4. + +=item B<-v> [B<--verbose>] + +Print diagnostic information. + +=back + =head1 AUTHORS Written by Eric Gillespie .