+B<fa-rip> [B<-d> I<device>] [B<-t> I<track-count>]
+
+=cut
+
+use strict;
+use warnings;
+
+use Env qw(
+ CDDEV
+);
+
+use File::Temp;
+use Getopt::Long qw(:config gnu_getopt no_ignore_case);
+use POSIX ':sys_wait_h';
+use Pod::Usage;
+
+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");
+ }
+
+ if (defined($device)) {
+ push(@command, $device);
+ }
+
+ 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);
+ }
+
+ return $trackcount;
+}
+
+sub tags {
+ my $device = shift;
+ my $trackcount = shift;
+ my $mb;
+ my @results;
+ my $album;
+ my $i;
+ my @tracks;
+ my $name;
+ my $track;
+ my $j;
+
+ if (defined($device)) {
+ $mb = new MusicBrainz::Client::Simple (device=>$device);
+ } else {
+ $mb = new MusicBrainz::Client::Simple;
+ }
+
+ @results = $mb->lookup_cd;
+ if (not $mb->success) {
+ 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'): $!");
+
+ 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 = '';
+ }
+ print(F "TITLE=$name\n");
+ }
+
+ close(F) or die("close(>candidate-tags-$i): $!");
+ }