]> diplodocus.org Git - flac-archive/blobdiff - fa-rip
Use flac_archive.tags.Tags, greatly simplifying things. Put PART tag
[flac-archive] / fa-rip
diff --git a/fa-rip b/fa-rip
index d63f95181e289d19cfa23727f52e07a75c0b13ba..4b7f76ddff63ff3cb02cbac8ca679c9a2485ae64 100755 (executable)
--- a/fa-rip
+++ b/fa-rip
@@ -1,6 +1,6 @@
 #! /usr/bin/env python2.4
 
-'''
+"""
 =head1 NAME
 
 B<fa-rip> - rip a CD for B<fa-flacd>
@@ -65,10 +65,11 @@ it under the same terms as Perl itself.
 
 =cut
 
-''' #' # python-mode is sucks
+"""
 
-import os, sys, tempfile, traceback
+import os, re, sys, tempfile, traceback
 from optparse import OptionParser
+import urllib
 
 import musicbrainz2.disc
 import musicbrainz2.webservice
@@ -112,10 +113,10 @@ def tags_file(fn, trackcount, various, artist=None, album=None,
     fp = c(file, fn, 'w')
     c(fp.write, 'ARTIST=')
     if artist != None:
-        c(fp.write, artist)
+        c(fp.write, artist.encode('utf-8'))
     c(fp.write, '\nALBUM=')
     if album != None:
-        c(fp.write, album)
+        c(fp.write, album.encode('utf-8'))
     c(fp.write, '\n')
 
     have_date = False
@@ -124,7 +125,9 @@ def tags_file(fn, trackcount, various, artist=None, album=None,
         c(fp.write, 'DATE[%s]=%s\n' % (country, date))
     have_date or c(fp.write, 'DATE=\n')
 
-    for i in xrange(1, trackcount):
+    if len(tracks) > 0:
+        trackcount = min(trackcount, len(tracks))
+    for i in xrange(1, trackcount + 1):
         try:
             track = tracks.pop(0)
             title = track.title
@@ -132,47 +135,50 @@ def tags_file(fn, trackcount, various, artist=None, album=None,
         except IndexError:
             title = ''
             artist = ''
-        various and c(fp.write, 'ARTIST[%d]=%s\n' % (i, artist))
-        c(fp.write, 'TITLE[%d]=%s\n' % (i, title))
+        various and c(fp.write, 'ARTIST[%d]=%s\n' % (i,
+                                                     artist.encode('utf-8')))
+        c(fp.write, 'TITLE[%d]=%s\n' % (i, title.encode('utf-8')))
 
     c(fp.close)
 
-def tags(disc, trackcount, mb=True):
+def cover_art(i, asin):
+    url = 'http://images.amazon.com/images/P/%s.01.MZZZZZZZ.jpg' % (asin,)
+    fp = file('cover.front-' + i, 'w')
+    fp.write(urllib.urlopen(url).read())
+    fp.close()
+
+def tags(q, releases, trackcount):
     results = []
     seen_various = False
 
     tags_file('candidate-tags-0', trackcount, False)
 
-    if not mb:
-        return
-
-    include = musicbrainz2.webservice.ReleaseIncludes(artist=True, tracks=True)
-    q = musicbrainz2.webservice.Query()
-    filter = musicbrainz2.webservice.ReleaseFilter(discId=disc.getId())
+    include = musicbrainz2.webservice.ReleaseIncludes(tracks=True)
 
     i = 0
-    for album in q.getReleases(filter):
+    for album in releases:
         i += 1
-        r = q.getReleaseById(album.release.id, include)
-        various = not r.isSingleArtistRelease()
+        various = not album.release.isSingleArtistRelease()
 
         if various and not seen_various:
             seen_various = True
             tags_file('candidate-tags-0v', trackcount, True)
 
         tags_file('candidate-tags-' + str(i), trackcount, various,
-                  r.artist.name, r.title,
+                  album.release.artist.name, album.release.title,
                   album.release.getReleaseEventsAsDict(),
-                  r.tracks)
+                  q.getReleaseById(album.release.id, include).tracks)
+
+        cover_art(str(i), album.release.asin)
 
 def rip(device, trackcount, single_file):
     if device == None:
         device = '/dev/cdrom'
 
-    argv = ['cdparanoia', '-d', device]
+    argv = ['cdparanoia', '-d', device, '1-' + str(trackcount)]
 
     if single_file:
-        argv.extend(['1-' + str(trackcount), 'wav'])
+        argv.append('wav')
     else:
         argv.append('-B')
 
@@ -187,11 +193,26 @@ def make_post_processor(command):
     c(fp.write, command +' "$@"\n')
     c(fp.close)
 
+def releases_by_disc(q, disc):
+    filter = musicbrainz2.webservice.ReleaseFilter(discId=disc.getId())
+    return q.getReleases(filter)
+
+def releases_by(q, title, artist=None):
+    r = q.getReleases(musicbrainz2.webservice.ReleaseFilter(title=title))
+    if 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]
+
 def main(argv):
     # Control the exit code for any uncaught exceptions.
     try:
         parser = OptionParser()
         parser.disable_interspersed_args()
+        parser.add_option('--artist')
+        parser.add_option('--title')
         parser.add_option('-d', '--device')
         parser.add_option('-m', '--no-musicbrainz',
                           action='store_true', default=False)
@@ -222,11 +243,21 @@ def main(argv):
 
         make_post_processor(options.post_processor)
 
-        disc = musicbrainz2.disc.readDisc(device)
-
-        trackcount = mkcue(disc, trackcount)
-        tags(disc, trackcount, mb=not options.no_musicbrainz)
-        rip(device, trackcount, options.single_file)
+        q = musicbrainz2.webservice.Query()
+        if options.title != None:
+            releases = releases_by(q, options.title, options.artist)
+        else:
+            disc = musicbrainz2.disc.readDisc(device)
+            trackcount = mkcue(disc, trackcount)
+            if options.no_musicbrainz:
+                releases = []
+            else:
+                releases = releases_by_disc(q, disc)
+
+        tags(q, releases, trackcount)
+
+        if options.title == None:
+            rip(device, trackcount, options.single_file)
     except Exception, error:
         if isinstance(error, SystemExit):
             raise