]> diplodocus.org Git - flac-archive/blobdiff - fa-flacd
Add notes for recent changes.
[flac-archive] / fa-flacd
index 2cc12102be26e31764a349b6370b2e03be647b11..7c89d9359cfa4cc57d350d2457da0d0d7f712a0a 100755 (executable)
--- a/fa-flacd
+++ b/fa-flacd
@@ -1,6 +1,7 @@
 #! /usr/bin/env perl
 
 # $Id$
+# $URL$
 
 =head1 NAME
 
@@ -8,7 +9,7 @@ B<fa-flacd> - archive CDs to single FLAC files
 
 =head1 SYNOPSIS
 
-B<fa-flacd> [B<-jv>]
+B<fa-flacd> [B<-j> I<jobs>] [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);
 }
 
 \f
@@ -237,6 +254,31 @@ the "log" file.  Finally, B<fa-flacd> 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<fa-flacd> 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<flac2mp3>, 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<fa-flacd>, 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<jobs>
+
+Run up to I<jobs> jobs instead of the default 4.
+
+=item B<-v> [B<--verbose>]
+
+Print diagnostic information.
+
+=back
+
 =head1 AUTHORS
 
 Written by Eric Gillespie <epg@pretzelnet.org>.