From: epg <> Date: Mon, 23 Aug 2004 03:48:07 +0000 (+0000) Subject: First crack at mp3 transcode script. X-Git-Url: https://diplodocus.org/git/flac-archive/commitdiff_plain/47d96a9a3eb7548d2f154c931cbd9a488c5dc866?hp=3939160bda17c95bc52906832baeaf32df76f590 First crack at mp3 transcode script. --- diff --git a/GNUmakefile b/GNUmakefile index 18db058..beeb953 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -19,10 +19,12 @@ ROFF= nroff -Tascii -mandoc SCRIPTS=\ fa-flacd \ fa-rip \ - fa-tags + fa-tags \ + flac2mp3 \ MAN=\ - fa-flacd.1 fa-flacd.0 + fa-flacd.1 fa-flacd.0 \ + flac2mp3.1 flac2mp3.0 \ all: ${SCRIPTS} ${MAN} diff --git a/README b/README index d807cb2..324eddd 100644 --- a/README +++ b/README @@ -4,3 +4,5 @@ Run perldoc fa-flacd for more information. flac-archive requires Perl >= 5.6, zsh >= 4.0, cddb-tool (part of abcde) and cd-discid, cdparanoia, and cdrdao. + +flac2mp3 additionally requires lame. diff --git a/flac2mp3 b/flac2mp3 new file mode 100755 index 0000000..9bfa59d --- /dev/null +++ b/flac2mp3 @@ -0,0 +1,146 @@ +#! /usr/bin/env perl + +# $Id$ + +=head1 NAME + +B - transcode FLAC file to MP3 files + +=head1 SYNOPSIS + +B 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. + +=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 () { + /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 () { + 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]}); + } +} + + +__END__ + +=head1 AUTHORS + +Written by Eric Gillespie . + +=cut + +# Local variables: +# cperl-indent-level: 4 +# perl-indent-level: 4 +# indent-tabs-mode: nil +# End: + +# vi: set tabstop=4 expandtab: