[mb-commits] r9714 - in python-musicbrainz2/trunk: examples src/musicbrainz2 test
root at musicbrainz.org
root at musicbrainz.org
Sat Mar 1 09:05:49 UTC 2008
Author: matt
Date: 2008-03-01 09:05:48 +0000 (Sat, 01 Mar 2008)
New Revision: 9714
Modified:
python-musicbrainz2/trunk/examples/README.txt
python-musicbrainz2/trunk/examples/folksonomytags.py
python-musicbrainz2/trunk/src/musicbrainz2/utils.py
python-musicbrainz2/trunk/src/musicbrainz2/webservice.py
python-musicbrainz2/trunk/test/test_utils.py
python-musicbrainz2/trunk/test/test_ws_query.py
Log:
Changed getUserTags()/submitUserTags() to accept only absolute URIs.
Added a utility function for extracting the entity type from an absolute URI.
Minor cosmetic changes to the example script.
Modified: python-musicbrainz2/trunk/examples/README.txt
===================================================================
--- python-musicbrainz2/trunk/examples/README.txt 2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/examples/README.txt 2008-03-01 09:05:48 UTC (rev 9714)
@@ -18,6 +18,9 @@
findlabel.py
Search MusicBrainz for a label matching the given label name.
+ folksonomytags.py
+ Get and submit MusicBrainz folksonomy tags for a given entity.
+
getartist.py
Retrieve an artist using a MusicBrainz ID and display all officially
released albums.
Modified: python-musicbrainz2/trunk/examples/folksonomytags.py
===================================================================
--- python-musicbrainz2/trunk/examples/folksonomytags.py 2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/examples/folksonomytags.py 2008-03-01 09:05:48 UTC (rev 9714)
@@ -26,14 +26,10 @@
username = raw_input('Username: ')
password = getpass.getpass('Password: ')
-# Ask for an entity type to tag.
-entity = raw_input('Entity type to tag (artist, release, track or label): ')
-
# Ask for a MBID to tag.
-id_ = raw_input('Enter a MBID: ')
-mbid = extractUuid(id_)
+mbid = raw_input('Enter an absolute MB ID: ')
-# Set the authentication for the webservice.
+# Set the authentication for the webservice (only needed for tag submission).
service = mbws.WebService(host=MB_HOST, username=username, password=password)
# Create a new Query object which will provide
@@ -41,14 +37,18 @@
query = mbws.Query(service)
# Read and print the current tags for the given MBID
-tags = query.getUserTags(entity, mbid)
+tags = query.getUserTags(mbid)
print
print 'Current tags: '
print ', '.join([tag.value for tag in tags])
+
# Ask the user for new tags and submit them
tag_str = raw_input('Enter new tags: ')
-new_tags = [Tag(tag) for tag in tag_str.split(',')]
-query.submitUserTags(entity, mbid, new_tags)
+new_tags = [Tag(tag.strip()) for tag in tag_str.split(',')]
-print 'Tags applied'
+query.submitUserTags(mbid, new_tags)
+
+print 'Tags submitted.'
+
+# EOF
Modified: python-musicbrainz2/trunk/src/musicbrainz2/utils.py
===================================================================
--- python-musicbrainz2/trunk/src/musicbrainz2/utils.py 2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/src/musicbrainz2/utils.py 2008-03-01 09:05:48 UTC (rev 9714)
@@ -11,10 +11,16 @@
import os.path
__all__ = [
- 'extractUuid', 'extractFragment', 'getReleaseTypeName',
- 'getCountryName', 'getLanguageName', 'getScriptName',
+ 'extractUuid', 'extractFragment', 'extractEntityType',
+ 'getReleaseTypeName', 'getCountryName', 'getLanguageName',
+ 'getScriptName',
]
+
+# A pattern to split the path part of an absolute MB URI.
+PATH_PATTERN = '^/(artist|release|track|label)/([^/]*)$'
+
+
def extractUuid(uriStr, resType=None):
"""Extract the UUID part from a MusicBrainz identifier.
@@ -55,7 +61,7 @@
if scheme != 'http' or netloc != 'musicbrainz.org':
raise ValueError('%s is no MB ID.' % uriStr)
- m = re.match('^/(artist|release|track|label)/([^/]*)$', path)
+ m = re.match(PATH_PATTERN, path)
if m:
if resType is None:
@@ -98,7 +104,34 @@
raise ValueError("prefix doesn't match URI %s" % uriStr)
+def extractEntityType(uriStr):
+ """Returns the entity type an entity URI is referring to.
+ @param uriStr: a string containing an absolute entity URI
+
+ @return: a string containing 'artist', 'release', 'track', or 'label'
+
+ @raise ValueError: if the given URI is no valid MusicBrainz ID
+ """
+ if uriStr is None:
+ raise ValueError('None is no valid entity URI')
+
+ (scheme, netloc, path) = urlparse.urlparse(uriStr)[:3]
+
+ if scheme == '':
+ raise ValueError('%s is no absolute MB ID.' % uriStr)
+
+ if scheme != 'http' or netloc != 'musicbrainz.org':
+ raise ValueError('%s is no MB ID.' % uriStr)
+
+ m = re.match(PATH_PATTERN, path)
+
+ if m:
+ return m.group(1)
+ else:
+ raise ValueError('%s is no valid MB ID.' % uriStr)
+
+
def getReleaseTypeName(releaseType):
"""Returns the name of a release type URI.
Modified: python-musicbrainz2/trunk/src/musicbrainz2/webservice.py
===================================================================
--- python-musicbrainz2/trunk/src/musicbrainz2/webservice.py 2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/src/musicbrainz2/webservice.py 2008-03-01 09:05:48 UTC (rev 9714)
@@ -1070,53 +1070,58 @@
self._ws.post('track', '', encodedStr)
- def submitUserTags(self, entity, id_, tags):
+ def submitUserTags(self, entityUri, tags):
"""Submit folksonomy tags for an entity.
- @param entity: the entity type as a string ('artist', 'label',
- 'release' or 'track')
- @param id_: a string containing the entity's ID
+ @param entityUri: a string containing an absolute MB ID
@param tags: A list of either L{Tag <musicbrainz2.model.Tag>} objects
or strings
+ @raise ValueError: invalid entityUri
@raise ConnectionError: couldn't connect to server
@raise RequestError: invalid ID, entity or tags
@raise AuthenticationError: invalid user name and/or password
"""
- params = [
+ entity = mbutils.extractEntityType(entityUri)
+ uuid = mbutils.extractUuid(entityUri, entity)
+ params = (
('type', 'xml'),
('entity', entity),
- ('id', mbutils.extractUuid(id_, entity)),
+ ('id', uuid),
('tags', ','.join([unicode(tag).encode('utf-8') for tag in tags]))
- ]
+ )
encodedStr = urllib.urlencode(params)
self._ws.post('tag', '', encodedStr)
- def getUserTags(self, entity, id_):
+ def getUserTags(self, entityUri):
"""Returns a list of folksonomy tags a user has applied to an entity.
+
+ The given parameter has to be a fully qualified MusicBrainz ID, as
+ returned by other library functions.
Note that this method only works if a valid user name and
password have been set. Only the tags the authenticated user
applied to the entity will be returned. If username and/or
password are incorrect, an AuthenticationError is raised.
- This method will return a list of L{Tag <musicbrainz2.model.Tag>} objects.
+ This method will return a list of L{Tag <musicbrainz2.model.Tag>}
+ objects.
- @param entity: the entity type as a string ('artist', 'label',
- 'release' or 'track')
- @param id_: a string containing the entity's ID
+ @param entityUri: a string containing an absolute MB ID
+ @raise ValueError: invalid entityUri
@raise ConnectionError: couldn't connect to server
@raise RequestError: invalid ID or entity
@raise AuthenticationError: invalid user name and/or password
"""
- uuid = mbutils.extractUuid(id_, entity)
- params = { 'entity': entity, 'id': id_ }
+ entity = mbutils.extractEntityType(entityUri)
+ uuid = mbutils.extractUuid(entityUri, entity)
+ params = { 'entity': entity, 'id': uuid }
- stream = self._ws.get('tag', uuid, filter=params)
+ stream = self._ws.get('tag', '', filter=params)
try:
parser = MbXmlParser()
result = parser.parse(stream)
Modified: python-musicbrainz2/trunk/test/test_utils.py
===================================================================
--- python-musicbrainz2/trunk/test/test_utils.py 2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/test/test_utils.py 2008-03-01 09:05:48 UTC (rev 9714)
@@ -43,6 +43,32 @@
self.assertRaises(ValueError, u.extractFragment, uri, prefix)
+ def testExtractEntityType(self):
+ prefix = 'http://musicbrainz.org'
+ uuid = 'c0b2500e-0cef-4130-869d-732b23ed9df5'
+
+ mbid1 = prefix + '/artist/' + uuid
+ self.assertEquals(u.extractEntityType(mbid1), 'artist')
+
+ mbid2 = prefix + '/release/' + uuid
+ self.assertEquals(u.extractEntityType(mbid2), 'release')
+
+ mbid3 = prefix + '/track/' + uuid
+ self.assertEquals(u.extractEntityType(mbid3), 'track')
+
+ mbid4 = prefix + '/label/' + uuid
+ self.assertEquals(u.extractEntityType(mbid4), 'label')
+
+ mbid5 = prefix + '/invalid/' + uuid
+ self.assertRaises(ValueError, u.extractEntityType, mbid5)
+
+ self.assertRaises(ValueError, u.extractEntityType, None)
+ self.assertRaises(ValueError, u.extractEntityType, uuid)
+
+ invalidUri = 'http://example.invalid/foo'
+ self.assertRaises(ValueError, u.extractEntityType, invalidUri)
+
+
def testGetCountryName(self):
self.assertEquals(u.getCountryName('DE'), 'Germany')
self.assertEquals(u.getCountryName('FR'), 'France')
Modified: python-musicbrainz2/trunk/test/test_ws_query.py
===================================================================
--- python-musicbrainz2/trunk/test/test_ws_query.py 2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/test/test_ws_query.py 2008-03-01 09:05:48 UTC (rev 9714)
@@ -20,8 +20,13 @@
q = Query(ws)
t1 = [u"foo", u"bar", u"f\u014do"]
t2 = [Tag(u"foo"), Tag(u"bar"), Tag(u"f\u014do")]
- q.submitUserTags("artist", "c0b2500e-0cef-4130-869d-732b23ed9df5", t1)
- q.submitUserTags("artist", "c0b2500e-0cef-4130-869d-732b23ed9df5", t2)
+
+ prefix = 'http://musicbrainz.org/artist/'
+ uri = prefix + 'c0b2500e-0cef-4130-869d-732b23ed9df5'
+
+ q.submitUserTags(uri, t1)
+ q.submitUserTags(uri, t2)
+
self.assertEquals(len(ws.data), 2)
self.assertEquals(ws.data[0], ws.data[1])
More information about the MusicBrainz-commits
mailing list