X-Git-Url: https://diplodocus.org/git/flac-archive/blobdiff_plain/c069d00b1502aa08be2bdf0a197ab1110ba350d5..a156fab67d9d5bf4dd092850fdb0d57f545aca01:/fa-rip?ds=sidebyside diff --git a/fa-rip b/fa-rip index 1a9bc2a..e9ad756 100755 --- a/fa-rip +++ b/fa-rip @@ -9,7 +9,7 @@ B - rip a CD for B =head1 SYNOPSIS -B [B<-d> I] [B<-t> I] +B [B<-d> I] [B<-p> I [B<-t> I] =cut @@ -20,6 +20,7 @@ use Env qw( CDDEV ); +use Fcntl qw(O_CREAT O_WRONLY); use File::Temp; use Getopt::Long qw(:config gnu_getopt no_ignore_case); use POSIX ':sys_wait_h'; @@ -73,6 +74,36 @@ sub mkcue { return $trackcount; } +sub tags_file { + my $fn = shift; + my $trackcount = shift; + my $various = shift; + my $artist = shift; + my $album = shift; + my $fh; + my $i; + my $track; + my $name; + + open($fh, '>', $fn) or die("open('>$fn'): $!"); + print($fh 'ARTIST=', (defined($artist) and $artist or ''), "\n"); + print($fh 'ALBUM=', (defined($album) and $album or ''), "\n"); + # MusicBrainz doesn't have dates yet; these are usually wrong anyway. + print($fh "DATE=\n"); + + for $i (1 .. $trackcount) { + $various and print($fh "ARTIST[$i]=\n"); + if ($track = shift(@_)) { + $name = $track->get_name; + } else { + $name = ''; + } + print($fh "TITLE[$i]=$name\n"); + } + + close($fh) or die("close(>$fn): $!"); +} + sub tags { my $device = shift; my $trackcount = shift; @@ -80,10 +111,8 @@ sub tags { my @results; my $album; my $i; - my @tracks; - my $name; - my $track; - my $j; + my $various; + my $seen_various; if (defined($device)) { $mb = new MusicBrainz::Client::Simple (device=>$device); @@ -96,32 +125,21 @@ sub tags { die($mb->get_error); } - open(F, '>candidate-tags-0') or die("open('>candidate-tags-0'): $!"); - print(F "$_=\n") for ('ARTIST', 'ALBUM', 'DATE'); - print(F "TITLE=\n") for 1 .. $trackcount; - close(F) or die("close('>candidate-tags-0'): $!"); + tags_file('candidate-tags-0', $trackcount, 0); for $album (@results) { $i++; - open(F, ">candidate-tags-$i") or die("open(>candidate-tags-$i): $!"); - - print(F 'ARTIST=', $album->get_artist->get_name, "\n"); - print(F 'ALBUM=', $album->get_name, "\n"); - - # MusicBrainz doesn't have dates yet; these are usually wrong anyway. - print(F "DATE=\n"); - @tracks = $album->get_tracks; - for $j (1 .. $trackcount) { - if ($track = shift(@tracks)) { - $name = $track->get_name; - } else { - $name = ''; + if ($various = $album->has_various_artists) { + if (not $seen_various) { + $seen_various = 1; + tags_file('candidate-tags-0v', $trackcount, 1); } - print(F "TITLE=$name\n"); } - close(F) or die("close(>candidate-tags-$i): $!"); + tags_file("candidate-tags-$i", $trackcount, $various, + $album->get_artist->get_name, $album->get_name, + $album->get_tracks); } } @@ -136,13 +154,26 @@ sub rip { die; } +sub make_post_processor { + my $command = shift; + + defined($command) or return; + + sysopen(F, 'post-processor', O_CREAT | O_WRONLY, 0555) + or die("sysopen(post-processor, O_CREAT | O_WRONLY, 0555): $!"); + print(F $command, ' "$@"', "\n"); + close(F) or die("close(post-processor, O_CREAT | O_WRONLY, 0555): $!"); +} + MAIN: { + my $post_processor; my $trackcount; my $help; my $tempdir; GetOptions( 'device|d=s' => \$CDDEV, + 'post-processor|p=s', \$post_processor, 'tracks|t=i' => \$trackcount, 'help|h|?' => \$help, ) or pod2usage(); @@ -152,6 +183,7 @@ MAIN: { $tempdir = File::Temp::tempdir('flac-archive.XXXXXXXXXX'); chdir($tempdir) or die("chdir($tempdir): $!"); + make_post_processor($post_processor); $trackcount = mkcue($CDDEV, $trackcount); tags($CDDEV, $trackcount); rip($CDDEV, $trackcount); @@ -183,6 +215,12 @@ have to fill out the candidate-tags-0 template. Use I as the CD-ROM device, instead of the default "/dev/cdrom" or the environment variable CDDEV. +=item B<-p> [B<--post-processor>] I + +Create a "post-processor" file in the temporary directory containing +the line 'I "$@"'. See B's man page for +information about this hook. + =item B<-t> [B<--tracks>] I Archive only the first I tracks. This is handy for