X-Git-Url: https://diplodocus.org/git/flac-archive/blobdiff_plain/c164432546d765e8508d3dee93f101c69bb0937b..c3c2f3fcc2721a9c6cc9b7fc4127bdff56d233d4:/flac2mp3 diff --git a/flac2mp3 b/flac2mp3 index 6a496bf..21cf9c5 100755 --- a/flac2mp3 +++ b/flac2mp3 @@ -8,14 +8,14 @@ B - transcode FLAC file to MP3 files =head1 SYNOPSIS -B [B<--lame-options> I] [B<-q>] [B<-v>] I +B [B<--lame-options> I] [B<-q>] [B<-v>] I [...] =head1 DESCRIPTION -B transcodes the FLAC file I to MP3 files. I is -the kind of FLAC file B generates. That is, it contains a -cue sheet, one TITLE tag per track listed therein, and ARTIST, ALBUM, -and DATE tags. +B transcodes the FLAC files I to MP3 files. I +may be the kind of FLAC file B generates. That is, it +contains a cue sheet, one TITLE tag per track listed therein, and +ARTIST, ALBUM, and DATE tags. =cut @@ -85,6 +85,11 @@ sub get_decode_args { push(@args, $arg); } + # If no cue sheet, stick a dummy in here. + if (@args == 0) { + @args = ([]); + } + return @args; } @@ -99,6 +104,8 @@ sub get_tags { my $artist; my $album; my $date; + my $discnum; + my $track; open(TAGS, '-|', 'metaflac', '--export-vc-to=-', $fn) or die("open(metaflac --export-vc-to=- $fn): $!"); @@ -113,8 +120,12 @@ sub get_tags { $album = $value; } elsif (/^DATE=/i) { $date = $value; + } elsif (/^DISCNUMBER=/i) { + $discnum = int($value); } elsif (/^ARTIST\[/i) { push(@$artists, $value); + } elsif (/^TRACKNUMBER=/i) { + $track = $value; # Intentionally don't match the = on this one, to support the # TITLE[1] .. TITLE[n] tag style. @@ -124,16 +135,32 @@ sub get_tags { } close(TAGS) or die("close(metaflac --export-vc-to=- $fn): $?"); - return ($artist, $album, $date); + # If no TITLEs, stick a dummy in here. + if (@$titles == 0) { + push(@$titles, undef); + } + + return ($artist, $album, $date, $discnum, $track); +} + +sub arg { + my $arg = shift; + my $var = shift; + + if (defined($$var)) { + $$var = "$arg '$$var'"; + } else { + $$var = '' + } } sub flac2mp3 { my $fn = shift; - my $title = shift; - my $artist = shift; - my $album = shift; - my $date = shift; - my $track = shift; + my $title = (shift or 'unknown'); + my $artist = (shift or 'unknown'); + my $album = (shift or 'unknown'); + my $date = (shift or 'unknown'); + my $track = int(shift); my $skip_arg = shift; my $until_arg = shift; my @tmp; @@ -158,16 +185,23 @@ sub flac2mp3 { # any single quotes in the filename by closing the quote ('), # putting an escaped quote (\'), and then reopening the quote ('). for ($fn, $title, $artist, $album, $date) { - s/'/'\\''/g; + defined and s/'/'\\''/g; } $outfile = sprintf("$artist ($album) \%02s $title.mp3", $track); $outfile =~ s/\//_/g; + arg('--tt', \$title); + arg('--ta', \$artist); + arg('--tl', \$album); + arg('--ty', \$date); + arg('--tn', \$track); + + $skip_arg ||= ''; $until_arg ||= ''; run_or_die(join(' ', "flac $flac_options -cd $skip_arg $until_arg '$fn'", - " | lame $lame_options --tt '$title' --ta '$artist'", - " --tl '$album' --ty '$date' --tn $track - '$outfile'")); + " | lame $lame_options $title $artist $album $date $track", + " - '$outfile'")); } MAIN: { @@ -180,14 +214,27 @@ MAIN: { ) or pod2usage(); $help and pod2usage(-exitstatus=>0, -verbose=>1); - my $fn = shift or pod2usage(); - my @args = get_decode_args($fn); - my (@artists, @titles); - my ($artist, $album, $date) = get_tags($fn, \@artists, \@titles); - - for my $i (0..$#titles) { - flac2mp3($fn, $titles[$i], ($artists[$i] or $artist), $album, $date, - $i + 1, @{$args[$i]}); + @ARGV or pod2usage(); + for my $fn (@ARGV) { + my @args = get_decode_args($fn); + my (@artists, @titles); + my ($artist, $album, $date, $discnum, $track) = get_tags($fn, \@artists, + \@titles); + + # lame doesn't seem to support disc number. + defined($discnum) and $album .= " (disc $discnum)"; + + # Stupid hack: only a single-track file should have the + # TRACKNUMBER tag, so use it if set for the first pass through + # the loop. At the end of the loop, we'll set $track for the + # next run, so this continues to work for multi-track files. + $track ||= 1; + + for my $i (0..$#titles) { + flac2mp3($fn, $titles[$i], ($artists[$i] or $artist), $album, $date, + $track, @{$args[$i]}); + $track = $i + 2; + } } }