X-Git-Url: https://diplodocus.org/git/flac-archive/blobdiff_plain/e564c9f4b7463d34f2caf79cb6b33680c277e3e9..c47f24178a0ff695262801bf9ca9b0efc9fa56e6:/fa-flacd diff --git a/fa-flacd b/fa-flacd index ec264c3..2cc1210 100755 --- a/fa-flacd +++ b/fa-flacd @@ -4,16 +4,12 @@ =head1 NAME -B, B, B - archive CDs to single FLAC files +B - archive CDs to single FLAC files =head1 SYNOPSIS B [B<-jv>] -B - -B ID TRACKCOUNT OFFSET [OFFSET ...] LENGTH - =cut use strict; @@ -70,6 +66,7 @@ sub flac { my $artist; my $album; my @tags; + my $outfile; my $status; verbose("Renaming $dir/tags\n"); @@ -84,8 +81,11 @@ sub flac { verbose("chdir($dir)\n"); chdir($dir) or die("chdir($dir): $!"); + $outfile = "$album"; + $outfile =~ s/\//_/g; + verbose("Running flac\n"); - $status = system('flac', '-o', "../$artist/$album.flac-tmp", + $status = system('flac', '-o', "../$artist/$outfile.flac-tmp", '--delete-input-file', '-V', '--cuesheet', 'cue', '--no-padding', '--best', map({ ('-T', $_) } @tags), @@ -101,15 +101,13 @@ sub flac { verbose("Cleaning up $dir\n"); unlink('using-tags') or die("unlink(using-tags): $!"); unlink('cue') or die("unlink(cue): $!"); - rename('toc', "../$artist/$album.toc") - or die("rename(toc, ../$artist/$album.toc): $!"); - rename('log', "../$artist/$album.log") - or die("rename(log, ../$artist/$album.log): $!"); + rename('log', "../$artist/$outfile.log") + or die("rename(log, ../$artist/$outfile.log): $!"); chdir('..') or die("chdir(..): $!"); rmdir($dir) or die("rmdir($dir): $!"); - rename("$artist/$album.flac-tmp", "$artist/$album.flac") - or die("rename($artist/$album.flac-tmp, $artist/$album.flac): $!"); + rename("$artist/$outfile.flac-tmp", "$artist/$outfile.flac") + or die("rename($artist/$outfile.flac-tmp, $artist/$outfile.flac): $!"); return 0; } @@ -117,7 +115,7 @@ sub flac { sub reaper { my $pid; - while (($pid = waitpid(0, WNOHANG)) > 0) { + while (($pid = waitpid(-1, WNOHANG)) > 0) { push(@finished, [$pid, $?]); } @@ -196,7 +194,7 @@ MAIN: { $opts{'j'} = 4; $opts{'v'} = 0; if (not getopts('j:v', \%opts)) { - print("usage: flacd [-jN -v]\n"); + print(STDERR "usage: flacd [-jN -v]\n"); exit(2); } @@ -210,29 +208,23 @@ __END__ =head1 DESCRIPTION -B, B, and B together comprise -B, a system for archiving audio CDs to single FLAC -files. B is the guts of the system. It runs in the -directory where the audio archives are stored, scanning for new CDs to -encode and rename; it never exits. B generates the inputs for -B: the ripped WAV file, Vorbis tags, and a cuesheet. -B is not meant to be run directly; B uses it to -generate the candidate Vorbis tags. - -All three programs expect to be run from the same directory. They use -that directory to manage directories named by artist and by disc ID. -Intermediate files are written to the disc ID directory. B -processes the disc ID directories into per-album files in the artist -directories. - -=head2 FA-FLACD - -B does not exit; it runs until the user kills it. Every 5 -seconds it scans its current directory for directories with a file -called "tags" and creates a processing job for each one. The number -of jobs B attempts to run is controlled by the B<-j> option -and defaults to 4. B will print diagnostic output when the -B<-v> option is given. +B and B together comprise B, a system +for archiving audio CDs to single FLAC files. B is the guts +of the system. It runs in the directory where the audio archives are +stored, scanning for new ripped CDs to encode and rename; it never +exits. B generates the inputs for B: the ripped WAV +file, Vorbis tags, and a cuesheet. + +Both programs expect to be run from the same directory. They use that +directory to manage directories named by artist. Intermediate files +are written to temporary directories here. B processes the +temporary directories into per-album files in the artist directories. + +Every 5 seconds, B scans its current directory for +directories with a file called "tags" and creates a processing job for +each one. The number of jobs B attempts to run is +controlled by the B<-j> option and defaults to 4. B will +print diagnostic output when the B<-v> option is given. A processing job first renames the directory's "tags" file to "using-tags" so that B will not try to start another job for @@ -241,51 +233,9 @@ so a new job will not be started until the user corrects the error condition and renames "using-tags" back to "tags". Next, it encodes the "wav" file to a FLAC file, using the "cue" file for the cuesheet and "using-tags" for Vorbis tags. Any diagnostic output is saved in -the "log" file. Finally, the "cue" and "log" files are moved to the -artist directory (and named by album) and the ID directory is removed. - -=head2 FA-RIP - -B uses C to retrieve the disc ID and track -information. It creates a directory named by ID for storage of its -intermediate files. It passes the C output as -command-line arguments to B in the background. It then uses -C to create the "cue" file in the background. Finally, it -execs C to rip the CD to the "wav" file. - -In order for this CD to be processed by B, the user must -create a "tags" file. This is usually done by renaming one of the -candidate-tags files and deleting the others. - -=head2 FA-TAGS - -B uses C (from the B package) to -populate candidate-tags files. These are numbered in the order of -entries read from CDDB, e.g. candidate-tags-1, candidate-tags-2, etc. -B also creates candidate-tags-0, which has the correct fields -for this CD (including correct number of TITLE= lines), but with all -fields blank. - -B expects the output of C as command-line -arguments. That is, the disc ID, number of tracks, list of track -offsets, and total length of the CD in seconds. - -=head1 ENVIRONMENT - -=over 4 - -=item CDDBURL - -B uses this to retrieve candidate Vorbis tags. Defaults to -"http://freedb.freedb.org/~cddb/cddb.cgi". - -=item CDDEV - -B uses this to rip audio and save the cuesheet for a CD. It -makes some effort to check some common device names for FreeBSD, -Linux, and NetBSD by default. - -=back +the "log" file. Finally, B moves the "cue" and "log" files +to the artist directory (named by album) and removes the temporary +directory. =head1 AUTHORS