]> diplodocus.org Git - flac-archive/commitdiff
Looks like MusicBrainz::Client exposed the TOC info i needed all
authorepg <>
Sun, 26 Jun 2005 18:06:58 +0000 (18:06 +0000)
committerepg <>
Sun, 26 Jun 2005 18:06:58 +0000 (18:06 +0000)
along; stop running mkcue and use that instead.

Thanks to Matthias Friedrich <matt@mafr.de> for the suggestion and
demo code.

fa-rip

diff --git a/fa-rip b/fa-rip
index e9ad756..f327645 100755 (executable)
--- 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/, <F>);
-        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<fa-rip> creates a temporary directory for storage of its
-intermediate files, runs C<mkcue(1)> to create the "cue" file, uses
-MusicBrainz to generate candidate tags files, and runs
-C<cdparanoia(1)> to rip the CD to the "wav" file.
+intermediate files, uses MusicBrainz to create the "cue" file and
+candidate tags files, and runs C<cdparanoia(1)> to rip the CD to the
+"wav" file.
 
 In order for this CD to be processed by B<fa-flacd>, you must create a
 "tags" file.  This is usually done by renaming one of the