From: epg <> Date: Sun, 26 Jun 2005 18:06:58 +0000 (+0000) Subject: Looks like MusicBrainz::Client exposed the TOC info i needed all X-Git-Url: https://diplodocus.org/git/flac-archive/commitdiff_plain/19b87656f5d6ee53f075ba5f70b726650e0e3421?hp=b4f5fea65a6b270d34bf3b57384e507936eb1169 Looks like MusicBrainz::Client exposed the TOC info i needed all along; stop running mkcue and use that instead. Thanks to Matthias Friedrich for the suggestion and demo code. --- diff --git a/fa-rip b/fa-rip index e9ad756..f327645 100755 --- a/fa-rip +++ b/fa-rip @@ -23,53 +23,59 @@ use Env qw( use Fcntl qw(O_CREAT O_WRONLY); use File::Temp; use Getopt::Long qw(:config gnu_getopt no_ignore_case); +use List::Util qw(min); use POSIX ':sys_wait_h'; use Pod::Usage; +use MusicBrainz::Client; +use MusicBrainz::Queries qw( + MBQ_GetCDTOC + MBE_TOCGetFirstTrack + MBE_TOCGetLastTrack + MBE_TOCGetTrackSectorOffset +); use MusicBrainz::Client::Simple; -sub run_or_die { - my $command = shift; - my $status; - - $status = system($command); - - if (WIFEXITED($status)) { - if (($status = WEXITSTATUS($status)) != 0) { - die("$command exited with status $status"); - } - } elsif (WIFSIGNALED($status)) { - die("$command killed with signal ", WTERMSIG($status)); - } elsif (WIFSTOPPED($status)) { - die("$command stopped with signal ", WSTOPSIG($status)); - } else { - die("Major horkage on system($command): \$? = $? \$! = $!"); - } -} - sub mkcue { my $device = shift; my $trackcount = shift; - my @command; - - push(@command, 'mkcue'); - if (defined($trackcount)) { - push(@command, "-t $trackcount"); - } + my $mb = MusicBrainz::Client->new; + defined($device) and $mb->set_device($device); + + $mb->query(MBQ_GetCDTOC) or die($mb->get_query_error); + + open(my $fh, '>cue') or die("open('>cue'): $!"); + print($fh "FILE \"dummy.wav\" WAVE\n"); + print($fh " TRACK 01 AUDIO\n"); + print($fh " INDEX 01 00:00:00\n"); + + my $first = $mb->get_result_data(MBE_TOCGetFirstTrack) + 1; + $trackcount = min($trackcount, $mb->get_result_data(MBE_TOCGetLastTrack)); + # There is frequently (always?) an offset of 150 sectors, so + # we'll subtract this offset from each track offset. + my $something = $mb->get_result_data1(MBE_TOCGetTrackSectorOffset, 2); + + for my $track ($first .. $trackcount) { + my $off = $mb->get_result_data1(MBE_TOCGetTrackSectorOffset, $track+1); + $off -= $something; + + my ($minutes,$seconds)=(0,0); + my $sectors = $off % 75; + if ($off >= 75) { + $seconds = $off / 75; + if ($seconds >= 60) { + $minutes = $seconds / 60; + $seconds = $seconds % 60; + } + } - if (defined($device)) { - push(@command, $device); + printf($fh " TRACK %02d AUDIO\n", $track); + printf($fh " INDEX 01 %02d:%02d:%02d\n", + $minutes, $seconds, $sectors); } - push(@command, '> cue'); - run_or_die(join(' ', @command)); - - if (not defined($trackcount)) { - open(F, 'cue') or die("open(cue): $!"); - $trackcount = grep(/TRACK.*AUDIO/, ); - close(F); - } + close($fh) or die("close(>cue): $!"); return $trackcount; } @@ -167,7 +173,7 @@ sub make_post_processor { MAIN: { my $post_processor; - my $trackcount; + my $trackcount = 99; my $help; my $tempdir; @@ -195,9 +201,9 @@ __END__ =head1 DESCRIPTION B creates a temporary directory for storage of its -intermediate files, runs C to create the "cue" file, uses -MusicBrainz to generate candidate tags files, and runs -C to rip the CD to the "wav" file. +intermediate files, uses MusicBrainz to create the "cue" file and +candidate tags files, and runs C to rip the CD to the +"wav" file. In order for this CD to be processed by B, you must create a "tags" file. This is usually done by renaming one of the