fixed a major bug in base module. made Registry class subscriptable. added stats in weeklyXXXChart classes.
This commit is contained in:
parent
7683ad87c2
commit
9795b1f18f
@ -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'),
|
||||
),
|
||||
)
|
||||
|
@ -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')
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
@ -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'),
|
||||
|
@ -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(
|
||||
|
33
src/user.py
33
src/user.py
@ -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
|
@ -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(
|
||||
|
Loading…
Reference in New Issue
Block a user