#!/usr/local/bin/perl =head1 NAME B - transcode FLAC file to MP3 files =head1 SYNOPSIS B [B<--lame-options> I] [B<-q>] [B<-v>] I [...] =head1 DESCRIPTION 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. 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 =head1 OPTIONS =over 4 =item B<--lame-options> I 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. =item B<-q> [B<--quiet>] Suppress status information. This option is passed along to B and B. =item B<-v> [B<--verbose>] Print diagnostic information. This option is passed along to B and B. =back =head1 AUTHORS Written by Eric Gillespie . =cut package epg::flac::archive::mp3; use v5.12; use warnings; use File::Temp; use FindBin; use lib $FindBin::Bin; require 'tags.pl'; epg::flac::archive::tags->import( qw[ track_tags read_tags_metaflac mangle_for_file_name quote two_digits ] ); sub flac2mp3 { my $mp3 = shift; my $flac = shift; my $tags = shift; my @version; if (defined($tags->{version})) { @version = ('(' . $tags->{version} . ')'); } # 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(join(' ', $tags->{title}, @version)), '--ty', quote($tags->{date}), '$pic_options', #(map { ('--tv', quote("TPE2=$_")) } @{$albumartist}), (map { ('--tv', quote("TPOS=$_")) } @{$tags->{discnumber}}), '-', quote($mp3), ) ); } sub filename { my $tags = shift; mangle_for_file_name( join(' ', @{$tags->{ARTIST}}, @{$tags->{ALBUM}}, (map { two_digits($_) } @{$tags->{DISCNUMBER} // []}), (map { two_digits($_) } @{$tags->{TRACKNUMBER} // []}), @{$tags->{TITLE}}, @{$tags->{VERSION} // []}, @{$tags->{PARTNUMBER} // []}, ) ) . '.mp3'; } sub main { for my $flac (@_) { say('metaflac --export-picture-to=flac2mp3.cover.$$ ', quote($flac), ' && pic_options="--ti flac2mp3.cover.$$"'); # TODO multi-track my ($tags) = read_tags_metaflac($flac); flac2mp3(filename($tags), $flac, {track_tags($tags)}); say('unset pic_options'); } say('rm -f flac2mp3.cover.$$'); return 0; } if (!caller) { exit(main(@ARGV)); } 1;