]> diplodocus.org Git - flac-archive/blobdiff - fa-rip
1.1.3 has been out a while; uncomment --picture support.
[flac-archive] / fa-rip
diff --git a/fa-rip b/fa-rip
index 33fcc0d5ad65ad5cf2b8c58f001b9cb991769653..92b709dab3f0b73b71c6b385a18b1c5e76bc0817 100755 (executable)
--- a/fa-rip
+++ b/fa-rip
@@ -67,7 +67,7 @@ it under the same terms as Perl itself.
 
 ''' #' # python-mode is sucks
 
-import os, sys, tempfile, traceback
+import os, re, sys, tempfile, traceback
 from optparse import OptionParser
 import urllib
 
@@ -113,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
@@ -125,6 +125,8 @@ 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')
 
+    if len(tracks) > 0:
+        trackcount = min(trackcount, len(tracks))
     for i in xrange(1, trackcount + 1):
         try:
             track = tracks.pop(0)
@@ -133,8 +135,9 @@ 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)
 
@@ -144,21 +147,16 @@ def cover_art(i, asin):
     fp.write(urllib.urlopen(url).read())
     fp.close()
 
-def tags(disc, trackcount, mb=True):
+def tags(q, releases, trackcount):
     results = []
     seen_various = False
 
     tags_file('candidate-tags-0', trackcount, False)
 
-    if not mb:
-        return
-
     include = musicbrainz2.webservice.ReleaseIncludes(tracks=True)
-    q = musicbrainz2.webservice.Query()
-    filter = musicbrainz2.webservice.ReleaseFilter(discId=disc.getId())
 
     i = 0
-    for album in q.getReleases(filter):
+    for album in releases:
         i += 1
         various = not album.release.isSingleArtistRelease()
 
@@ -195,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)
@@ -230,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