# - TRACKNUMBER - The track number of this piece
# - ARTIST - The artist generally considered responsible for the track
# - DATE - Date the track was recorded (XXX I use US release date)
-# I use one more, though I'm unsure where I got it. Did I make it up?
-# - DISCNUMBER - number in multi-disc collection
+# https://age.hobba.nl/audio/mirroredpages/ogg-tagging.html (supposedly mirrored from http://reactor-core.org/ogg-tagging.html )
+# specifies more:
+# - DISCNUMBER - if part of a multi-disc album, put the disc number here
+# - VERSION - e.g. "live", "radio edit"
+# - PARTNUMBER - part number if a work is divided across tracks
+# - PART - part name e.g. "Oh sole mio"
+# https://picard-docs.musicbrainz.org/en/appendices/tag_mapping.html
+# - ALBUMARTIST - maps to ID3v2 TPE2
# Input is a directory containing:
# - trackNN.cdda.wav - WAV format files ripped from CD-DA audio tracks where NN is track number 01 - 99
use v5.12;
use warnings;
-sub mangle_for_file_name {
- my $fn = shift;
- $fn =~ s/\s+/_/g;
- $fn =~ s/[^A-Za-z0-9._]/-/g;
- $fn
-}
+use FindBin;
-sub read_tags {
- my $fn = shift;
- open(my $fh, '<', $fn) || die("open($fn): $!");
- my %album;
- my @tracks;
- my $tracknum = 0;
- while (<$fh>) {
- chomp;
- s/^([^=[\]]+)(\[(\d+)])?=// || die("no field name in $_");
- my $name = $1;
- # TODO validate $name
- # TODO album tags should be illegal after track tags
- if (defined($3)) {
- if ($3 == $tracknum + 2) {
- $tracknum++;
- } elsif ($3 != $tracknum + 1) {
- $tracknum++; # increment from 0 to 1 for error message
- die("illegal track number jump from $tracknum to $3")
- }
- push(@{$tracks[$tracknum]->{$name}}, $_);
- } else {
- push(@{$album{$name}}, $_);
- }
- }
-
- \%album, \@tracks
-}
-
-sub quote {
- my $s = shift;
- $s =~ s/'/'\\''/g;
- "'$s'"
-}
+require "$FindBin::Bin/tags.p";
+epg::flac::archive::tags->import(
+ qw[
+ read_tags
+ mangle_for_file_name
+ quote
+ ]);
sub main {
my $input_directory = shift;
- my ($album, $tracks) = read_tags("$input_directory/tags");
+ my $fn = "$input_directory/tags";
+ open(my $fh, '<', $fn) || die("open($fn): $!");
+ my ($album, $tracks) = read_tags($fh);
if (!defined($album->{ALBUM}) || scalar(@{$album->{ALBUM}}) != 1) {
die('exactly one ALBUM tag required')
}
if (scalar(@{$album->{DISCNUMBER}}) != 1) {
die('one or zero DISCNUMBER tags required')
}
- @discnumber = (sprintf('%02d', $album->{DISCNUMBER}->[0]));
+ @discnumber = ($album->{DISCNUMBER}->[0]);
}
my $dir = join('/', '..', mangle_for_file_name($artist), mangle_for_file_name($album_tag));
my $fn = join('/',
$dir,
join('_',
- @discnumber,
+ (map { sprintf('%02d', $_) } @discnumber),
$tracknum_s,
mangle_for_file_name($title) . '.flac',
),
);
-e $fn && die("cowardly refusing to clobber $fn");
- my @pictures = ('--picture', quote('3|image/jpeg|||cover.front')); # TODO optional
+ my @pictures = ('--picture', quote('3|image/jpeg|||cover.front.jpeg')); # TODO optional
say(join(' ',
'flac -o',
quote($fn),
"track$tracknum_s.cdda.wav"
));
}
- say('rm tags cover.front');
+ say('rm tags cover.front.jpeg');
return 0;
}
}
1;
-