def testSubmitCdStub(self): from musicbrainz2.model import Disc, CDStub ws = FakeWebService() q = Query(ws, clientId='test-1') discid = "6EmGGSLhuDYz2lNXtqrCiCCqO0o-" disc = Disc(discid) disc.firstTrackNum = 1 disc.lastTrackNum = 4 disc.sectors = 89150 disc.addTrack( (150, 20551) ) disc.addTrack( (20701, 26074) ) disc.addTrack( (46775, 19438) ) disc.addTrack( (66213, 22937) ) cdstub = CDStub(disc) cdstub.artist = "artist" cdstub.title = "title" cdstub.addTrack("trackname1") cdstub.addTrack("trackname2") cdstub.addTrack("trackname3") cdstub.addTrack("trackname4") q.submitCDStub(cdstub) cdstub.barcode = "12345" cdstub.comment = "acomment" q.submitCDStub(cdstub) self.assertEquals(len(ws.data), 2) req = ws.data[0] qstring = 'client=test-1&discid=6EmGGSLhuDYz2lNXtqrCiCCqO0o-&title=title&artist=artist&track0=trackname1&track1=trackname2&track2=trackname3&track3=trackname4&toc=1+4+89150+150+20701+46775+66213' self.assertEquals(req[0], 'release') self.assertEquals(req[2], qstring) req = ws.data[1] qstring = 'client=test-1&discid=6EmGGSLhuDYz2lNXtqrCiCCqO0o-&title=title&artist=artist&barcode=12345&comment=acomment&track0=trackname1&track1=trackname2&track2=trackname3&track3=trackname4&toc=1+4+89150+150+20701+46775+66213' self.assertEquals(req[2], qstring) cdstub._tracks = [] cdstub.addTrack("tname1", "artist1") cdstub.addTrack("tname2", "artist2") cdstub.addTrack("tname3", "artist3") cdstub.addTrack("tname4", "artist4") q.submitCDStub(cdstub) self.assertEquals(len(ws.data), 3) req = ws.data[2] qstring = 'client=test-1&discid=6EmGGSLhuDYz2lNXtqrCiCCqO0o-&title=title&artist=artist&barcode=12345&comment=acomment&track0=tname1&artist0=artist1&track1=tname2&artist1=artist2&track2=tname3&artist2=artist3&track3=tname4&artist3=artist4&toc=1+4+89150+150+20701+46775+66213' self.assertEquals(req[2], qstring)
def readDisc(deviceName=None): """Reads an Audio CD in the disc drive. This reads a CD's table of contents (TOC) and calculates the MusicBrainz DiscID, which is a 28 character ASCII string. This DiscID can be used to retrieve a list of matching releases from the web service (see L{musicbrainz2.webservice.Query}). Note that an Audio CD has to be in drive for this to work. The C{deviceName} argument may be used to set the device. The default depends on the operating system (on linux, it's C{'/dev/cdrom'}). No network connection is needed for this function. If the device doesn't exist or there's no valid Audio CD in the drive, a L{DiscError} exception is raised. @param deviceName: a string containing the CD drive's device name @return: a L{musicbrainz2.model.Disc} object @raise DiscError: if there was a problem reading the disc @raise NotImplementedError: if DiscID generation isn't supported """ libDiscId = _openLibrary() handle = libDiscId.discid_new() assert handle != 0, "libdiscid: discid_new() returned NULL" # Access the CD drive. This also works if deviceName is None because # ctypes passes a NULL pointer in this case. # res = libDiscId.discid_read(handle, deviceName) if res == 0: raise DiscError(libDiscId.discid_get_error_msg(handle)) # Now extract the data from the result. # disc = Disc() disc.setId( libDiscId.discid_get_id(handle) ) firstTrackNum = libDiscId.discid_get_first_track_num(handle) lastTrackNum = libDiscId.discid_get_last_track_num(handle) disc.setSectors(libDiscId.discid_get_sectors(handle)) for i in range(firstTrackNum, lastTrackNum+1): trackOffset = libDiscId.discid_get_track_offset(handle, i) trackSectors = libDiscId.discid_get_track_length(handle, i) disc.addTrack( (trackOffset, trackSectors) ) disc.setFirstTrackNum(firstTrackNum) disc.setLastTrackNum(lastTrackNum) libDiscId.discid_free(handle) return disc