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

master
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 [
Tag(
self.__api,
subject = self,
name = t.findtext('name'),
url = t.findtext('url')
)
@ -143,6 +144,7 @@ class Album(LastfmBase):
self.__topTags = [
Tag(
self.__api,
subject = self,
name = t.findtext('name'),
url = t.findtext('url')
)
@ -160,6 +162,7 @@ class Album(LastfmBase):
name = data.findtext('name'),
artist = Artist(
api,
subject = self,
name = data.findtext('artist'),
),
)

View File

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

View File

@ -16,6 +16,11 @@ class LastfmBase(object):
_lock = Lock()
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:
del kwds['bypassRegistry']
inst = object.__new__(cls)
@ -23,6 +28,9 @@ class LastfmBase(object):
return inst
key = cls.hashFunc(*args, **kwds)
if subject is not None:
key = (hash(subject), key)
LastfmBase._lock.acquire()
try:
inst, alreadyRegistered = LastfmBase.register(object.__new__(cls), key)

View File

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

View File

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

View File

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

View File

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

View File

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