"""
Search and submit data to the MusicBrainz database
The MusicBrainz client library serves as a tool to allow developers to
integrate MusicBrainz searches and metadata exchange functionality into
their applications.
The client library includes the following features:
* Lookup Audio CD metadata using CD Index diskids
* Calculate Relatable TRM acoustic fingerprints
* Search for artist/album/track titles
* Lookup metadata by name, TRM ids or MusicBrainz Ids
See http://mm.musicbrainz.org/client_howto.html for more info
"""
__version__ = "2.1.5"
import os, types, sys
from ctypes import *
class MusicBrainzError(Exception):
pass
Error = MusicBrainzError
def _openLibrary(libName, version):
"""Opens a library using the ctypes cdll loader.
The dynamic linker (ld.so on Un*x systems) is used to load the library,
so it has to be in the linker search path. On some systems, such as
Linux, the search path can be influenced using the C{LD_LIBRARY_PATH}
environement variable.
@param libName: library name without 'lib' prefix or version number
@param version: a string containing a version number
@return: a C{ctypes.CDLL} object, representing the opened library
@raise NotImplementedError: if the library can't be opened
"""
# This only works for ctypes >= 0.9.9.3. Any library with the given
# name and version number is found, no matter how it's called on this
# platform.
try:
if hasattr(cdll, 'load_version'):
if sys.platform == 'win32':
lib = cdll.load('lib%s' % (libName,))
else:
lib = cdll.load_version(libName, version)
return lib
except OSError, e:
raise NotImplementedError('Error opening library: ' + str(e))
# For compatibility with ctypes < 0.9.9.3 try to figure out the library
# name without the help of ctypes. We use cdll.LoadLibrary() below,
# which isn't available for ctypes == 0.9.9.3.
#
if sys.platform == 'linux2':
fullName = 'lib%s.so.%s' % (libName, version)
elif sys.platform == 'darwin':
fullName = 'lib%s.%s.dylib' % (libName, version)
elif sys.platform == 'win32':
fullName = 'lib%s.dll' % (libName,)
else:
# This should at least work for Un*x-style operating systems
fullName = 'lib%s.so.%s' % (libName, version)
try:
lib = cdll.LoadLibrary(fullName)
return lib
except OSError, e:
raise NotImplementedError('Error opening library: ' + str(e))
assert False # not reached
try:
mbdll = _openLibrary('musicbrainz', '4')
except NotImplementedError, e:
raise MusicBrainzError(str(e))
if sys.platform == 'win32':
mbdll.mb_WSAInit.argtypes = [c_void_p]
mbdll.mb_WSAStop.argtypes = [c_void_p]
class mb:
mbdll.mb_New.argtypes = []
mbdll.mb_New.restype = c_void_p
mbdll.mb_UseUTF8.argtypes = [c_void_p, c_int]
def __init__(self):
self.mb = mbdll.mb_New();
# for ctypes 0.9.6
if not isinstance(self.mb, c_void_p):
self.mb = c_void_p(self.mb)
mbdll.mb_UseUTF8(self.mb, True)
# need to hold ref for __del__ to work
self.mbdll = mbdll
if sys.platform == "win32":
mbdll.mb_WSAInit(self.mb)
# Parse http_proxy environment variable
if os.environ.has_key('http_proxy'):
from urlparse import urlparse
netloc = urlparse(os.environ['http_proxy'])[1]
if ':' in netloc:
host, port = netloc.split(':')
port = int(port)
else:
host = netloc
port = 80
if host:
self.SetProxy(host, port)
mbdll.mb_Delete.argtypes = [c_void_p]
def __del__(self):
if sys.platform == "win32":
self.mbdll.mb_WSAStop(self.mb)
self.mbdll.mb_Delete(self.mb)
self.mbdll = None
mbdll.mb_SetDepth.argtypes = [c_void_p, c_int]
def SetDepth(self, depth):
mbdll.mb_SetDepth(self.mb, depth)
mbdll.mb_GetVersion.argtypes = [c_void_p, c_void_p, c_void_p, c_void_p]
def GetVersion(self):
major = c_int()
minor = c_int()
rev = c_int()
mbdll.mb_GetVersion(self.mb, byref(major), byref(minor), byref(rev))
return (major.value, minor.value, rev.value,)
mbdll.mb_SetServer.argtypes = [c_void_p, c_char_p, c_int]
def SetServer(self, addr, port):
if not mbdll.mb_SetServer(self.mb, addr, port):
raise Error("Could not set server to \"%s\", port %d" % (addr, port,))
mbdll.mb_SetDebug.argtypes = [c_void_p, c_int]
def SetDebug(self, debug):
mbdll.mb_SetDebug(self.mb, debug)
mbdll.mb_SetProxy.argtypes = [c_void_p, c_char_p, c_int]
def SetProxy(self, addr, port):
if not mbdll.mb_SetProxy(self.mb, c_char_p(addr), c_int(port)):
raise Error("Could not set proxy to \"%s\", port %d" % (addr, port,))
mbdll.mb_GetQueryError.argtypes = [c_void_p, c_char_p, c_int]
def GetQueryError(self):
BUFSIZE = 256
msg = c_buffer(BUFSIZE)
mbdll.mb_GetQueryError(self.mb, msg, BUFSIZE)
return msg.value
mbdll.mb_Authenticate.argtypes = [c_void_p, c_char_p, c_char_p]
def Authenticate(self, username, password):
if not mbdll.mb_Authenticate(self.mb, username, password):
raise Error("Authentication failed: %s" % self.GetQueryError())
mbdll.mb_SetDevice.argtypes = [c_void_p, c_char_p]
def SetDevice(self, device):
if not mbdll.mb_SetDevice(self.mb, device):
raise Error("Could not set the device to \"%s\"" % device)
mbdll.mb_SetMaxItems.argtypes = [c_void_p, c_int]
def SetMaxItems(self, maxitems):
mbdll.mb_SetMaxItems(self.mb, maxitems)
mbdll.mb_Query.argtypes = [c_void_p, c_char_p]
def Query(self, query):
if not mbdll.mb_Query(self.mb, query):
raise Error("Query failed: %s" % self.GetQueryError())
mbdll.mb_QueryWithArgs.argtypes = [c_void_p, c_char_p, c_void_p]
def QueryWithArgs(self, query, args):
if type(args) in types.StringTypes:
args = (args,)
arrayClass = c_char_p * (len(args) + 1)
ary = arrayClass()
for idx in xrange(len(args)):
if type(args[idx]) is types.UnicodeType:
ary[idx] = args[idx].encode('utf-8')
else:
ary[idx] = args[idx]
ary[len(args)] = None
if not mbdll.mb_QueryWithArgs(self.mb, query, ary):
raise Error("Query failed: %s" % self.GetQueryError())
mbdll.mb_GetWebSubmitURL.argtypes = [c_void_p, c_char_p, c_int]
def GetWebSubmitURL(self):
BUFSIZE = 1024
url = c_buffer(BUFSIZE)
if not mbdll.mb_GetWebSubmitURL(self.mb, url, BUFSIZE):
raise Error("GetWebSubmitURL failed")
return url.value
mbdll.mb_Select.argtypes = [c_void_p, c_char_p]
def Select(self, query):
return mbdll.mb_Select(self.mb, query)
mbdll.mb_Select1.argtypes = [c_void_p, c_char_p, c_int]
def Select1(self, query, ord):
return mbdll.mb_Select1(self.mb, query, ord)
mbdll.mb_SelectWithArgs.argtypes = [c_void_p, c_char_p, c_void_p]
def SelectWithArgs(self, query, args):
arrayClass = c_int * (len(args) + 1)
ary = arrayClass()
for idx in xrange(len(args)):
ary[idx] = args[idx]
ary[len(args)] = None
return mbdll.mb_Select(self.mb, query, args)
mbdll.mb_GetResultData.argtypes = [c_void_p, c_char_p, c_char_p, c_int]
def GetResultData(self, query):
BUFSIZE = 1024
data = c_buffer(BUFSIZE)
if not mbdll.mb_GetResultData(self.mb, query, data, BUFSIZE):
raise Error("Error in GetResultData")
return data.value.decode('utf-8')
mbdll.mb_GetResultData1.argtypes = [c_void_p, c_char_p, c_char_p, c_int, c_int]
def GetResultData1(self, query, ord):
BUFSIZE = 1024
data = c_char_p('\x00' * BUFSIZE)
if not mbdll.mb_GetResultData1(self.mb, query, data, BUFSIZE, ord):
raise Error("Error in GetResultData1")
return data.value.decode('utf-8')
mbdll.mb_DoesResultExist.argtypes = [c_void_p, c_char_p]
def DoesResultExist(self, query):
return mbdll.mb_DoesResultExist(self.mb, query)
mbdll.mb_DoesResultExist1.argtypes = [c_void_p, c_char_p, c_int]
def DoesResultExist1(self, query, ord):
return mbdll.mb_DoesResultExist1(self.mb, query, ord)
mbdll.mb_GetResultInt.argtypes = [c_void_p, c_char_p]
def GetResultInt(self, query):
return mbdll.mb_GetResultInt(self.mb, query)
mbdll.mb_GetResultInt1.argtypes = [c_void_p, c_char_p, c_int]
def GetResultInt1(self, query, ord):
return mbdll.mb_GetResultInt1(self.mb, query, ord)
mbdll.mb_GetResultRDF.argtypes = [c_void_p, c_char_p, c_int]
mbdll.mb_GetResultRDFLen.argtypes = [c_void_p]
def GetResultRDF(self):
BUFSIZE = mbdll.mb_GetResultRDFLen(self.mb)
data = c_buffer(BUFSIZE)
if not mbdll.mb_GetResultRDF(self.mb, data, BUFSIZE):
raise Error("Couldn't return RDF")
return data.value.decode('utf-8')
mbdll.mb_SetResultRDF.argtypes = [c_void_p, c_char_p]
def SetResultRDF(self, rdf):
if not mbdll.mb_SetResultRDF(self.mb, rdf):
raise Error("Couldn't set RDF")
mbdll.mb_GetIDFromURL.argtypes = [c_void_p, c_char_p, c_char_p, c_int]
def GetIDFromURL(self, url):
BUFSIZE = 256
ret = c_buffer(BUFSIZE)
mbdll.mb_GetIDFromURL(self.mb, url.encode('utf-8'), ret, BUFSIZE)
return ret.value
mbdll.mb_GetFragmentFromURL.argtypes = [c_void_p, c_char_p, c_char_p, c_int]
def GetFragmentFromURL(self, url):
BUFSIZE = 256
ret = c_buffer(BUFSIZE)
mbdll.mb_GetFragmentFromURL(self.mb, url.encode('utf-8'), ret, BUFSIZE)
return ret.value
mbdll.mb_GetOrdinalFromList.argtypes = [c_void_p, c_char_p, c_char_p]
def GetOrdinalFromList(self, resultList, url):
return mbdll.mb_GetOrdinalFromList(self.mb, resultList, url.encode('utf-8'))
mbdll.mb_GetMP3Info.argtypes = [c_void_p, c_char_p, c_void_p, c_void_p, c_void_p, c_void_p]
def GetMP3Info(self, fileName):
duration = c_int()
bitrate = c_int()
stereo = c_int()
samplerate = c_int()
ret = mbdll.mb_GetMP3Info(self.mb, fileName, byref(duration), byref(bitrate), byref(stereo), byref(samplerate))
if not ret:
raise Error("Couldn't examine mp3 file")
info = {}
info["duration"] = duration.value
info["bitrate"] = bitrate.value
info["stereo"] = stereo.value
info["samplerate"] = samplerate.value
return info
class trm:
mbdll.trm_New.argtypes = []
mbdll.trm_New.restype = c_void_p
def __init__(self):
self.trm = mbdll.trm_New()
# only used for __del__
self.mbdll = mbdll
mbdll.trm_Delete.argtypes = [c_void_p]
def __del__(self):
self.mbdll.trm_Delete(self.trm)
self.mbdll = None
mbdll.trm_SetProxy.argtypes = [c_void_p, c_char_p, c_int]
def SetProxy(self, addr, port):
if not mbdll.trm_SetProxy(self.trm, addr, port):
raise Error("Could not set proxy to \"%s\", port %d" % (addr, port,))
mbdll.trm_SetPCMDataInfo.argtypes = [c_void_p, c_int, c_int, c_int]
def SetPCMDataInfo(self, samplesPerSecond, numChannels, bitsPerSample):
mbdll.trm_SetPCMDataInfo(self.trm, samplesPerSecond, numChannels, bitsPerSample)
mbdll.trm_GenerateSignature.argtypes = [c_void_p, c_char_p, c_int]
def GenerateSignature(self, data):
buf = c_buffer(len(data))
buf.raw = str(data)
return mbdll.trm_GenerateSignature(self.trm, buf, len(buf))
mbdll.trm_FinalizeSignature.argtypes = [c_void_p, c_char_p, c_char_p]
mbdll.trm_ConvertSigToASCII.argtypes = [c_void_p, c_char_p, c_char_p]
def FinalizeSignature(self):
sig = c_buffer(17)
mbdll.trm_FinalizeSignature(self.trm, sig, None)
asciiSig = c_buffer(37)
mbdll.trm_ConvertSigToASCII(self.trm, sig, asciiSig)
return asciiSig.value
mbdll.trm_SetSongLength.argtypes = [c_void_p, c_long]
def SetSongLength(self, seconds):
mbdll.trm_SetSongLength(self.trm, seconds)
### -------------- don't edit below this line -------------------- ###
# auto generated. run ./setup.py build_queries to update
MBE_AlbumGetAlbumArtistId = """\
http://purl.org/dc/elements/1.1/creator"""
MBE_AlbumGetAlbumArtistName = """\
http://purl.org/dc/elements/1.1/creator http://purl.org/dc/elements/1.1/title"""
MBE_AlbumGetAlbumArtistSortName = """\
http://purl.org/dc/elements/1.1/creator http://musicbrainz.org/mm/mm-2.1#sortName"""
MBE_AlbumGetAlbumId = """\
"""
MBE_AlbumGetAlbumName = """\
http://purl.org/dc/elements/1.1/title"""
MBE_AlbumGetAlbumStatus = """\
http://musicbrainz.org/mm/mm-2.1#releaseStatus"""
MBE_AlbumGetAlbumType = """\
http://musicbrainz.org/mm/mm-2.1#releaseType"""
MBE_AlbumGetAmazonAsin = """\
http://www.amazon.com/gp/aws/landing.html#Asin"""
MBE_AlbumGetArtistId = """\
http://musicbrainz.org/mm/mm-2.1#trackList [] http://purl.org/dc/elements/1.1/creator"""
MBE_AlbumGetArtistName = """\
http://musicbrainz.org/mm/mm-2.1#trackList [] http://purl.org/dc/elements/1.1/creator http://purl.org/dc/elements/1.1/title"""
MBE_AlbumGetArtistSortName = """\
http://musicbrainz.org/mm/mm-2.1#trackList [] http://purl.org/dc/elements/1.1/creator http://musicbrainz.org/mm/mm-2.1#sortName"""
MBE_AlbumGetNumCdindexIds = """\
http://musicbrainz.org/mm/mm-2.1#cdindexidList [COUNT]"""
MBE_AlbumGetCdindexId = """\
http://musicbrainz.org/mm/mm-2.1#cdindexidList []"""
MBE_AlbumGetNumReleaseDates = """\
http://musicbrainz.org/mm/mm-2.1#releaseDateList [COUNT]"""
MBE_AlbumGetNumTracks = """\
http://musicbrainz.org/mm/mm-2.1#trackList [COUNT]"""
MBE_AlbumGetTrackDuration = """\
http://musicbrainz.org/mm/mm-2.1#trackList [] http://musicbrainz.org/mm/mm-2.1#duration"""
MBE_AlbumGetTrackId = """\
http://musicbrainz.org/mm/mm-2.1#trackList []"""
MBE_AlbumGetTrackList = """\
http://musicbrainz.org/mm/mm-2.1#trackList"""
MBE_AlbumGetTrackName = """\
http://musicbrainz.org/mm/mm-2.1#trackList [] http://purl.org/dc/elements/1.1/title"""
MBE_AlbumGetTrackNum = """\
http://musicbrainz.org/mm/mm-2.1#trackList [?] http://musicbrainz.org/mm/mm-2.1#trackNum"""
MBE_ArtistGetAlbumId = """\
http://musicbrainz.org/mm/mm-2.1#albumList []"""
MBE_ArtistGetAlbumName = """\
http://musicbrainz.org/mm/mm-2.1#albumList [] http://purl.org/dc/elements/1.1/title"""
MBE_ArtistGetArtistId = """\
"""
MBE_ArtistGetArtistName = """\
http://purl.org/dc/elements/1.1/title"""
MBE_ArtistGetArtistSortName = """\
http://musicbrainz.org/mm/mm-2.1#sortName"""
MBE_AuthGetChallenge = """\
http://musicbrainz.org/mm/mq-1.1#authChallenge"""
MBE_AuthGetSessionId = """\
http://musicbrainz.org/mm/mq-1.1#sessionId"""
MBE_GetError = """\
http://musicbrainz.org/mm/mq-1.1#error"""
MBE_GetNumAlbums = """\
http://musicbrainz.org/mm/mm-2.1#albumList [COUNT]"""
MBE_GetNumArtists = """\
http://musicbrainz.org/mm/mm-2.1#artistList [COUNT]"""
MBE_GetNumLookupResults = """\
http://musicbrainz.org/mm/mq-1.1#lookupResultList [COUNT]"""
MBE_GetNumTracks = """\
http://musicbrainz.org/mm/mm-2.1#trackList [COUNT]"""
MBE_GetNumTrmids = """\
http://musicbrainz.org/mm/mm-2.1#trmidList [COUNT]"""
MBE_GetStatus = """\
http://musicbrainz.org/mm/mq-1.1#status"""
MBE_LookupGetAlbumArtistId = """\
http://musicbrainz.org/mm/mq-1.1#album http://purl.org/dc/elements/1.1/creator"""
MBE_LookupGetAlbumId = """\
http://musicbrainz.org/mm/mq-1.1#album"""
MBE_LookupGetArtistId = """\
http://musicbrainz.org/mm/mq-1.1#artist"""
MBE_LookupGetRelevance = """\
http://musicbrainz.org/mm/mq-1.1#relevance"""
MBE_LookupGetTrackArtistId = """\
http://musicbrainz.org/mm/mq-1.1#track http://purl.org/dc/elements/1.1/creator"""
MBE_LookupGetTrackId = """\
http://musicbrainz.org/mm/mq-1.1#track"""
MBE_LookupGetType = """\
http://www.w3.org/1999/02/22-rdf-syntax-ns#type"""
MBE_QuerySubject = """\
http://musicbrainz.org/mm/mq-1.1#Result"""
MBE_QuickGetAlbumName = """\
http://musicbrainz.org/mm/mq-1.1#albumName"""
MBE_QuickGetArtistId = """\
http://musicbrainz.org/mm/mm-2.1#artistid"""
MBE_QuickGetArtistName = """\
http://musicbrainz.org/mm/mq-1.1#artistName"""
MBE_QuickGetArtistSortName = """\
http://musicbrainz.org/mm/mm-2.1#sortName"""
MBE_QuickGetTrackDuration = """\
http://musicbrainz.org/mm/mm-2.1#duration"""
MBE_QuickGetTrackId = """\
http://musicbrainz.org/mm/mm-2.1#trackid"""
MBE_QuickGetTrackName = """\
http://musicbrainz.org/mm/mq-1.1#trackName"""
MBE_QuickGetTrackNum = """\
http://musicbrainz.org/mm/mm-2.1#trackNum"""
MBE_ReleaseGetCountry = """\
http://musicbrainz.org/mm/mm-2.1#country"""
MBE_ReleaseGetDate = """\
http://purl.org/dc/elements/1.1/date"""
MBE_TOCGetCDIndexId = """\
http://musicbrainz.org/mm/mm-2.1#cdindexid"""
MBE_TOCGetFirstTrack = """\
http://musicbrainz.org/mm/mm-2.1#firstTrack"""
MBE_TOCGetLastTrack = """\
http://musicbrainz.org/mm/mm-2.1#lastTrack"""
MBE_TOCGetTrackNumSectors = """\
http://musicbrainz.org/mm/mm-2.1#toc [] http://musicbrainz.org/mm/mm-2.1#numSectors"""
MBE_TOCGetTrackSectorOffset = """\
http://musicbrainz.org/mm/mm-2.1#toc [] http://musicbrainz.org/mm/mm-2.1#sectorOffset"""
MBE_TrackGetArtistId = """\
http://purl.org/dc/elements/1.1/creator"""
MBE_TrackGetArtistName = """\
http://purl.org/dc/elements/1.1/creator http://purl.org/dc/elements/1.1/title"""
MBE_TrackGetArtistSortName = """\
http://purl.org/dc/elements/1.1/creator http://musicbrainz.org/mm/mm-2.1#sortName"""
MBE_TrackGetTrackDuration = """\
http://musicbrainz.org/mm/mm-2.1#duration"""
MBE_TrackGetTrackId = """\
"""
MBE_TrackGetTrackName = """\
http://purl.org/dc/elements/1.1/title"""
MBE_TrackGetTrackNum = """\
http://musicbrainz.org/mm/mm-2.1#trackNum"""
MBE_GetRelationshipType = """\
http://www.w3.org/1999/02/22-rdf-syntax-ns#type"""
MBE_GetRelationshipDirection = """\
http://musicbrainz.org/ar/ar-1.0#direction"""
MBE_GetRelationshipArtistId = """\
http://musicbrainz.org/ar/ar-1.0#toArtist"""
MBE_GetRelationshipArtistName = """\
http://musicbrainz.org/ar/ar-1.0#toArtist http://purl.org/dc/elements/1.1/title"""
MBE_GetRelationshipAlbumId = """\
http://musicbrainz.org/ar/ar-1.0#toAlbum"""
MBE_GetRelationshipAlbumName = """\
http://musicbrainz.org/ar/ar-1.0#toAlbum http://purl.org/dc/elements/1.1/title"""
MBE_GetRelationshipTrackId = """\
http://musicbrainz.org/ar/ar-1.0#toTrack"""
MBE_GetRelationshipTrackName = """\
http://musicbrainz.org/ar/ar-1.0#toTrack http://purl.org/dc/elements/1.1/title"""
MBE_GetRelationshipURL = """\
http://musicbrainz.org/ar/ar-1.0#toUrl"""
MBE_GetRelationshipAttribute = """\
http://musicbrainz.org/ar/ar-1.0#attributeList []"""
MBI_VARIOUS_ARTIST_ID = """\
89ad4ac3-39f7-470e-963a-56509c546377"""
MBQ_AssociateCD = """\
@CDINFOASSOCIATECD@"""
MBQ_Authenticate = """\
@1@
"""
MBQ_FileInfoLookup = """\
@1@
@2@
@3@
@4@
@5@
@6@
@7@
@8@
@9@
@10@
@MAX_ITEMS@
"""
MBQ_FindAlbumByName = """\
@DEPTH@
@MAX_ITEMS@
@1@
"""
MBQ_FindArtistByName = """\
@DEPTH@
@1@
@MAX_ITEMS@
"""
MBQ_FindDistinctTRMId = """\
@DEPTH@
@1@
@2@
"""
MBQ_FindTrackByName = """\
@DEPTH@
@MAX_ITEMS@
@1@
"""
MBQ_GetAlbumById = """\
http://@URL@/mm-2.1/album/@1@/@DEPTH@"""
MBQ_GetArtistById = """\
http://@URL@/mm-2.1/artist/@1@/@DEPTH@"""
MBQ_GetCDInfo = """\
@CDINFO@"""
MBQ_GetCDInfoFromCDIndexId = """\
@DEPTH@
@1@
"""
MBQ_GetCDTOC = """\
@LOCALCDINFO@"""
MBQ_GetTrackById = """\
http://@URL@/mm-2.1/track/@1@/@DEPTH@"""
MBQ_GetTrackByTRMId = """\
http://@URL@/mm-2.1/trmid/@1@/@DEPTH@"""
MBQ_QuickTrackInfoFromTrackId = """\
@1@
@2@
"""
MBQ_SubmitTrack = """\
@1@
@2@
@3@
@4@
@5@
@6@
@7@
@8@
@9@
@10@
@SESSID@
@SESSKEY@
"""
MBQ_SubmitTrackTRMId = """\
@1@
@2@
@SESSID@
@SESSKEY@
@CLIENTVER@
"""
MBQ_TrackInfoFromTRMId = """\
@1@
@2@
@3@
@4@
@5@
@6@
"""
MBQ_GetArtistRelationsById ="""\
http://@URL@/mm-2.1/artistrel/@1@"""
MBQ_GetAlbumRelationsById ="""\
http://@URL@/mm-2.1/albumrel/@1@"""
MBQ_GetTrackRelationsById ="""\
http://@URL@/mm-2.1/trackrel/@1@"""
MBS_Back = """\
[BACK]"""
MBS_Rewind = """\
[REWIND]"""
MBS_SelectAlbum = """\
http://musicbrainz.org/mm/mm-2.1#albumList []"""
MBS_SelectAlbumArtist = """\
http://purl.org/dc/elements/1.1/creator"""
MBS_SelectArtist = """\
http://musicbrainz.org/mm/mm-2.1#artistList []"""
MBS_SelectCdindexid = """\
http://musicbrainz.org/mm/mm-2.1#cdindexidList []"""
MBS_SelectLookupResult = """\
http://musicbrainz.org/mm/mq-1.1#lookupResultList []"""
MBS_SelectLookupResultAlbum = """\
http://musicbrainz.org/mm/mq-1.1#album"""
MBS_SelectLookupResultArtist = """\
http://musicbrainz.org/mm/mq-1.1#artist"""
MBS_SelectLookupResultTrack = """\
http://musicbrainz.org/mm/mq-1.1#track"""
MBS_SelectReleaseDate = """\
http://musicbrainz.org/mm/mm-2.1#releaseDateList []"""
MBS_SelectTrack = """\
http://musicbrainz.org/mm/mm-2.1#trackList []"""
MBS_SelectTrackAlbum = """\
http://musicbrainz.org/mm/mq-1.1#album"""
MBS_SelectTrackArtist = """\
http://purl.org/dc/elements/1.1/creator"""
MBS_SelectTrmid = """\
http://musicbrainz.org/mm/mm-2.1#trmidList []"""
MBS_SelectRelationship = """\
http://musicbrainz.org/ar/ar-1.0#relationshipList []"""