-#! /usr/bin/env python2.4
+#!/usr/bin/python
"""
=head1 NAME
=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
=over 4
+=item B<--artist> I<artist> B<--title> I<title>
+
+Write candidate-tags files based on I<artist> and album I<title>.
+Useful if you've already ripped wav files with some other program and
+just need to set things up for B<fa-flacd>.
+
=item B<-d> [B<--device>] I<device>
Use I<device> as the CD-ROM device, instead of the default
"/dev/cdrom" or the environment variable CDDEV.
+=item B<-m> [B<--no-musicbrainz>]
+
+Don't connect to MusicBrainz, just write candidate-tags-0.
+
=item B<-p> [B<--post-processor>] I<post-processor>
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.
+=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.
+
=item B<-t> [B<--tracks>] I<track-count>
Archive only the first I<track-count> tracks. This is handy for
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=')
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:
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))
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.