#!/usr/local/bin/perl =head1 NAME B - encode WAV files to FLAC =head1 SYNOPSIS B [B<-d> I] B I defaults to the album B in the tags file; one of these is required. TODO: implement B<-d> =cut package epg::flac::archive::encode; use v5.12; use warnings; use FindBin; require "$FindBin::Bin/tags.p"; epg::flac::archive::tags->import( qw[ read_tags mangle_for_file_name quote two_digits ]); sub main { my $input_directory = shift; 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') } my $album_tag = $album->{ALBUM}->[0]; # TODO -d support if (!defined($album->{ARTIST}) || scalar(@{$album->{ARTIST}}) != 1) { die('exactly one ARTIST tag required') } my $artist = $album->{ARTIST}->[0]; my $date; if (defined($album->{DATE})) { if (scalar(@{$album->{DATE}}) != 1) { die('one or zero DATE tags required') } $date = $album->{DATE}->[0]; } my @discnumber = (); if (defined($album->{DISCNUMBER})) { if (scalar(@{$album->{DISCNUMBER}}) != 1) { die('one or zero DISCNUMBER tags required') } @discnumber = ($album->{DISCNUMBER}->[0]); } my $dir = join('/', '..', mangle_for_file_name($artist), mangle_for_file_name($album_tag)); say('set -ex'); say('mkdir -p ', quote($dir)); my $tracknum = 0; for my $track (@$tracks) { $tracknum++; if (!defined($track->{TITLE}) || scalar(@{$track->{TITLE}}) < 1) { die("at least one TITLE required for track $tracknum") } $track->{ALBUM} = $album->{ALBUM}; $track->{TRACKNUMBER} = [$tracknum]; if (!defined($track->{ARTIST}) && defined($album->{ARTIST})) { $track->{ARTIST} = $album->{ARTIST}; } if (defined($date)) { $track->{DATE} = [$date]; } if (@discnumber) { $track->{DISCNUMBER} = \@discnumber; } my $title = join(' ', @{$track->{TITLE}}); my $tracknum_s = two_digits($tracknum); my $fn = join('/', $dir, join('_', (map { two_digits($_) } @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.jpeg')); # TODO optional say(join(' ', 'flac -o', quote($fn), '--delete-input-file', '-V', '--no-padding', '--best', @pictures, (map { my $name = $_; map { ('-T', quote($name . '=' . $_)) } @{$track->{$_}} } sort(keys(%$track))), "track$tracknum_s.cdda.wav" )); } say('rm tags cover.front.jpeg'); return 0; } if (!caller) { exit(main(@ARGV)) } 1;