]> diplodocus.org Git - flac-archive/blobdiff - fa-rip
Support multi-artist flac files.
[flac-archive] / fa-rip
diff --git a/fa-rip b/fa-rip
index 916c050b6b81ec8fe33b7125b8dbbb6e8620d76b..e9ad756855d22c46764af369d2162285164ac00f 100755 (executable)
--- a/fa-rip
+++ b/fa-rip
@@ -74,6 +74,36 @@ sub mkcue {
     return $trackcount;
 }
 
+sub tags_file {
+    my $fn = shift;
+    my $trackcount = shift;
+    my $various = shift;
+    my $artist = shift;
+    my $album = shift;
+    my $fh;
+    my $i;
+    my $track;
+    my $name;
+
+    open($fh, '>', $fn) or die("open('>$fn'): $!");
+    print($fh 'ARTIST=', (defined($artist) and $artist or ''), "\n");
+    print($fh 'ALBUM=', (defined($album) and $album or ''), "\n");
+    # MusicBrainz doesn't have dates yet; these are usually wrong anyway.
+    print($fh "DATE=\n");
+
+    for $i (1 .. $trackcount) {
+        $various and print($fh "ARTIST[$i]=\n");
+        if ($track = shift(@_)) {
+            $name = $track->get_name;
+        } else {
+            $name = '';
+        }
+        print($fh "TITLE[$i]=$name\n");
+    }
+
+    close($fh) or die("close(>$fn): $!");
+}
+
 sub tags {
     my $device = shift;
     my $trackcount = shift;
@@ -81,10 +111,8 @@ sub tags {
     my @results;
     my $album;
     my $i;
-    my @tracks;
-    my $name;
-    my $track;
-    my $j;
+    my $various;
+    my $seen_various;
 
     if (defined($device)) {
         $mb = new MusicBrainz::Client::Simple (device=>$device);
@@ -97,32 +125,21 @@ sub tags {
         die($mb->get_error);
     }
 
-    open(F, '>candidate-tags-0') or die("open('>candidate-tags-0'): $!");
-    print(F "$_=\n") for ('ARTIST', 'ALBUM', 'DATE');
-    print(F "TITLE=\n") for 1 .. $trackcount;
-    close(F) or die("close('>candidate-tags-0'): $!");
+    tags_file('candidate-tags-0', $trackcount, 0);
 
     for $album (@results) {
         $i++;
-        open(F, ">candidate-tags-$i") or die("open(>candidate-tags-$i): $!");
-
-        print(F 'ARTIST=', $album->get_artist->get_name, "\n");
-        print(F 'ALBUM=', $album->get_name, "\n");
-
-        # MusicBrainz doesn't have dates yet; these are usually wrong anyway.
-        print(F "DATE=\n");
 
-        @tracks = $album->get_tracks;
-        for $j (1 .. $trackcount) {
-            if ($track = shift(@tracks)) {
-                $name = $track->get_name;
-            } else {
-                $name = '';
+        if ($various = $album->has_various_artists) {
+            if (not $seen_various) {
+                $seen_various = 1;
+                tags_file('candidate-tags-0v', $trackcount, 1);
             }
-            print(F "TITLE=$name\n");
         }
 
-        close(F) or die("close(>candidate-tags-$i): $!");
+        tags_file("candidate-tags-$i", $trackcount, $various,
+                  $album->get_artist->get_name, $album->get_name,
+                  $album->get_tracks);
     }
 }