]> diplodocus.org Git - flac-archive/blobdiff - fa-rip
Write ALBUMARTIST field and adapt to some API changes.
[flac-archive] / fa-rip
diff --git a/fa-rip b/fa-rip
index af19f8298c0d054c072cffa615fbe4f429fcfd38..1fe5bbd30f25fc462af30ff6726cefeba719cd95 100755 (executable)
--- a/fa-rip
+++ b/fa-rip
@@ -1,4 +1,4 @@
-#! /usr/bin/env python2.4
+#!/usr/bin/python
 
 """
 =head1 NAME
@@ -7,7 +7,7 @@ B<fa-rip> - rip a CD for B<fa-flacd>
 
 =head1 SYNOPSIS
 
-B<fa-rip> [B<-d> I<device>] [B<-p> I<post-processor> [B<-t> I<track-count>]
+B<fa-rip> [B<--artist> I<artist> B<--title> I<title>] [B<-d> I<device>] [B<-m>] [B<-p> I<post-processor>] [B<-s>] [B<-t> I<track-count>]
 
 =head1 DESCRIPTION
 
@@ -38,7 +38,7 @@ just need to set things up for B<fa-flacd>.
 Use I<device> as the CD-ROM device, instead of the default
 "/dev/cdrom" or the environment variable CDDEV.
 
-B<-m> [B<--no-musicbrainz>]
+=item B<-m> [B<--no-musicbrainz>]
 
 Don't connect to MusicBrainz, just write candidate-tags-0.
 
@@ -48,7 +48,7 @@ Create a "post-processor" file in the temporary directory containing
 the line 'I<post-processor> "$@"'.  See B<fa-flacd>'s man page for
 information about this hook.
 
-B<-s> [B<--single-file>]
+=item B<-s> [B<--single-file>]
 
 Rip whole disc to one wav file and configure B<fa-flacd> to encode it
 to one FLAC file with embedded cuesheet.
@@ -128,7 +128,10 @@ def mkcue(disc, trackcount=None):
 def tags_file(fn, trackcount, various, artist=None, album=None,
               release_dates={}, tracks=[]):
     fp = c(file, fn, 'w')
-    c(fp.write, 'ARTIST=')
+    if various:
+        c(fp.write, 'ALBUMARTIST=')
+    else:
+        c(fp.write, 'ARTIST=')
     if artist != None:
         c(fp.write, artist.encode('utf-8'))
     c(fp.write, '\nALBUM=')
@@ -170,23 +173,30 @@ def tags(q, releases, trackcount):
 
     tags_file('candidate-tags-0', trackcount, False)
 
-    include = musicbrainz2.webservice.ReleaseIncludes(tracks=True)
+    include = musicbrainz2.webservice.ReleaseIncludes(artist=True, tracks=True)
 
     i = 0
-    for album in releases:
+    for rel_id in releases:
         i += 1
-        various = not album.release.isSingleArtistRelease()
+        release = q.getReleaseById(rel_id, include)
+        various = not release.isSingleArtistRelease()
 
         if various and not seen_various:
             seen_various = True
-            tags_file('candidate-tags-0v', trackcount, True)
+            tags_file('candidate-tags-0v', trackcount, various)
 
         tags_file('candidate-tags-' + str(i), trackcount, various,
-                  album.release.artist.name, album.release.title,
-                  album.release.getReleaseEventsAsDict(),
-                  q.getReleaseById(album.release.id, include).tracks)
-
-        cover_art(str(i), album.release.asin)
+                  release.artist.name, release.title,
+                  release.getReleaseEventsAsDict(),
+                  release.tracks)
+
+        # XXX Not sure if .asin is here after my change above; may need to
+        # include urlRelations=True.  See also:
+        # for i in release.getRelations(): print i.type
+        # http://musicbrainz.org/ns/rel-1.0#Wikipedia
+        # ...
+        # http://musicbrainz.org/ns/rel-1.0#AmazonAsin
+        cover_art(str(i), release.asin)
 
 def rip(device, trackcount, single_file):
     if device == None:
@@ -212,7 +222,9 @@ def make_post_processor(command):
 
 def releases_by_disc(q, disc):
     filter = musicbrainz2.webservice.ReleaseFilter(discId=disc.getId())
-    return q.getReleases(filter)
+    # XXX had to change x.getId to x.release.getId on 10.04; is that an API
+    # change in a newer version (handle both) or is this code I never tested?
+    return (x.release.getId() for x in q.getReleases(filter))
 
 def releases_by(q, title, artist=None):
     r = q.getReleases(musicbrainz2.webservice.ReleaseFilter(title=title))
@@ -220,8 +232,8 @@ def releases_by(q, title, artist=None):
         return r
 
     artist = re.sub(r'\s+', r'\s+', artist.strip())
-    return [x for x in r if re.match(artist, x.release.artist.name,
-                                     re.IGNORECASE) != None]
+    return (x.getId() for x in r if re.match(artist, x.release.artist.name,
+                                             re.IGNORECASE) != None)
 
 def main(argv):
     # Control the exit code for any uncaught exceptions.