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
-}
-
-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}}, $_);
- }
- }
+use FindBin;
- \%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',
),