}
sub plan_flac {
+ local $@;
my $workdir = shift;
my $path = shift;
my $tags = shift;
-
+ my %track_tags = eval { track_tags($tags) };
+ if ($@) {
+ die("$@: $path")
+ }
(
- tags => {track_tags($tags)},
+ tags => \%track_tags,
flac => $path,
filename => filename($tags),
dir => join('/', $workdir, mangle_for_file_name(@{$tags->{ALBUM}})),
}
sub read_tags {
+ local $_;
my $fh = shift;
my %album;
my @tracks;
my $name;
while (<$fh>) {
chomp;
+ s/^DATE\[US]=200/DATE=200/; # I have DATE[US]=2004 and DATE[US]=2007. TODO fix them and remove hack.
if (!s/^([^=[\]]+)(\[(\d+)])?=//) {
if (defined($name) && $name eq 'DESCRIPTION') {
# Qobuz offers FLAC files like this.
}
die("no field name in: $_");
}
- $name = $1;
+ $name = uc($1);
# TODO validate $name
# TODO album tags should be illegal after track tags
if (defined($3)) {
}
sub read_tags_metaflac {
+ local $@;
my $fn = shift;
open(my $fh, '-|', 'metaflac', '--no-utf8-convert', '--export-tags-to=-', $fn) || die("metaflac: $!");
- my @result = read_tags($fh);
+ my @result = eval { read_tags($fh) };
+ if ($@) {
+ die("$@: $fn")
+ }
if (!close($fh)) {
if ($! == 0) {
die("metaflac exited $?")
sub disc_tags {
my %tags = @_;
- if (!defined($tags{ALBUM}) || @{$tags{ALBUM}} != 1) {
- die('exactly one ALBUM tag required')
+ if (!defined($tags{ALBUM}) || @{$tags{ALBUM}} == 0) {
+ die('exactly one ALBUM tag required, found zero')
+ }
+ if (@{$tags{ALBUM}} != 1) {
+ die('exactly one ALBUM tag required, found [', join("\n", @{$tags{ALBUM}}), ']')
}
my $album_tag = $tags{ALBUM}->[0];