use File::Temp;
use FindBin;
-require "$FindBin::Bin/tags.pl";
+use lib $FindBin::Bin;
+
+require '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 $quoted_flac = quote(shift);
+ my $mp3 = shift;
+ my $flac = shift;
my $tags = shift;
- 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 next time i need them
- say('metaflac --export-picture-to=flac2mp3.cover.$$', " $quoted_flac && pic_options=", '"--ti flac2mp3.cover.$$"');
+ 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',
- $quoted_flac,
- '|',
- 'lame',
- '--id3v2-only',
- '--id3v2-latin1',
- '--pad-id3v2-size', 0,
- '--preset standard',
- '--ta',
- quote($artist),
- '--tl',
- quote($album),
- '--tn',
- quote($tracknumber),
- '--tt',
- quote($title),
- '--ty',
- quote($date),
- '$pic_options',
- #(map { ('--tv', quote("TPE2=$_")) } @{$albumartist}),
- (map { ('--tv', quote("TPOS=$_")) } @{$discnumber}),
- '-',
- quote(
- mangle_for_file_name(
- join(' ',
- $artist,
- $album,
- (map { sprintf('%02d', $_) } @{$discnumber}),
- $tracknumber,
- $title,
- ))
- . '.mp3'
- )
- ));
- say('unset pic_options');
+ 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 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
+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 $fn (@_) {
- my ($tags) = read_tags_metaflac($fn);
- flac2mp3($fn, $tags);
+ 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.$$');
}
if (!caller) {
- exit(main(@ARGV))
+ exit(main(@ARGV));
}
1;