fixed a major bug in base module. made Registry class subscriptable. added stats in weeklyXXXChart classes.

This commit is contained in:
Abhinav Sarkar 2008-08-28 14:25:59 +00:00
parent 7683ad87c2
commit 9795b1f18f
8 changed files with 136 additions and 32 deletions

View File

@ -102,6 +102,7 @@ class Album(LastfmBase):
return [ return [
Tag( Tag(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
url = t.findtext('url') url = t.findtext('url')
) )
@ -143,6 +144,7 @@ class Album(LastfmBase):
self.__topTags = [ self.__topTags = [
Tag( Tag(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
url = t.findtext('url') url = t.findtext('url')
) )
@ -160,6 +162,7 @@ class Album(LastfmBase):
name = data.findtext('name'), name = data.findtext('name'),
artist = Artist( artist = Artist(
api, api,
subject = self,
name = data.findtext('artist'), name = data.findtext('artist'),
), ),
) )

View File

@ -92,6 +92,7 @@ class Artist(LastfmBase):
self.__similar = [ self.__similar = [
Artist( Artist(
self.__api, self.__api,
subject = self,
name = a.findtext('name'), name = a.findtext('name'),
mbid = a.findtext('mbid'), mbid = a.findtext('mbid'),
stats = Stats( stats = Stats(
@ -129,6 +130,7 @@ class Artist(LastfmBase):
self.__topTags = [ self.__topTags = [
Tag( Tag(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
url = t.findtext('url') url = t.findtext('url')
) )
@ -168,6 +170,7 @@ class Artist(LastfmBase):
return [ return [
Album( Album(
self.__api, self.__api,
subject = self,
name = a.findtext('name'), name = a.findtext('name'),
artist = self, artist = self,
mbid = a.findtext('mbid'), mbid = a.findtext('mbid'),
@ -195,6 +198,7 @@ class Artist(LastfmBase):
return [ return [
User( User(
self.__api, self.__api,
subject = self,
name = u.findtext('name'), name = u.findtext('name'),
url = u.findtext('url'), url = u.findtext('url'),
image = dict([(i.get('size'), i.text) for i in u.findall('image')]), image = dict([(i.get('size'), i.text) for i in u.findall('image')]),
@ -219,6 +223,7 @@ class Artist(LastfmBase):
return [ return [
Track( Track(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
artist = self, artist = self,
mbid = t.findtext('mbid'), mbid = t.findtext('mbid'),
@ -303,6 +308,7 @@ class Artist(LastfmBase):
self.__similar = [ self.__similar = [
Artist( Artist(
self.__api, self.__api,
subject = self,
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')])
@ -312,6 +318,7 @@ class Artist(LastfmBase):
self.__topTags = [ self.__topTags = [
Tag( Tag(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
url = t.findtext('url') url = t.findtext('url')
) )

View File

@ -16,6 +16,11 @@ class LastfmBase(object):
_lock = Lock() _lock = Lock()
def __new__(cls, *args, **kwds): def __new__(cls, *args, **kwds):
subject = None
if 'subject' in kwds and not cls.__name__.startswith('Weekly'):
subject = kwds['subject']
del kwds['subject']
if 'bypassRegistry' in kwds: if 'bypassRegistry' in kwds:
del kwds['bypassRegistry'] del kwds['bypassRegistry']
inst = object.__new__(cls) inst = object.__new__(cls)
@ -23,6 +28,9 @@ class LastfmBase(object):
return inst return inst
key = cls.hashFunc(*args, **kwds) key = cls.hashFunc(*args, **kwds)
if subject is not None:
key = (hash(subject), key)
LastfmBase._lock.acquire() LastfmBase._lock.acquire()
try: try:
inst, alreadyRegistered = LastfmBase.register(object.__new__(cls), key) inst, alreadyRegistered = LastfmBase.register(object.__new__(cls), key)

View File

@ -19,15 +19,15 @@ from weeklychart import WeeklyAlbumChart, WeeklyArtistChart, WeeklyTrackChart
class Registry(object): class Registry(object):
"""The registry to contain all the entities""" """The registry to contain all the entities"""
keys = [Album, Artist, Event, Location, Country, Group, keys = [c.__name__ for c in [Album, Artist, Event, Location, Country, Group,
Playlist, Tag, Track, User, WeeklyAlbumChart, WeeklyArtistChart, WeeklyTrackChart] Playlist, Tag, Track, User, WeeklyAlbumChart, WeeklyArtistChart, WeeklyTrackChart]]
def get(self, name): def __getitem__(self, name):
if name not in Registry.keys: if name not in Registry.keys:
raise LastfmError("Key does not correspond to a valid class") raise LastfmError("Key does not correspond to a valid class")
else: else:
try: try:
vals = LastfmBase.registry[name].values() vals = LastfmBase.registry[eval(name)].values()
vals.sort() vals.sort()
return vals return vals
except KeyError: except KeyError:

View File

@ -53,6 +53,7 @@ class Tag(LastfmBase):
return [ return [
Tag( Tag(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
url = t.findtext('url'), url = t.findtext('url'),
streamable = (t.findtext('streamable') == "1"), streamable = (t.findtext('streamable') == "1"),
@ -73,9 +74,11 @@ class Tag(LastfmBase):
return [ return [
Album( Album(
self.__api, self.__api,
subject = self,
name = a.findtext('name'), name = a.findtext('name'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = a.findtext('artist/name'), name = a.findtext('artist/name'),
mbid = a.findtext('artist/mbid'), mbid = a.findtext('artist/mbid'),
url = a.findtext('artist/url'), url = a.findtext('artist/url'),
@ -105,6 +108,7 @@ class Tag(LastfmBase):
return [ return [
Artist( Artist(
self.__api, self.__api,
subject = self,
name = a.findtext('name'), name = a.findtext('name'),
mbid = a.findtext('mbid'), mbid = a.findtext('mbid'),
stats = Stats( stats = Stats(
@ -132,9 +136,11 @@ class Tag(LastfmBase):
return [ return [
Track( Track(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = t.findtext('artist/name'), name = t.findtext('artist/name'),
mbid = t.findtext('artist/mbid'), mbid = t.findtext('artist/mbid'),
url = t.findtext('artist/url'), url = t.findtext('artist/url'),

View File

@ -125,9 +125,11 @@ class Track(LastfmBase):
return [ return [
Track( Track(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = t.findtext('artist/name'), name = t.findtext('artist/name'),
mbid = t.findtext('artist/mbid'), mbid = t.findtext('artist/mbid'),
url = t.findtext('artist/url') url = t.findtext('artist/url')
@ -162,6 +164,7 @@ class Track(LastfmBase):
return [ return [
User( User(
self.__api, self.__api,
subject = self,
name = u.findtext('name'), name = u.findtext('name'),
url = u.findtext('url'), url = u.findtext('url'),
image = dict([(i.get('size'), i.text) for i in u.findall('image')]), image = dict([(i.get('size'), i.text) for i in u.findall('image')]),
@ -191,6 +194,7 @@ class Track(LastfmBase):
return [ return [
Tag( Tag(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
url = t.findtext('url'), url = t.findtext('url'),
stats = Stats( stats = Stats(

View File

@ -97,6 +97,7 @@ class User(LastfmBase):
return [ return [
User( User(
self.__api, self.__api,
subject = self,
name = u.findtext('name'), name = u.findtext('name'),
image = dict([(i.get('size'), i.text) for i in u.findall('image')]), image = dict([(i.get('size'), i.text) for i in u.findall('image')]),
url = u.findtext('url'), url = u.findtext('url'),
@ -118,6 +119,7 @@ class User(LastfmBase):
return [ return [
User( User(
self.__api, self.__api,
subject = self,
name = u.findtext('name'), name = u.findtext('name'),
image = {'medium': u.findtext('image')}, image = {'medium': u.findtext('image')},
url = u.findtext('url'), url = u.findtext('url'),
@ -151,9 +153,11 @@ class User(LastfmBase):
return [ return [
Track( Track(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = t.findtext('artist/name'), name = t.findtext('artist/name'),
mbid = t.findtext('artist/mbid'), mbid = t.findtext('artist/mbid'),
url = t.findtext('artist/url'), url = t.findtext('artist/url'),
@ -176,17 +180,21 @@ class User(LastfmBase):
return [ return [
Track( Track(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = t.findtext('artist'), name = t.findtext('artist'),
mbid = t.find('artist').attrib['mbid'], mbid = t.find('artist').attrib['mbid'],
), ),
album = Album( album = Album(
self.__api, self.__api,
subject = self,
name = t.findtext('album'), name = t.findtext('album'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = t.findtext('artist'), name = t.findtext('artist'),
mbid = t.find('artist').attrib['mbid'], mbid = t.find('artist').attrib['mbid'],
), ),
@ -225,9 +233,11 @@ class User(LastfmBase):
return [ return [
Album( Album(
self.__api, self.__api,
subject = self,
name = a.findtext('name'), name = a.findtext('name'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = a.findtext('artist/name'), name = a.findtext('artist/name'),
mbid = a.findtext('artist/mbid'), mbid = a.findtext('artist/mbid'),
url = a.findtext('artist/url'), url = a.findtext('artist/url'),
@ -263,6 +273,7 @@ class User(LastfmBase):
return [ return [
Artist( Artist(
self.__api, self.__api,
subject = self,
name = a.findtext('name'), name = a.findtext('name'),
mbid = a.findtext('mbid'), mbid = a.findtext('mbid'),
stats = Stats( stats = Stats(
@ -295,9 +306,11 @@ class User(LastfmBase):
return [ return [
Track( Track(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = t.findtext('artist/name'), name = t.findtext('artist/name'),
mbid = t.findtext('artist/mbid'), mbid = t.findtext('artist/mbid'),
url = t.findtext('artist/url'), url = t.findtext('artist/url'),
@ -333,6 +346,7 @@ class User(LastfmBase):
return [ return [
Tag( Tag(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
url = t.findtext('url'), url = t.findtext('url'),
stats = Stats( stats = Stats(
@ -486,9 +500,11 @@ class User(LastfmBase):
for a in data.findall('album'): for a in data.findall('album'):
yield Album( yield Album(
self.__api, self.__api,
subject = self,
name = a.findtext('name'), name = a.findtext('name'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = a.findtext('artist/name'), name = a.findtext('artist/name'),
mbid = a.findtext('artist/mbid'), mbid = a.findtext('artist/mbid'),
url = a.findtext('artist/url'), url = a.findtext('artist/url'),
@ -533,6 +549,7 @@ class User(LastfmBase):
for a in data.findall('artist'): for a in data.findall('artist'):
yield Artist( yield Artist(
self.__api, self.__api,
subject = self,
name = a.findtext('name'), name = a.findtext('name'),
mbid = a.findtext('mbid'), mbid = a.findtext('mbid'),
stats = Stats( stats = Stats(
@ -575,9 +592,11 @@ class User(LastfmBase):
for t in data.findall('track'): for t in data.findall('track'):
yield Track( yield Track(
self.__api, self.__api,
subject = self,
name = t.findtext('name'), name = t.findtext('name'),
artist = Artist( artist = Artist(
self.__api, self.__api,
subject = self,
name = t.findtext('artist/name'), name = t.findtext('artist/name'),
mbid = t.findtext('artist/mbid'), mbid = t.findtext('artist/mbid'),
url = t.findtext('artist/url'), url = t.findtext('artist/url'),
@ -606,6 +625,16 @@ class User(LastfmBase):
@LastfmBase.cachedProperty @LastfmBase.cachedProperty
def tracks(self): def tracks(self):
return self.getTracks() return self.getTracks()
@staticmethod
def hashFunc(*args, **kwds):
try:
return hash(kwds['user'])
except KeyError:
raise LastfmError("user has to be provided for hashing")
def __hash__(self):
return self.__class__.hashFunc(user = self.user)
def __repr__(self): def __repr__(self):
return "<lastfm.User.Library: for user '%s'>" % self.user.name return "<lastfm.User.Library: for user '%s'>" % self.user.name
@ -626,7 +655,5 @@ from weeklychart import WeeklyChart, WeeklyAlbumChart, WeeklyArtistChart, Weekly
#TODO #TODO
#write exceptions #write exceptions
#argument type checking #argument type checking
#extra methods in weeklycharts
#setup.py
#cross check with website #cross check with website
#registry issue #parse xml in chunks

View File

@ -9,22 +9,28 @@ from base import LastfmBase
class WeeklyChart(LastfmBase): class WeeklyChart(LastfmBase):
"""A class for representing the weekly charts""" """A class for representing the weekly charts"""
def init(self, subject, start, end): def init(self, subject, start, end,
self._subject = subject stats = None):
self._start = start self.__subject = subject
self._end = end self.__start = start
self.__end = end
self.__stats = stats
@property @property
def subject(self): def subject(self):
return self._subject return self.__subject
@property @property
def start(self): def start(self):
return self._start return self.__start
@property @property
def end(self): def end(self):
return self._end return self.__end
@property
def stats(self):
return self.__stats
@staticmethod @staticmethod
def createFromData(api, subject, data): def createFromData(api, subject, data):
@ -52,12 +58,12 @@ class WeeklyChart(LastfmBase):
@staticmethod @staticmethod
def hashFunc(*args, **kwds): def hashFunc(*args, **kwds):
try: try:
return "%s%s%s%s" % ( return hash("%s%s%s%s" % (
hash(kwds['subject'].__class__.__name__), kwds['subject'].__class__.__name__,
hash(kwds['subject'].name), kwds['subject'].name,
hash(kwds['start']), kwds['start'],
hash(kwds['end']) kwds['end']
) ))
except KeyError: except KeyError:
raise LastfmError("subject, start and end have to be provided for hashing") raise LastfmError("subject, start and end have to be provided for hashing")
@ -94,10 +100,8 @@ class WeeklyChart(LastfmBase):
class WeeklyAlbumChart(WeeklyChart): class WeeklyAlbumChart(WeeklyChart):
"""A class for representing the weekly album charts""" """A class for representing the weekly album charts"""
def init(self, subject, start, end, albums): def init(self, subject, start, end, stats, albums):
self._subject = subject super(WeeklyAlbumChart, self).init(subject, start, end, stats)
self._start = start
self._end = end
self.__albums = albums self.__albums = albums
@property @property
@ -106,17 +110,34 @@ class WeeklyAlbumChart(WeeklyChart):
@staticmethod @staticmethod
def createFromData(api, subject, data): def createFromData(api, subject, data):
w = WeeklyChart(
subject = subject,
start = datetime.utcfromtimestamp(int(data.attrib['from'])),
end = datetime.utcfromtimestamp(int(data.attrib['to'])),
)
return WeeklyAlbumChart( return WeeklyAlbumChart(
subject = subject, subject = subject,
start = datetime.utcfromtimestamp(int(data.attrib['from'])), start = datetime.utcfromtimestamp(int(data.attrib['from'])),
end = datetime.utcfromtimestamp(int(data.attrib['to'])), end = datetime.utcfromtimestamp(int(data.attrib['to'])),
stats = Stats(
subject = subject,
playcount = reduce(
lambda x,y:(
x + int(y.findtext('playcount'))
),
data.findall('album'),
0
)
),
albums = [ albums = [
Album( Album(
api, api,
subject = w,
name = a.findtext('name'), name = a.findtext('name'),
mbid = a.findtext('mbid'), mbid = a.findtext('mbid'),
artist = Artist( artist = Artist(
api, api,
subject = w,
name = a.findtext('artist'), name = a.findtext('artist'),
mbid = a.find('artist').attrib['mbid'], mbid = a.find('artist').attrib['mbid'],
), ),
@ -133,10 +154,8 @@ class WeeklyAlbumChart(WeeklyChart):
class WeeklyArtistChart(WeeklyChart): class WeeklyArtistChart(WeeklyChart):
"""A class for representing the weekly artist charts""" """A class for representing the weekly artist charts"""
def init(self, subject, start, end, artists): def init(self, subject, start, end, stats, artists):
self._subject = subject super(WeeklyArtistChart, self).init(subject, start, end, stats)
self._start = start
self._end = end
self.__artists = artists self.__artists = artists
@property @property
@ -145,13 +164,29 @@ class WeeklyArtistChart(WeeklyChart):
@staticmethod @staticmethod
def createFromData(api, subject, data): def createFromData(api, subject, data):
w = WeeklyChart(
subject = subject,
start = datetime.utcfromtimestamp(int(data.attrib['from'])),
end = datetime.utcfromtimestamp(int(data.attrib['to'])),
)
return WeeklyArtistChart( return WeeklyArtistChart(
subject = subject, subject = subject,
start = datetime.utcfromtimestamp(int(data.attrib['from'])), start = datetime.utcfromtimestamp(int(data.attrib['from'])),
end = datetime.utcfromtimestamp(int(data.attrib['to'])), end = datetime.utcfromtimestamp(int(data.attrib['to'])),
stats = Stats(
subject = subject,
playcount = reduce(
lambda x,y:(
x + int(y.findtext('playcount'))
),
data.findall('artist'),
0
)
),
artists = [ artists = [
Artist( Artist(
api, api,
subject = w,
name = a.findtext('name'), name = a.findtext('name'),
mbid = a.findtext('mbid'), mbid = a.findtext('mbid'),
stats = Stats( stats = Stats(
@ -167,10 +202,8 @@ class WeeklyArtistChart(WeeklyChart):
class WeeklyTrackChart(WeeklyChart): class WeeklyTrackChart(WeeklyChart):
"""A class for representing the weekly track charts""" """A class for representing the weekly track charts"""
def init(self, subject, start, end, tracks): def init(self, subject, start, end, tracks, stats):
self._subject = subject super(WeeklyTrackChart, self).init(subject, start, end, stats)
self._start = start
self._end = end
self.__tracks = tracks self.__tracks = tracks
@property @property
@ -179,13 +212,29 @@ class WeeklyTrackChart(WeeklyChart):
@staticmethod @staticmethod
def createFromData(api, subject, data): def createFromData(api, subject, data):
w = WeeklyChart(
subject = subject,
start = datetime.utcfromtimestamp(int(data.attrib['from'])),
end = datetime.utcfromtimestamp(int(data.attrib['to'])),
)
return WeeklyTrackChart( return WeeklyTrackChart(
subject = subject, subject = subject,
start = datetime.utcfromtimestamp(int(data.attrib['from'])), start = datetime.utcfromtimestamp(int(data.attrib['from'])),
end = datetime.utcfromtimestamp(int(data.attrib['to'])), end = datetime.utcfromtimestamp(int(data.attrib['to'])),
stats = Stats(
subject = subject,
playcount = reduce(
lambda x,y:(
x + int(y.findtext('playcount'))
),
data.findall('track'),
0
)
),
tracks = [ tracks = [
Track( Track(
api, api,
subject = w,
name = t.findtext('name'), name = t.findtext('name'),
mbid = t.findtext('mbid'), mbid = t.findtext('mbid'),
artist = Artist( artist = Artist(