Esempio n. 1
0
	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)
Esempio n. 2
0
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