refactored artist.py, fixed a small bug in geo.py

This commit is contained in:
Abhinav Sarkar 2008-07-24 21:37:49 +00:00
parent 1d81a1a4fb
commit fc17093aa4
3 changed files with 66 additions and 46 deletions

View File

@ -240,7 +240,7 @@ class Api(object):
def fetchData(self, params, parse = True): def fetchData(self, params, parse = True):
params.update({'api_key': self.__apiKey}) params.update({'api_key': self.__apiKey})
xml = self._fetchUrl(Api.API_ROOT_URL, params) xml = self._fetchUrl(Api.API_ROOT_URL, params)
#print xml
data = ElementTree.XML(xml) data = ElementTree.XML(xml)
if data.get('status') != "ok": if data.get('status') != "ok":
raise LastfmError("Error code: %s (%s)" % (data.find("error").get('code'), data.findtext('error'))) raise LastfmError("Error code: %s (%s)" % (data.find("error").get('code'), data.findtext('error')))

View File

@ -47,18 +47,28 @@ class Artist(LastfmBase):
return self.__name return self.__name
def getMbid(self): def getMbid(self):
if self.__mbid is None:
self.fillInfo()
return self.__mbid return self.__mbid
def getUrl(self): def getUrl(self):
if self.__url is None:
self.fillInfo()
return self.__url return self.__url
def getImage(self): def getImage(self):
if self.__image is None:
self.fillInfo()
return self.__image return self.__image
def getStreamable(self): def getStreamable(self):
if self.__streamable is None:
self.fillInfo()
return self.__streamable return self.__streamable
def getStats(self): def getStats(self):
if self.__stats is None:
self.fillInfo()
return self.__stats return self.__stats
def getSimilar(self, limit = None): def getSimilar(self, limit = None):
@ -103,6 +113,8 @@ class Artist(LastfmBase):
return self.__topTags return self.__topTags
def getBio(self): def getBio(self):
if self.__bio is None:
self.fillInfo()
return self.__bio return self.__bio
name = property(getName, None, None, "Name's Docstring") name = property(getName, None, None, "Name's Docstring")
@ -280,9 +292,8 @@ class Artist(LastfmBase):
] ]
) )
@staticmethod @staticmethod
def getInfo(api, def fetchData(api,
artist = None, artist = None,
mbid = None): mbid = None):
params = {'method': 'artist.getinfo'} params = {'method': 'artist.getinfo'}
@ -292,47 +303,56 @@ class Artist(LastfmBase):
params.update({'artist': artist}) params.update({'artist': artist})
elif mbid: elif mbid:
params.update({'mbid': mbid}) params.update({'mbid': mbid})
data = api.fetchData(params).find('artist') return api.fetchData(params).find('artist')
return Artist( def fillInfo(self):
api, data = Artist.fetchData(self.__api, self.name)
name = data.findtext('name'), self.__name = data.findtext('name'),
mbid = data.findtext('mbid'), self.__mbid = data.findtext('mbid'),
url = data.findtext('url'), self.__url = data.findtext('url'),
image = dict([(i.get('size'), i.text) for i in data.findall('image')]), self.__image = dict([(i.get('size'), i.text) for i in data.findall('image')]),
streamable = (data.findtext('streamable') == 1), self.__streamable = (data.findtext('streamable') == 1),
stats = Stats( self.__stats = Stats(
subject = artist, subject = self,
listeners = int(data.findtext('stats/listeners')), listeners = int(data.findtext('stats/listeners')),
playcount = int(data.findtext('stats/plays')) playcount = int(data.findtext('stats/playcount'))
), ),
similar = [ self.__similar = [
Artist( Artist(
api, self.__api,
name = a.findtext('name'), name = a.findtext('name'),
url = a.findtext('url'), url = a.findtext('url'),
image = dict([(i.get('size'), i.text) for i in a.findall('image')]) image = dict([(i.get('size'), i.text) for i in a.findall('image')])
) )
for a in data.findall('similar/artist') for a in data.findall('similar/artist')
], ],
topTags = [ self.__topTags = [
Tag( Tag(
api, self.__api,
name = t.findtext('name'), name = t.findtext('name'),
url = t.findtext('url') url = t.findtext('url')
) )
for t in data.findall('tags/tag') for t in data.findall('tags/tag')
], ],
bio = Bio( self.__bio = Bio(
artist, self,
published = datetime(*(time.strptime( published = datetime(*(time.strptime(
data.findtext('bio/published').strip(), data.findtext('bio/published').strip(),
'%a, %d %b %Y %H:%M:%S +0000' '%a, %d %b %Y %H:%M:%S +0000'
)[0:6])), )[0:6])),
summary = data.findtext('bio/summary'), summary = data.findtext('bio/summary'),
content = data.findtext('bio/content') content = data.findtext('bio/content')
) )
)
@staticmethod
def getInfo(api,
artist = None,
mbid = None):
data = Artist.fetchData(api, artist, mbid)
a = Artist(api, name = data.findtext('name'))
a.fillInfo()
return a
@staticmethod @staticmethod
def hashFunc(*args, **kwds): def hashFunc(*args, **kwds):

View File

@ -282,7 +282,7 @@ class Country(LastfmBase):
topArtists = property(getTopArtists, None, None, "Docstring") topArtists = property(getTopArtists, None, None, "Docstring")
topArtist = property( topArtist = property(
lambda self: len(self.topArtists) and self.topArtists[0], lambda self: len(self.topArtists) and self.topArtists[0] or None,
None, None, "Docstring" None, None, "Docstring"
) )
@ -290,7 +290,7 @@ class Country(LastfmBase):
return Geo.getTopTracks(self.__api, self.name) return Geo.getTopTracks(self.__api, self.name)
topTracks = property(getTopTracks, None, None, "Docstring") topTracks = property(getTopTracks, None, None, "Docstring")
topTrack = property(lambda self: len(self.topTracks) and self.topTracks[0], topTrack = property(lambda self: len(self.topTracks) and self.topTracks[0] or None,
None, None, "Docstring") None, None, "Docstring")
@staticmethod @staticmethod