refactored the code and created Stats class. Geo class complete now.
parent
7498646d55
commit
1d81a1a4fb
33
src/album.py
33
src/album.py
|
@ -17,8 +17,7 @@ class Album(LastfmBase):
|
||||||
url = None,
|
url = None,
|
||||||
releaseDate = None,
|
releaseDate = None,
|
||||||
image = None,
|
image = None,
|
||||||
listeners = None,
|
stats = None,
|
||||||
playcount = None,
|
|
||||||
topTags = None):
|
topTags = None):
|
||||||
if not isinstance(api, Api):
|
if not isinstance(api, Api):
|
||||||
raise LastfmError("api reference must be supplied as an argument")
|
raise LastfmError("api reference must be supplied as an argument")
|
||||||
|
@ -30,8 +29,13 @@ class Album(LastfmBase):
|
||||||
self.__url = url
|
self.__url = url
|
||||||
self.__releaseDate = releaseDate
|
self.__releaseDate = releaseDate
|
||||||
self.__image = image
|
self.__image = image
|
||||||
self.__listeners = listeners
|
self.__stats = stats and Stats(
|
||||||
self.__playcount = playcount
|
subject = self,
|
||||||
|
listeners = stats.listeners,
|
||||||
|
playcount = stats.playcount,
|
||||||
|
match = stats.match,
|
||||||
|
rank = stats.rank
|
||||||
|
)
|
||||||
self.__topTags = topTags
|
self.__topTags = topTags
|
||||||
|
|
||||||
def getName(self):
|
def getName(self):
|
||||||
|
@ -55,11 +59,8 @@ class Album(LastfmBase):
|
||||||
def getImage(self):
|
def getImage(self):
|
||||||
return self.__image
|
return self.__image
|
||||||
|
|
||||||
def getListeners(self):
|
def getStats(self):
|
||||||
return self.__listeners
|
return self.__stats
|
||||||
|
|
||||||
def getPlaycount(self):
|
|
||||||
return self.__playcount
|
|
||||||
|
|
||||||
def getTopTags(self):
|
def getTopTags(self):
|
||||||
if self.__topTags is None:
|
if self.__topTags is None:
|
||||||
|
@ -93,9 +94,7 @@ class Album(LastfmBase):
|
||||||
|
|
||||||
image = property(getImage, None, None, "Image's Docstring")
|
image = property(getImage, None, None, "Image's Docstring")
|
||||||
|
|
||||||
listeners = property(getListeners, None, None, "Listeners's Docstring")
|
stats = property(getStats, None, None, "Stats's Docstring")
|
||||||
|
|
||||||
playcount = property(getPlaycount, None, None, "Playcount's Docstring")
|
|
||||||
|
|
||||||
topTags = property(getTopTags, None, None, "TopTags's Docstring")
|
topTags = property(getTopTags, None, None, "TopTags's Docstring")
|
||||||
topTag = property(lambda self: self.topTags and len(self.topTags) and self.topTags[0],
|
topTag = property(lambda self: self.topTags and len(self.topTags) and self.topTags[0],
|
||||||
|
@ -128,8 +127,11 @@ class Album(LastfmBase):
|
||||||
releaseDate = data.findtext('releasedate') and data.findtext('releasedate').strip() and
|
releaseDate = data.findtext('releasedate') and data.findtext('releasedate').strip() and
|
||||||
datetime(*(time.strptime(data.findtext('releasedate').strip(), '%d %b %Y, 00:00')[0:6])),
|
datetime(*(time.strptime(data.findtext('releasedate').strip(), '%d %b %Y, 00:00')[0:6])),
|
||||||
image = dict([(i.get('size'), i.text) for i in data.findall('image')]),
|
image = dict([(i.get('size'), i.text) for i in data.findall('image')]),
|
||||||
listeners = int(data.findtext('listeners')),
|
stats = Stats(
|
||||||
playcount = int(data.findtext('playcount')),
|
subject = data.findtext('name'),
|
||||||
|
listeners = int(data.findtext('listeners')),
|
||||||
|
playcount = int(data.findtext('playcount')),
|
||||||
|
),
|
||||||
topTags = [
|
topTags = [
|
||||||
Tag(
|
Tag(
|
||||||
api,
|
api,
|
||||||
|
@ -173,4 +175,5 @@ import time
|
||||||
from api import Api
|
from api import Api
|
||||||
from error import LastfmError
|
from error import LastfmError
|
||||||
from tag import Tag
|
from tag import Tag
|
||||||
from artist import Artist
|
from artist import Artist
|
||||||
|
from stats import Stats
|
|
@ -152,8 +152,8 @@ class Api(object):
|
||||||
def getGroup(self, name):
|
def getGroup(self, name):
|
||||||
return Group(self, name = name)
|
return Group(self, name = name)
|
||||||
|
|
||||||
def fetchPlaylist(self, playlistUrl):
|
def fetchPlaylist(self, url):
|
||||||
return Playlist(self, playlistUrl = playlistUrl)
|
return Playlist.fetch(self, url)
|
||||||
|
|
||||||
def getTag(self, name):
|
def getTag(self, name):
|
||||||
return Tag(self, name = name)
|
return Tag(self, name = name)
|
||||||
|
|
|
@ -13,7 +13,6 @@ class Artist(LastfmBase):
|
||||||
name = None,
|
name = None,
|
||||||
mbid = None,
|
mbid = None,
|
||||||
url = None,
|
url = None,
|
||||||
match = None,
|
|
||||||
image = None,
|
image = None,
|
||||||
streamable = None,
|
streamable = None,
|
||||||
stats = None,
|
stats = None,
|
||||||
|
@ -26,13 +25,14 @@ class Artist(LastfmBase):
|
||||||
self.__name = name
|
self.__name = name
|
||||||
self.__mbid = mbid
|
self.__mbid = mbid
|
||||||
self.__url = url
|
self.__url = url
|
||||||
self.__match = match
|
|
||||||
self.__image = image
|
self.__image = image
|
||||||
self.__streamable = streamable
|
self.__streamable = streamable
|
||||||
self.__stats = stats and Stats(
|
self.__stats = stats and Stats(
|
||||||
artist = self,
|
subject = self,
|
||||||
listeners = stats.listeners,
|
listeners = stats.listeners,
|
||||||
plays = stats.plays
|
playcount = stats.playcount,
|
||||||
|
match = stats.match,
|
||||||
|
rank = stats.rank
|
||||||
)
|
)
|
||||||
self.__similar = similar
|
self.__similar = similar
|
||||||
self.__topTags = topTags
|
self.__topTags = topTags
|
||||||
|
@ -52,9 +52,6 @@ class Artist(LastfmBase):
|
||||||
def getUrl(self):
|
def getUrl(self):
|
||||||
return self.__url
|
return self.__url
|
||||||
|
|
||||||
def getMatch(self):
|
|
||||||
return self.__match
|
|
||||||
|
|
||||||
def getImage(self):
|
def getImage(self):
|
||||||
return self.__image
|
return self.__image
|
||||||
|
|
||||||
|
@ -77,7 +74,10 @@ class Artist(LastfmBase):
|
||||||
self.__api,
|
self.__api,
|
||||||
name = a.findtext('name'),
|
name = a.findtext('name'),
|
||||||
mbid = a.findtext('mbid'),
|
mbid = a.findtext('mbid'),
|
||||||
match = float(a.findtext('match')),
|
stats = Stats(
|
||||||
|
artist = a.findtext('name'),
|
||||||
|
match = float(a.findtext('match')),
|
||||||
|
),
|
||||||
url = 'http://' + a.findtext('url'),
|
url = 'http://' + a.findtext('url'),
|
||||||
image = {'large': a.findtext('image')}
|
image = {'large': a.findtext('image')}
|
||||||
)
|
)
|
||||||
|
@ -111,8 +111,6 @@ class Artist(LastfmBase):
|
||||||
|
|
||||||
url = property(getUrl, None, None, "Url's Docstring")
|
url = property(getUrl, None, None, "Url's Docstring")
|
||||||
|
|
||||||
match = property(getMatch, None, None, "Match's Docstring")
|
|
||||||
|
|
||||||
image = property(getImage, None, None, "Image's Docstring")
|
image = property(getImage, None, None, "Image's Docstring")
|
||||||
|
|
||||||
streamable = property(getStreamable, None, None, "Streamable's Docstring")
|
streamable = property(getStreamable, None, None, "Streamable's Docstring")
|
||||||
|
@ -139,7 +137,7 @@ class Artist(LastfmBase):
|
||||||
id = int(e.findtext('id')),
|
id = int(e.findtext('id')),
|
||||||
title = e.findtext('title'),
|
title = e.findtext('title'),
|
||||||
artists = [Artist(self.__api, name = a.text) for a in e.findall('artists/artist')],
|
artists = [Artist(self.__api, name = a.text) for a in e.findall('artists/artist')],
|
||||||
headliner = e.findtext('artists/headliner'),
|
headliner = Artist(self.__api, name = e.findtext('artists/headliner')),
|
||||||
venue = Venue(
|
venue = Venue(
|
||||||
name = e.findtext('venue/name'),
|
name = e.findtext('venue/name'),
|
||||||
location = Location(
|
location = Location(
|
||||||
|
@ -188,7 +186,11 @@ class Artist(LastfmBase):
|
||||||
mbid = a.findtext('mbid'),
|
mbid = a.findtext('mbid'),
|
||||||
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')]),
|
||||||
playcount = int(a.findtext('playcount')),
|
stats = Stats(
|
||||||
|
subject = a.findtext('name'),
|
||||||
|
playcount = int(a.findtext('playcount')),
|
||||||
|
rank = int(a.attrib['rank'])
|
||||||
|
)
|
||||||
)
|
)
|
||||||
for a in data.findall('album')
|
for a in data.findall('album')
|
||||||
]
|
]
|
||||||
|
@ -206,7 +208,10 @@ class Artist(LastfmBase):
|
||||||
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')]),
|
||||||
weight = int(u.findtext('weight'))
|
stats = Stats(
|
||||||
|
subject = u.findtext('name'),
|
||||||
|
weight = int(u.findtext('weight'))
|
||||||
|
)
|
||||||
)
|
)
|
||||||
for u in data.findall('user')
|
for u in data.findall('user')
|
||||||
]
|
]
|
||||||
|
@ -224,7 +229,11 @@ class Artist(LastfmBase):
|
||||||
name = t.findtext('name'),
|
name = t.findtext('name'),
|
||||||
artist = self,
|
artist = self,
|
||||||
mbid = t.findtext('mbid'),
|
mbid = t.findtext('mbid'),
|
||||||
playcount = int(t.findtext('playcount')),
|
stats = Stats(
|
||||||
|
subject = t.findtext('name'),
|
||||||
|
playcount = int(t.findtext('playcount')),
|
||||||
|
rank = int(t.attrib['rank'])
|
||||||
|
),
|
||||||
streamable = (t.findtext('streamable') == '1'),
|
streamable = (t.findtext('streamable') == '1'),
|
||||||
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')]),
|
||||||
|
@ -263,7 +272,7 @@ class Artist(LastfmBase):
|
||||||
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')]),
|
||||||
streamable = (a.findtext('streamable') == '1'),
|
streamable = (a.findtext('streamable') == '1'),
|
||||||
stats = Stats(
|
stats = Stats(
|
||||||
artist = a.findtext('name'),
|
subject = a.findtext('name'),
|
||||||
listeners = int(a.findtext('listeners')),
|
listeners = int(a.findtext('listeners')),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -293,9 +302,9 @@ class Artist(LastfmBase):
|
||||||
image = dict([(i.get('size'), i.text) for i in data.findall('image')]),
|
image = dict([(i.get('size'), i.text) for i in data.findall('image')]),
|
||||||
streamable = (data.findtext('streamable') == 1),
|
streamable = (data.findtext('streamable') == 1),
|
||||||
stats = Stats(
|
stats = Stats(
|
||||||
artist,
|
subject = artist,
|
||||||
listeners = int(data.findtext('stats/listeners')),
|
listeners = int(data.findtext('stats/listeners')),
|
||||||
plays = int(data.findtext('stats/plays'))
|
playcount = int(data.findtext('stats/plays'))
|
||||||
),
|
),
|
||||||
similar = [
|
similar = [
|
||||||
Artist(
|
Artist(
|
||||||
|
@ -352,34 +361,6 @@ class Artist(LastfmBase):
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<lastfm.Artist: %s>" % self.__name
|
return "<lastfm.Artist: %s>" % self.__name
|
||||||
|
|
||||||
class Stats(object):
|
|
||||||
"""A class representing the stats of an artist."""
|
|
||||||
def __init__(self,
|
|
||||||
artist,
|
|
||||||
listeners = None,
|
|
||||||
plays = None):
|
|
||||||
self.__artist = artist
|
|
||||||
self.__listeners = listeners
|
|
||||||
self.__plays = plays
|
|
||||||
|
|
||||||
def getArtist(self):
|
|
||||||
return self.__artist
|
|
||||||
|
|
||||||
def getListeners(self):
|
|
||||||
return self.__listeners
|
|
||||||
|
|
||||||
def getPlays(self):
|
|
||||||
return self.__plays
|
|
||||||
|
|
||||||
listeners = property(getListeners, None, None, "Listeners's Docstring")
|
|
||||||
|
|
||||||
plays = property(getPlays, None, None, "Plays's Docstring")
|
|
||||||
|
|
||||||
artist = property(getArtist, None, None, "Artist's Docstring")
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<lastfm.artist.Stats: for artist '%s'>" % self.__artist.name
|
|
||||||
|
|
||||||
class Bio(object):
|
class Bio(object):
|
||||||
"""A class representing the biography of an artist."""
|
"""A class representing the biography of an artist."""
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
|
@ -426,4 +407,5 @@ from geo import Country, Location, Venue
|
||||||
from tag import Tag
|
from tag import Tag
|
||||||
from track import Track
|
from track import Track
|
||||||
from user import User
|
from user import User
|
||||||
from search import SearchResult
|
from search import SearchResult
|
||||||
|
from stats import Stats
|
35
src/event.py
35
src/event.py
|
@ -20,8 +20,7 @@ class Event(LastfmBase):
|
||||||
description = None,
|
description = None,
|
||||||
image = None,
|
image = None,
|
||||||
url = None,
|
url = None,
|
||||||
attendance = None,
|
stats = None,
|
||||||
reviews = None,
|
|
||||||
tag = None):
|
tag = None):
|
||||||
if not isinstance(api, Api):
|
if not isinstance(api, Api):
|
||||||
raise LastfmError("api reference must be supplied as an argument")
|
raise LastfmError("api reference must be supplied as an argument")
|
||||||
|
@ -36,8 +35,11 @@ class Event(LastfmBase):
|
||||||
self.__description = description
|
self.__description = description
|
||||||
self.__image = image
|
self.__image = image
|
||||||
self.__url = url
|
self.__url = url
|
||||||
self.__attendance = attendance
|
self.__stats = stats and Stats(
|
||||||
self.__reviews = reviews
|
subject = self,
|
||||||
|
attendance = self.attendance,
|
||||||
|
reviews = self.reviews
|
||||||
|
)
|
||||||
self.__tag = tag
|
self.__tag = tag
|
||||||
|
|
||||||
def getId(self):
|
def getId(self):
|
||||||
|
@ -70,11 +72,8 @@ class Event(LastfmBase):
|
||||||
def getUrl(self):
|
def getUrl(self):
|
||||||
return self.__url
|
return self.__url
|
||||||
|
|
||||||
def getAttendance(self):
|
def getStats(self):
|
||||||
return self.__attendance
|
return self.__stats
|
||||||
|
|
||||||
def getReviews(self):
|
|
||||||
return self.__reviews
|
|
||||||
|
|
||||||
def getTag(self):
|
def getTag(self):
|
||||||
return self.__tag
|
return self.__tag
|
||||||
|
@ -99,10 +98,8 @@ class Event(LastfmBase):
|
||||||
|
|
||||||
url = property(getUrl, None, None, "Url's Docstring")
|
url = property(getUrl, None, None, "Url's Docstring")
|
||||||
|
|
||||||
attendance = property(getAttendance, None, None, "Attendance's Docstring")
|
stats = property(getStats, None, None, "Match's Docstring")
|
||||||
|
|
||||||
reviews = property(getReviews, None, None, "Reviews's Docstring")
|
|
||||||
|
|
||||||
tag = property(getTag, None, None, "Tag's Docstring")
|
tag = property(getTag, None, None, "Tag's Docstring")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -115,7 +112,7 @@ class Event(LastfmBase):
|
||||||
id = int(data.findtext('id')),
|
id = int(data.findtext('id')),
|
||||||
title = data.findtext('title'),
|
title = data.findtext('title'),
|
||||||
artists = [Artist(api, name = a.text) for a in data.findall('artists/artist')],
|
artists = [Artist(api, name = a.text) for a in data.findall('artists/artist')],
|
||||||
headliner = data.findtext('artists/headliner'),
|
headliner = Artist(api, name = data.findtext('artists/headliner')),
|
||||||
venue = Venue(
|
venue = Venue(
|
||||||
name = data.findtext('venue/name'),
|
name = data.findtext('venue/name'),
|
||||||
location = Location(
|
location = Location(
|
||||||
|
@ -146,8 +143,11 @@ class Event(LastfmBase):
|
||||||
description = data.findtext('description'),
|
description = data.findtext('description'),
|
||||||
image = dict([(i.get('size'), i.text) for i in data.findall('image')]),
|
image = dict([(i.get('size'), i.text) for i in data.findall('image')]),
|
||||||
url = data.findtext('url'),
|
url = data.findtext('url'),
|
||||||
attendance = int(data.findtext('attendance')),
|
stats = Stats(
|
||||||
reviews = int(data.findtext('reviews')),
|
subject = int(data.findtext('id')),
|
||||||
|
attendance = int(data.findtext('attendance')),
|
||||||
|
reviews = int(data.findtext('reviews')),
|
||||||
|
),
|
||||||
tag = data.findtext('tag')
|
tag = data.findtext('tag')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -176,4 +176,5 @@ import time
|
||||||
from api import Api
|
from api import Api
|
||||||
from error import LastfmError
|
from error import LastfmError
|
||||||
from artist import Artist
|
from artist import Artist
|
||||||
from geo import Venue, Location, Country
|
from geo import Venue, Location, Country
|
||||||
|
from stats import Stats
|
113
src/geo.py
113
src/geo.py
|
@ -9,16 +9,108 @@ from base import LastfmBase
|
||||||
class Geo(object):
|
class Geo(object):
|
||||||
"""A class representing an geographic location."""
|
"""A class representing an geographic location."""
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def getEvents(api, location, distance, page):
|
def getEvents(api,
|
||||||
pass
|
location,
|
||||||
|
distance = None,
|
||||||
|
page = None):
|
||||||
|
params = {'method': 'geo.getevents', 'location': location}
|
||||||
|
data = api.fetchData(params).find('events')
|
||||||
|
|
||||||
|
return SearchResult(
|
||||||
|
type = 'event',
|
||||||
|
searchTerms = data.attrib['location'],
|
||||||
|
startPage = int(data.attrib['page']),
|
||||||
|
totalResults = int(data.attrib['total']),
|
||||||
|
itemsPerPage = int(math.ceil(float(data.attrib['total']))/float(data.attrib['totalpages'])),
|
||||||
|
matches = [
|
||||||
|
Event(
|
||||||
|
api,
|
||||||
|
id = int(e.findtext('id')),
|
||||||
|
title = e.findtext('title'),
|
||||||
|
artists = [Artist(api, name = a.text) for a in e.findall('artists/artist')],
|
||||||
|
headliner = Artist(api, name = e.findtext('artists/headliner')),
|
||||||
|
venue = Venue(
|
||||||
|
name = e.findtext('venue/name'),
|
||||||
|
location = Location(
|
||||||
|
api,
|
||||||
|
city = e.findtext('venue/location/city'),
|
||||||
|
country = Country(
|
||||||
|
api,
|
||||||
|
name = e.findtext('venue/location/country')
|
||||||
|
),
|
||||||
|
street = e.findtext('venue/location/street'),
|
||||||
|
postalCode = e.findtext('venue/location/postalcode'),
|
||||||
|
latitude = float(e.findtext(
|
||||||
|
'venue/location/{%s}point/{%s}lat' % ((Location.xmlns,)*2)
|
||||||
|
)),
|
||||||
|
longitude = float(e.findtext(
|
||||||
|
'venue/location/{%s}point/{%s}long' % ((Location.xmlns,)*2)
|
||||||
|
)),
|
||||||
|
timezone = e.findtext('venue/location/timezone')
|
||||||
|
),
|
||||||
|
url = e.findtext('venue/url')
|
||||||
|
),
|
||||||
|
startDate = e.findtext('startDate') and
|
||||||
|
datetime(*(time.strptime(e.findtext('startDate').strip(), '%a, %d %b %Y')[0:6])) or
|
||||||
|
None,
|
||||||
|
startTime = e.findtext('startTime') and
|
||||||
|
datetime(*(time.strptime(e.findtext('startTime').strip(), '%H:%M')[0:6])) or
|
||||||
|
None,
|
||||||
|
description = e.findtext('description'),
|
||||||
|
image = dict([(i.get('size'), i.text) for i in e.findall('image')]),
|
||||||
|
url = e.findtext('url')
|
||||||
|
)
|
||||||
|
for e in data.findall('event')
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def getTopArtists(api, country):
|
def getTopArtists(api, country):
|
||||||
pass
|
params = {'method': 'geo.gettopartists', 'country': country}
|
||||||
|
data = api.fetchData(params).find('topartists')
|
||||||
|
return [
|
||||||
|
Artist(
|
||||||
|
api,
|
||||||
|
name = a.findtext('name'),
|
||||||
|
mbid = a.findtext('mbid'),
|
||||||
|
stats = Stats(
|
||||||
|
subject = a.findtext('name'),
|
||||||
|
rank = int(a.attrib['rank']),
|
||||||
|
playcount = int(a.findtext('playcount'))
|
||||||
|
),
|
||||||
|
url = 'http://' + a.findtext('url'),
|
||||||
|
image = {'large': a.findtext('image')}
|
||||||
|
)
|
||||||
|
for a in data.findall('artist')
|
||||||
|
]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def getTopTracks(api, country):
|
def getTopTracks(api, country):
|
||||||
pass
|
params = {'method': 'geo.gettoptracks', 'country': country}
|
||||||
|
data = api.fetchData(params).find('toptracks')
|
||||||
|
return [
|
||||||
|
Track(
|
||||||
|
api,
|
||||||
|
name = t.findtext('name'),
|
||||||
|
mbid = t.findtext('mbid'),
|
||||||
|
artist = Artist(
|
||||||
|
api,
|
||||||
|
name = t.findtext('artist/name'),
|
||||||
|
mbid = t.findtext('artist/mbid'),
|
||||||
|
url = t.findtext('artist/url')
|
||||||
|
),
|
||||||
|
stats = Stats(
|
||||||
|
subject = t.findtext('name'),
|
||||||
|
rank = int(t.attrib['rank']),
|
||||||
|
playcount = int(t.findtext('playcount'))
|
||||||
|
),
|
||||||
|
streamable = (t.findtext('streamable') == '1'),
|
||||||
|
fullTrack = (t.find('streamable').attrib['fulltrack'] == '1'),
|
||||||
|
url = 'http://' + t.findtext('url'),
|
||||||
|
image = {'large': t.findtext('image')}
|
||||||
|
)
|
||||||
|
for t in data.findall('track')
|
||||||
|
]
|
||||||
|
|
||||||
class Venue(LastfmBase):
|
class Venue(LastfmBase):
|
||||||
"""A class representing a venue of an event"""
|
"""A class representing a venue of an event"""
|
||||||
|
@ -133,7 +225,7 @@ class Location(LastfmBase):
|
||||||
def getEvents(self,
|
def getEvents(self,
|
||||||
distance = None,
|
distance = None,
|
||||||
page = None):
|
page = None):
|
||||||
return Geo.getEvents(self.__api, self.name, distance, page)
|
return Geo.getEvents(self.__api, self.name, distance, page).matches
|
||||||
|
|
||||||
events = property(getEvents, None, None, "Event's Docstring")
|
events = property(getEvents, None, None, "Event's Docstring")
|
||||||
|
|
||||||
|
@ -218,9 +310,16 @@ class Country(LastfmBase):
|
||||||
return self.name < other.name
|
return self.name < other.name
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<lastfm.geo.Country: %s" % self.name
|
return "<lastfm.geo.Country: %s>" % self.name
|
||||||
|
|
||||||
|
import math
|
||||||
|
from datetime import datetime
|
||||||
|
import time
|
||||||
|
|
||||||
from api import Api
|
from api import Api
|
||||||
from error import LastfmError
|
from error import LastfmError
|
||||||
from artist import Artist
|
from artist import Artist
|
||||||
from track import Track
|
from track import Track
|
||||||
|
from event import Event
|
||||||
|
from search import SearchResult
|
||||||
|
from stats import Stats
|
|
@ -6,39 +6,44 @@ __license__ = "GNU Lesser General Public License"
|
||||||
|
|
||||||
from base import LastfmBase
|
from base import LastfmBase
|
||||||
|
|
||||||
class Playlist(LastfmBase, str):
|
class Playlist(LastfmBase):
|
||||||
"""A class representing an XPSF playlist."""
|
"""A class representing an XPSF playlist."""
|
||||||
def init(self, xpsfData, playlistUrl):
|
def init(self, xpsfData, url):
|
||||||
self = xpsfData
|
self.__data = xpsfData
|
||||||
self.__playlistUrl = playlistUrl
|
self.__url = url
|
||||||
|
|
||||||
def getPlaylistUrl(self):
|
def getData(self):
|
||||||
return self.__playlistUrl
|
return self.__data
|
||||||
|
|
||||||
|
def getUrl(self):
|
||||||
|
return self.__url
|
||||||
|
|
||||||
|
data = property(getData, None, None, "docstring")
|
||||||
|
|
||||||
playlistUrl = property(getPlaylistUrl, None, None, "PlaylistUrl's Docstring")
|
url = property(getUrl, None, None, "url's Docstring")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def fetch(api, playlistUrl):
|
def fetch(api, url):
|
||||||
params = {'method': 'playlist.fetch'}
|
params = {'method': 'playlist.fetch', 'playlistURL': url}
|
||||||
return Playlist(api.fetchData(params, parse = False), playlistUrl)
|
return Playlist(api.fetchData(params, parse = False), url = url)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def hashFunc(*args, **kwds):
|
def hashFunc(*args, **kwds):
|
||||||
try:
|
try:
|
||||||
return hash(kwds['playlistUrl'])
|
return hash(kwds['url'])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise LastfmError("playlistUrl has to be provided for hashing")
|
raise LastfmError("url has to be provided for hashing")
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return self.__class__.hashFunc(playlistUrl = self.playlistUrl)
|
return self.__class__.hashFunc(url = self.url)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return self.playlistUrl == other.playlistUrl
|
return self.url == other.url
|
||||||
|
|
||||||
def __lt__(self, other):
|
def __lt__(self, other):
|
||||||
return self.playlistUrl < other.playlistUrl
|
return self.url < other.url
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<lastfm.Playlist: %s>" % self.playlistUrl
|
return "<lastfm.Playlist: %s>" % self.url
|
||||||
|
|
||||||
from error import LastfmError
|
from error import LastfmError
|
|
@ -65,15 +65,15 @@ class SearchResult(LastfmBase):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def hashFunc(*args, **kwds):
|
def hashFunc(*args, **kwds):
|
||||||
try:
|
try:
|
||||||
return hash("%s%s%s" % (kwds['searchTerms'], kwds['type'], kwds['startIndex']))
|
return hash("%s%s%s" % (kwds['searchTerms'], kwds['type'], kwds['startPage']))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise LastfmError("name and artist have to be provided for hashing")
|
raise LastfmError("searchTerms, type and startPage have to be provided for hashing")
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return self.__class__.hashFunc(
|
return self.__class__.hashFunc(
|
||||||
searchTerms = self.searchTerms,
|
searchTerms = self.searchTerms,
|
||||||
type = self.type,
|
type = self.type,
|
||||||
startIndex = self.startIndex
|
startPage = self.startPage
|
||||||
)
|
)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
__author__ = "Abhinav Sarkar"
|
||||||
|
__version__ = "0.1"
|
||||||
|
__license__ = "GNU Lesser General Public License"
|
||||||
|
|
||||||
|
class Stats(object):
|
||||||
|
"""A class representing the stats of an artist."""
|
||||||
|
def __init__(self,
|
||||||
|
subject,
|
||||||
|
listeners = None,
|
||||||
|
playcount = None,
|
||||||
|
match = None,
|
||||||
|
rank = None,
|
||||||
|
weight = None,
|
||||||
|
attendance = None,
|
||||||
|
reviews = None,):
|
||||||
|
self.__subject = subject
|
||||||
|
self.__listeners = listeners
|
||||||
|
self.__playcount = playcount
|
||||||
|
self.__match = match
|
||||||
|
self.__rank = rank
|
||||||
|
self.__weight = weight
|
||||||
|
self.__attendance = attendance
|
||||||
|
self.__reviews = reviews
|
||||||
|
|
||||||
|
def getSubject(self):
|
||||||
|
return self.__subject
|
||||||
|
|
||||||
|
def getRank(self):
|
||||||
|
return self.__rank
|
||||||
|
|
||||||
|
def getListeners(self):
|
||||||
|
return self.__listeners
|
||||||
|
|
||||||
|
def getPlaycount(self):
|
||||||
|
return self.__playcount
|
||||||
|
|
||||||
|
def getMatch(self):
|
||||||
|
return self.__match
|
||||||
|
|
||||||
|
def getWeight(self):
|
||||||
|
return self.__weight
|
||||||
|
|
||||||
|
def getAttendance(self):
|
||||||
|
return self.__attendance
|
||||||
|
|
||||||
|
def getReviews(self):
|
||||||
|
return self.__reviews
|
||||||
|
|
||||||
|
listeners = property(getListeners, None, None, "Listeners's Docstring")
|
||||||
|
|
||||||
|
playcount = property(getPlaycount, None, None, "Plays's Docstring")
|
||||||
|
|
||||||
|
match = property(getMatch, None, None, "Match's Docstring")
|
||||||
|
|
||||||
|
rank = property(getRank, None, None, "Artist's Docstring")
|
||||||
|
|
||||||
|
subject = property(getSubject, None, None, "subject's Docstring")
|
||||||
|
|
||||||
|
weight = property(getWeight, None, None, "Weight's Docstring")
|
||||||
|
|
||||||
|
attendance = property(getAttendance, None, None, "Attendance's Docstring")
|
||||||
|
|
||||||
|
reviews = property(getReviews, None, None, "Reviews's Docstring")
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<lastfm.Stats: for '%s'>" % self.__subject.name
|
||||||
|
|
25
src/track.py
25
src/track.py
|
@ -16,8 +16,7 @@ class Track(LastfmBase):
|
||||||
streamable = None,
|
streamable = None,
|
||||||
artist = None,
|
artist = None,
|
||||||
image = None,
|
image = None,
|
||||||
match = None,
|
stats = None,
|
||||||
playcount = None,
|
|
||||||
fullTrack = None):
|
fullTrack = None):
|
||||||
if not isinstance(api, Api):
|
if not isinstance(api, Api):
|
||||||
raise LastfmError("api reference must be supplied as an argument")
|
raise LastfmError("api reference must be supplied as an argument")
|
||||||
|
@ -28,8 +27,12 @@ class Track(LastfmBase):
|
||||||
self.__streamable = streamable
|
self.__streamable = streamable
|
||||||
self.__artist = artist
|
self.__artist = artist
|
||||||
self.__image = image
|
self.__image = image
|
||||||
self.__match = match
|
self.__stats = stats and Stats(
|
||||||
self.__playcount = playcount
|
subject = self,
|
||||||
|
match = stats.match,
|
||||||
|
playcount = stats.playcount,
|
||||||
|
rank = stats.rank
|
||||||
|
)
|
||||||
self.__fullTrack = fullTrack
|
self.__fullTrack = fullTrack
|
||||||
|
|
||||||
def getName(self):
|
def getName(self):
|
||||||
|
@ -50,11 +53,8 @@ class Track(LastfmBase):
|
||||||
def getImage(self):
|
def getImage(self):
|
||||||
return self.__image
|
return self.__image
|
||||||
|
|
||||||
def getMatch(self):
|
def getStats(self):
|
||||||
return self.__match
|
return self.__stats
|
||||||
|
|
||||||
def getPlaycount(self):
|
|
||||||
return self.__playcount
|
|
||||||
|
|
||||||
def getFullTrack(self):
|
def getFullTrack(self):
|
||||||
return self.__fullTrack
|
return self.__fullTrack
|
||||||
|
@ -71,9 +71,7 @@ class Track(LastfmBase):
|
||||||
|
|
||||||
image = property(getImage, None, None, "Image's Docstring")
|
image = property(getImage, None, None, "Image's Docstring")
|
||||||
|
|
||||||
match = property(getMatch, None, None, "Match's Docstring")
|
stats = property(getStats, None, None, "Match's Docstring")
|
||||||
|
|
||||||
playcount = property(getPlaycount, None, None, "Match's Docstring")
|
|
||||||
|
|
||||||
fullTrack = property(getFullTrack, None, None, "Match's Docstring")
|
fullTrack = property(getFullTrack, None, None, "Match's Docstring")
|
||||||
|
|
||||||
|
@ -159,4 +157,5 @@ class Track(LastfmBase):
|
||||||
from api import Api
|
from api import Api
|
||||||
from error import LastfmError
|
from error import LastfmError
|
||||||
from user import User
|
from user import User
|
||||||
from tag import Tag
|
from tag import Tag
|
||||||
|
from stats import Stats
|
17
src/user.py
17
src/user.py
|
@ -13,14 +13,18 @@ class User(LastfmBase):
|
||||||
name = None,
|
name = None,
|
||||||
url = None,
|
url = None,
|
||||||
image = None,
|
image = None,
|
||||||
weight = None):
|
stats = None):
|
||||||
if not isinstance(api, Api):
|
if not isinstance(api, Api):
|
||||||
raise LastfmError("api reference must be supplied as an argument")
|
raise LastfmError("api reference must be supplied as an argument")
|
||||||
self.__api = api
|
self.__api = api
|
||||||
self.__name = name
|
self.__name = name
|
||||||
self.__url = url
|
self.__url = url
|
||||||
self.__image = image
|
self.__image = image
|
||||||
self.__weight = weight
|
self.__stats = stats and Stats(
|
||||||
|
subject = self,
|
||||||
|
match = stats.match,
|
||||||
|
weight = stats.weight
|
||||||
|
)
|
||||||
|
|
||||||
def getName(self):
|
def getName(self):
|
||||||
return self.__name
|
return self.__name
|
||||||
|
@ -31,8 +35,8 @@ class User(LastfmBase):
|
||||||
def getImage(self):
|
def getImage(self):
|
||||||
return self.__image
|
return self.__image
|
||||||
|
|
||||||
def getWeight(self):
|
def getStats(self):
|
||||||
return self.__weight
|
return self.__stats
|
||||||
|
|
||||||
name = property(getName, None, None, "Name's Docstring")
|
name = property(getName, None, None, "Name's Docstring")
|
||||||
|
|
||||||
|
@ -40,7 +44,7 @@ class User(LastfmBase):
|
||||||
|
|
||||||
image = property(getImage, None, None, "Image's Docstring")
|
image = property(getImage, None, None, "Image's Docstring")
|
||||||
|
|
||||||
weight = property(getWeight, None, None, "Weight's Docstring")
|
stats = property(getStats, None, None, "Weight's Docstring")
|
||||||
|
|
||||||
def getEvents(self):
|
def getEvents(self):
|
||||||
pass
|
pass
|
||||||
|
@ -141,4 +145,5 @@ class User(LastfmBase):
|
||||||
return "<lastfm.User: %s>" % self.name
|
return "<lastfm.User: %s>" % self.name
|
||||||
|
|
||||||
from api import Api
|
from api import Api
|
||||||
from error import LastfmError
|
from error import LastfmError
|
||||||
|
from stats import Stats
|
Loading…
Reference in New Issue