changed paginated methods in geo and user modules to lazy lists

This commit is contained in:
Abhinav Sarkar 2008-08-27 18:46:31 +00:00
parent e619c69822
commit 0dfae9e1cb
3 changed files with 166 additions and 132 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
__author__ = "Abhinav Sarkar" __author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
__version__ = "0.1" __version__ = "0.1"
__license__ = "GNU Lesser General Public License" __license__ = "GNU Lesser General Public License"

View File

@ -5,34 +5,37 @@ __version__ = "0.1"
__license__ = "GNU Lesser General Public License" __license__ = "GNU Lesser General Public License"
from base import LastfmBase from base import LastfmBase
from lazylist import lazylist
class Geo(object): class Geo(object):
"""A class representing an geographic location.""" """A class representing an geographic location."""
@staticmethod @staticmethod
def getEvents(api, def getEvents(api,
location, location,
distance = None, distance = None):
page = None):
params = {'method': 'geo.getevents', 'location': location} params = {'method': 'geo.getevents', 'location': location}
if distance is not None: if distance is not None:
params.update({'distance': distance}) params.update({'distance': distance})
if page is not None: @lazylist
params.update({'page': page}) def gen(lst):
data = api._fetchData(params).find('events') data = api._fetchData(params).find('events')
totalPages = int(data.attrib['totalpages'])
return SearchResult( @lazylist
type = 'event', def gen2(lst, data):
searchTerms = data.attrib['location'], for e in data.findall('event'):
startPage = int(data.attrib['page']), yield Event.createFromData(api, e)
totalResults = int(data.attrib['total']),
itemsPerPage = int(math.ceil(float(data.attrib['total']))/float(data.attrib['totalpages'])), for e in gen2(data):
matches = [ yield e
Event.createFromData(api, e)
for e in data.findall('event') for page in xrange(2, totalPages+1):
] params.update({'page': page})
) data = api._fetchData(params).find('events')
for e in gen2(data):
yield e
return gen()
@staticmethod @staticmethod
def getTopArtists(api, country): def getTopArtists(api, country):
@ -193,9 +196,8 @@ class Location(LastfmBase):
return self.__timezone return self.__timezone
def getEvents(self, def getEvents(self,
distance = None, distance = None):
page = None): return Geo.getEvents(self.__api, self.name, distance)
return Geo.getEvents(self.__api, self.name, distance, page).matches
@LastfmBase.cachedProperty @LastfmBase.cachedProperty
def events(self): def events(self):
@ -289,12 +291,9 @@ class Country(LastfmBase):
def __repr__(self): def __repr__(self):
return "<lastfm.geo.Country: %s>" % self.name return "<lastfm.geo.Country: %s>" % self.name
import math
from api import Api from api import Api
from artist import Artist from artist import Artist
from error import LastfmError from error import LastfmError
from event import Event from event import Event
from search import SearchResult
from stats import Stats from stats import Stats
from track import Track from track import Track

View File

@ -59,19 +59,30 @@ class User(LastfmBase):
] ]
def getPastEvents(self, def getPastEvents(self,
page = None,
limit = None): limit = None):
params = {'method': 'user.getpastevents', 'user': self.name} params = {'method': 'user.getpastevents', 'user': self.name}
if page is not None:
params.update({'page': page})
if limit is not None: if limit is not None:
params.update({'limit': limit}) params.update({'limit': limit})
@lazylist
def gen(lst):
data = self.__api._fetchData(params).find('events') data = self.__api._fetchData(params).find('events')
return [ totalPages = int(data.attrib['totalPages'])
Event.createFromData(self.__api, e)
for e in data.findall('event') @lazylist
] def gen2(lst, data):
for e in data.findall('event'):
yield Event.createFromData(self.__api, e)
for e in gen2(data):
yield e
for page in xrange(2, totalPages+1):
params.update({'page': page})
data = self.__api._fetchData(params).find('events')
for e in gen2(data):
yield e
return gen()
@LastfmBase.cachedProperty @LastfmBase.cachedProperty
def pastEvents(self): def pastEvents(self):
@ -451,16 +462,20 @@ class User(LastfmBase):
return self.__user return self.__user
def getAlbums(self, def getAlbums(self,
limit = None, limit = None):
page = None): params = {'method': 'library.getalbums', 'user': self.user.name}
params = {'method': 'library.getalbums'} if limit is not None:
data = self._fetchData(params, limit, page).find('albums') params.update({'limit': limit})
return {
'page': int(data.attrib['page']), @lazylist
'perPage': int(data.attrib['perPage']), def gen(lst):
'totalPages': int(data.attrib['totalPages']), data = self.__api._fetchData(params).find('albums')
'albums': [ totalPages = int(data.attrib['totalPages'])
Album(
@lazylist
def gen2(lst, data):
for a in data.findall('album'):
yield Album(
self.__api, self.__api,
name = a.findtext('name'), name = a.findtext('name'),
artist = Artist( artist = Artist(
@ -477,25 +492,37 @@ class User(LastfmBase):
playcount = int(a.findtext('playcount')), playcount = int(a.findtext('playcount')),
) )
) )
for a in data.findall('album')
]
} for a in gen2(data):
yield a
for page in xrange(2, totalPages+1):
params.update({'page': page})
data = self.__api._fetchData(params).find('albums')
for a in gen2(data):
yield a
return gen()
@LastfmBase.cachedProperty @LastfmBase.cachedProperty
def albums(self): def albums(self):
return self.getAlbums()['albums'] return self.getAlbums()
def getArtists(self, def getArtists(self,
limit = None, limit = None):
page = None): params = {'method': 'library.getartists', 'user': self.user.name}
params = {'method': 'library.getartists'} if limit is not None:
data = self._fetchData(params, limit, page).find('artists') params.update({'limit': limit})
return {
'page': int(data.attrib['page']), @lazylist
'perPage': int(data.attrib['perPage']), def gen(lst):
'totalPages': int(data.attrib['totalPages']), data = self.__api._fetchData(params).find('artists')
'artists': [ totalPages = int(data.attrib['totalPages'])
Artist(
@lazylist
def gen2(lst, data):
for a in data.findall('artist'):
yield Artist(
self.__api, self.__api,
name = a.findtext('name'), name = a.findtext('name'),
mbid = a.findtext('mbid'), mbid = a.findtext('mbid'),
@ -508,25 +535,36 @@ class User(LastfmBase):
streamable = (a.findtext('streamable') == "1"), streamable = (a.findtext('streamable') == "1"),
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('artist')
] for a in gen2(data):
} yield a
for page in xrange(2, totalPages+1):
params.update({'page': page})
data = self.__api._fetchData(params).find('artists')
for a in gen2(data):
yield a
return gen()
@LastfmBase.cachedProperty @LastfmBase.cachedProperty
def artists(self): def artists(self):
return self.getArtists()['artists'] return self.getArtists()
def getTracks(self, def getTracks(self,
limit = None, limit = None):
page = None): params = {'method': 'library.gettracks', 'user': self.user.name}
params = {'method': 'library.gettracks'} if limit is not None:
data = self._fetchData(params, limit, page).find('tracks') params.update({'limit': limit})
return {
'page': int(data.attrib['page']), @lazylist
'perPage': int(data.attrib['perPage']), def gen(lst):
'totalPages': int(data.attrib['totalPages']), data = self.__api._fetchData(params).find('tracks')
'tracks': [ totalPages = int(data.attrib['totalPages'])
Track(
@lazylist
def gen2(lst, data):
for t in data.findall('track'):
yield Track(
self.__api, self.__api,
name = t.findtext('name'), name = t.findtext('name'),
artist = Artist( artist = Artist(
@ -545,22 +583,20 @@ class User(LastfmBase):
fullTrack = (t.find('streamable').attrib['fulltrack'] == '1'), fullTrack = (t.find('streamable').attrib['fulltrack'] == '1'),
image = dict([(i.get('size'), i.text) for i in t.findall('image')]), image = dict([(i.get('size'), i.text) for i in t.findall('image')]),
) )
for t in data.findall('track')
] for t in gen2(data):
} yield t
for page in xrange(2, totalPages+1):
params.update({'page': page})
data = self.__api._fetchData(params).find('tracks')
for t in gen2(data):
yield t
return gen()
@LastfmBase.cachedProperty @LastfmBase.cachedProperty
def tracks(self): def tracks(self):
return self.getTracks()['tracks'] return self.getTracks()
def _fetchData(self, params, limit, page):
params .update({'user': self.user.name})
if limit is not None:
params.update({'limit': limit})
if page is not None:
params.update({'page': page})
return self.__api._fetchData(params)
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
@ -579,6 +615,5 @@ from track import Track
from weeklychart import WeeklyChart, WeeklyAlbumChart, WeeklyArtistChart, WeeklyTrackChart from weeklychart import WeeklyChart, WeeklyAlbumChart, WeeklyArtistChart, WeeklyTrackChart
#TODO #TODO
#write depaginations
#write exceptions #write exceptions
#argument type checking #argument type checking