]> diplodocus.org Git - flac-archive/blobdiff - fa-encode
untested attempt to restore embedded cover art
[flac-archive] / fa-encode
index 5a8a72da097b43ebf914d34a78390f7272db2868..a4db1b67c86b57637a3623fa86e47dbda43cf86a 100755 (executable)
--- a/fa-encode
+++ b/fa-encode
@@ -27,8 +27,14 @@ TODO:  implement B<-d>
 # - 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)
 # - 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
 
 # Input is a directory containing:
 # - trackNN.cdda.wav - WAV  format files ripped from CD-DA audio tracks where NN is track number 01 - 99
@@ -61,50 +67,21 @@ package epg::flac::archive::encode;
 use v5.12;
 use warnings;
 
 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;
 
 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 (!defined($album->{ALBUM}) || scalar(@{$album->{ALBUM}}) != 1) {
         die('exactly one ALBUM tag required')
     }
@@ -127,7 +104,7 @@ sub main {
         if (scalar(@{$album->{DISCNUMBER}}) != 1) {
             die('one or zero DISCNUMBER tags 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 $dir = join('/', '..', mangle_for_file_name($artist), mangle_for_file_name($album_tag));
@@ -156,13 +133,13 @@ sub main {
         my $fn = join('/',
                       $dir,
                       join('_',
         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");
                            $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),
         say(join(' ',
                  'flac -o',
                  quote($fn),
@@ -180,7 +157,7 @@ sub main {
                  "track$tracknum_s.cdda.wav"
             ));
     }
                  "track$tracknum_s.cdda.wav"
             ));
     }
-    say('rm tags cover.front');
+    say('rm tags cover.front.jpeg');
 
     return 0;
 }
 
     return 0;
 }
@@ -190,4 +167,3 @@ if (!caller) {
 }
 
 1;
 }
 
 1;
-