+#! /usr/bin/env perl
+
+# $Id$
+
+=head1 NAME
+
+B<flac2mp3> - transcode FLAC file to MP3 files
+
+=head1 SYNOPSIS
+
+B<flac2mp3> I<file>
+
+=head1 DESCRIPTION
+
+B<flac2mp3> transcodes the FLAC file I<file> to MP3 files. I<file> is
+the kind of FLAC file B<fa-flacd> generates. That is, it contains a
+cue sheet, one TITLE tag per track listed therein, and ARTIST, ALBUM,
+and DATE tags.
+
+=cut
+
+use strict;
+use warnings;
+
+use Pod::Usage;
+
+sub tformat {
+ my $min = shift;
+ my $sec = shift;
+ my $hun = shift;
+ return "$min:$sec.$hun";
+}
+
+sub get_decode_args {
+ my $fn = shift;
+ my @l;
+
+ open(F, '-|', 'metaflac', '--export-cuesheet-to=-', $fn);
+ while (<F>) {
+ /INDEX 01 (\d\d):(\d\d):(\d\d)$/ or next;
+ push(@l, [$1, $2, $3]);
+ }
+
+ my @args;
+ for my $i (0..$#l) {
+ my $arg = ["--skip=" . tformat(@{$l[$i]})];
+ my $next = $l[$i+1];
+ if (defined($next)) {
+ if ($next->[2] == 0) {
+ if ($next->[1] == 0) {
+ push(@$arg, '--until=' . tformat($next->[0] - 1, 59, 99));
+ } else {
+ push(@$arg, '--until=' . tformat($next->[0], $next->[1] - 1,
+ 99));
+ }
+ } else {
+ push(@$arg, '--until=' . tformat($next->[0], $next->[1],
+ $next->[2] - 1));
+ }
+ }
+ push(@args, $arg);
+ }
+
+ return @args;
+}
+
+# Return the ARTIST, ALBUM, and DATE tags followed by the TITLE tags
+# in the file FN.
+sub get_tags {
+ my $fn = shift;
+ my $tag;
+ my $value;
+ my $artist;
+ my $album;
+ my $date;
+ my @titles;
+
+ open(TAGS, '-|', 'metaflac', '--export-vc-to=-', $fn);
+ while (<TAGS>) {
+ chomp;
+
+ ($tag, $value) = split(/=/, $_, 2);
+
+ if (/^ARTIST=/) {
+ $artist = $value;
+ } elsif (/^ALBUM=/) {
+ $album = $value;
+ } elsif (/^DATE=/) {
+ $date = $value;
+ } elsif (/TITLE=/) {
+ push(@titles, $value);
+ }
+ }
+ close(TAGS) or die("close($fn): $!");
+
+ return ($artist, $album, $date, @titles);
+}
+
+sub flac2mp3 {
+ my $fn = shift;
+ my $title = shift;
+ my $artist = shift;
+ my $album = shift;
+ my $date = shift;
+ my $track = shift;
+ my $skip_arg = shift;
+ my $until_arg = shift;
+
+ my $outfile = "$artist ($album) $title.mp3";
+ $outfile =~ s/\//_/g;
+ $outfile =~ s/:/_/g;
+ $outfile =~ s/'/_/g;
+ $outfile =~ s/"/_/g;
+
+ # XXX
+ $until_arg ||= '';
+ system("flac -cd $skip_arg $until_arg '$fn' | lame --preset standard --tt '$title' --ta '$artist' --tl '$album' --ty '$date' --tn $track - '$outfile'");
+}
+
+MAIN: {
+ my $fn = shift or pod2usage();
+ my @args = get_decode_args($fn);
+ my ($artist, $album, $date, @titles) = get_tags($fn);
+
+ for my $i (0..$#titles) {
+ flac2mp3($fn, $titles[$i], $artist, $album, $date, $i + 1,
+ @{$args[$i]});
+ }
+}
+
+\f
+__END__
+
+=head1 AUTHORS
+
+Written by Eric Gillespie <epg@pretzelnet.org>.
+
+=cut
+
+# Local variables:
+# cperl-indent-level: 4
+# perl-indent-level: 4
+# indent-tabs-mode: nil
+# End:
+
+# vi: set tabstop=4 expandtab: