X-Git-Url: https://diplodocus.org/git/flac-archive/blobdiff_plain/bcecea2028eb0f78e608ac18934582569d942ce9..cd6b00d1cf4de2e18326ceb94a32366dbd4cd228:/flac2mp3 diff --git a/flac2mp3 b/flac2mp3 index 3fc6bf4..c8e9d11 100755 --- a/flac2mp3 +++ b/flac2mp3 @@ -1,6 +1,4 @@ -#! /usr/bin/env perl - -# $Id$ +#!/usr/local/bin/perl =head1 NAME @@ -8,145 +6,133 @@ B - transcode FLAC file to MP3 files =head1 SYNOPSIS -B 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 +Note that lame is retarded, and parses B directly itself! So, in order +for it to transcode textual tags, you must specify the encoding in LANG, e.g. +LANG=en_US.utf-8 -use strict; -use warnings; +=head1 OPTIONS -use Pod::Usage; +=over 4 -sub tformat { - my $min = shift; - my $sec = shift; - my $hun = shift; - return "$min:$sec.$hun"; -} +=item B<--lame-options> I -sub get_decode_args { - my $fn = shift; - my @l; +Pass I to B. This ends up being passed to the +shell, so feel free to take advantage of that. You'll almost +certainly have to put I in single quotes. - open(F, '-|', 'metaflac', '--export-cuesheet-to=-', $fn); - while () { - /INDEX 01 (\d\d):(\d\d):(\d\d)$/ or next; - push(@l, [$1, $2, $3]); - } +=item B<-q> [B<--quiet>] - 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, 74)); - } else { - push(@$arg, '--until=' . tformat($next->[0], $next->[1] - 1, - 74)); - } - } else { - push(@$arg, '--until=' . tformat($next->[0], $next->[1], - $next->[2] - 1)); - } - } - push(@args, $arg); - } +Suppress status information. This option is passed along to B +and B. - return @args; -} +=item B<-v> [B<--verbose>] -# 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) - or die("open(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(metaflac --export-vc-to=- $fn): $?"); +Print diagnostic information. This option is passed along to B +and B. - return ($artist, $album, $date, @titles); -} +=back -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; - - # We'll be putting these in single quotes, so we need to escape - # 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/'/'\\''/; - } +=head1 AUTHORS - $outfile = sprintf("$artist ($album) \%02s $title.mp3", $track); - $outfile =~ s/\//_/g; +Written by Eric Gillespie . - $until_arg ||= ''; - # XXX - system("flac -cd $skip_arg $until_arg '$fn' | lame --preset standard --tt '$title' --ta '$artist' --tl '$album' --ty '$date' --tn $track - '$outfile'"); -} +=cut -MAIN: { - my $fn = shift or pod2usage(); - my @args = get_decode_args($fn); - my ($artist, $album, $date, @titles) = get_tags($fn); +package epg::flac::archive::mp3; - for my $i (0..$#titles) { - flac2mp3($fn, $titles[$i], $artist, $album, $date, $i + 1, - @{$args[$i]}); - } -} +use v5.12; +use warnings; - -__END__ +use File::Temp; +use FindBin; -=head1 AUTHORS +require "$FindBin::Bin/tags.pl"; +epg::flac::archive::tags->import( + qw[ + track_tags + read_tags_metaflac + mangle_for_file_name + quote + two_digits + ] +); -Written by Eric Gillespie . +sub flac2mp3 { + my $mp3 = shift; + my $flac = shift; + my $tags = shift; + + # This is an old TODO; what's wrong with --ty ? + # TODO: Look at TDOR, TDRL, TDRC for date. + say( + join( + ' ', + 'flac', + '-cd', + quote($flac), + '|', + 'lame', + '--id3v2-only', + '--id3v2-latin1', + '--pad-id3v2-size', 0, + '--preset standard', + '--ta', + quote($tags->{artist}), + '--tl', + quote($tags->{album}), + '--tn', + quote($tags->{tracknumber}), + '--tt', + quote($tags->{title}), + '--ty', + quote($tags->{date}), + '$pic_options', + + #(map { ('--tv', quote("TPE2=$_")) } @{$albumartist}), + (map { ('--tv', quote("TPOS=$_")) } @{$tags->{discnumber}}), + '-', + quote($mp3), + ) + ); +} -=cut +sub main { + for my $flac (@_) { + say('metaflac --export-picture-to=flac2mp3.cover.$$ ', + quote($flac), ' && pic_options="--ti flac2mp3.cover.$$"'); + my %tags = track_tags(read_tags_metaflac($flac)); + flac2mp3( + mangle_for_file_name( + join(' ', + $tags{artist}, + $tags{album}, + (map { two_digits($_) } @{$tags{discnumber}}), + two_digits($tags{tracknumber}), + $tags{title}, + ) + ) + . '.mp3', + $flac, + \%tags, + ); + say('unset pic_options'); + } + say('rm -f flac2mp3.cover.$$'); -# Local variables: -# cperl-indent-level: 4 -# perl-indent-level: 4 -# indent-tabs-mode: nil -# End: + return 0; +} + +if (!caller) { + exit(main(@ARGV)); +} -# vi: set tabstop=4 expandtab: +1;