changed paginated methods in geo and user modules to lazy lists
This commit is contained in:
parent
e619c69822
commit
0dfae9e1cb
2
setup.py
2
setup.py
@ -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"
|
||||||
|
|
||||||
|
43
src/geo.py
43
src/geo.py
@ -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
|
||||||
|
153
src/user.py
153
src/user.py
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user