require "$FindBin::Bin/tags.pl";
epg::flac::archive::tags->import(
qw[
- disc_tags
- read_tags
- mangle_for_file_name
- quote
- ]);
+ track_tags
+ read_tags_metaflac
+ mangle_for_file_name
+ quote
+ two_digits
+ ]
+);
sub flac2mp3 {
- my %a = @_;
- my $quoted_flac = quote($a{flac});
-
- say('if metaflac --export-picture-to=flac2mp3.cover.$$ ', $quoted_flac, '; then');
- say(' pic_options="--ti flac2mp3.cover.$$"');
- say('fi');
+ 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',
- $quoted_flac,
- '|',
- 'lame',
- '--id3v2-only',
- '--id3v2-latin1',
- '--pad-id3v2-size', 0,
- '--preset standard',
- '--ta',
- quote($a{artist}),
- '--tl',
- quote($a{album}),
- '--tn',
- quote($a{track}),
- '--tt',
- quote($a{title}),
- '--ty',
- quote($a{date}),
- '$pic_options',
- (map { ('--tv', quote("TPE2=$_")) } @{$a{albumartist}}),
- (map { ('--tv', quote("TPOS=$_")) } @{$a{discnumber}}),
- '-',
- quote(
- mangle_for_file_name(
- join(' ',
- $a{artist},
- $a{album},
- (map { sprintf('%02d', $_) } @{$a{discnumber}}),
- $a{track},
- $a{title},
- ))
- . '.mp3'
- )
- ));
- say('unset pic_options');
- say('rm -f flac2mp3.cover.$$');
-}
-
-sub read_tags_metaflac {
- my $fn = shift;
- open(my $fh, '-|', 'metaflac', '--no-utf8-convert', '--export-tags-to=-', $fn) || die("metalfac: $!");
- my @result = read_tags($fh);
- if (!close($fh)) {
- if ($! == 0) {
- die("metaflac exited $?")
- }
- die("close(metaflac): $!")
- }
- @result
+ 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),
+ )
+ );
}
sub main {
- for my $fn (@_) {
- my ($tags) = read_tags_metaflac($fn);
- my ($album, $artist, $date, $discnumber) = disc_tags($tags);
-
- # TODO resurrect whole-disc FLAC?
- # 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.
- # if track == None:
- # track = 1
- # else:
- # track = int(track)
- {
- my $tracknumber = epg::flac::archive::tags::one(TRACKNUMBER => $tags);
- my $title = epg::flac::archive::tags::one(TITLE => $tags);
- # TODO restore PARTNUMBER and VERSION net time i need them
- flac2mp3(
- artist => $artist,
- album => $album,
- date => $date,
- discnumber => $discnumber,
- track => $tracknumber,
- title => $title,
- flac => $fn,
+ 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.$$');
return 0;
}
if (!caller) {
- exit(main(@ARGV))
+ exit(main(@ARGV));
}
1;