implemented some methods in user.py

This commit is contained in:
Abhinav Sarkar 2008-08-18 16:12:46 +00:00
parent 291ec6846a
commit e21be6a3ed
2 changed files with 122 additions and 22 deletions

View File

@ -17,7 +17,9 @@ class Track(LastfmBase):
artist = None, artist = None,
image = None, image = None,
stats = None, stats = None,
fullTrack = None): fullTrack = None,
playedOn = None,
lovedOn = 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
@ -35,6 +37,8 @@ class Track(LastfmBase):
listeners = stats.listeners, listeners = stats.listeners,
) )
self.__fullTrack = fullTrack self.__fullTrack = fullTrack
self.__playedOn = playedOn
self.__lovedOn = lovedOn
self.__similar = None self.__similar = None
self.__topFans = None self.__topFans = None
self.__topTags = None self.__topTags = None
@ -73,12 +77,22 @@ class Track(LastfmBase):
def stats(self): def stats(self):
"""stats of the track""" """stats of the track"""
return self.__stats return self.__stats
@property @property
def fullTrack(self): def fullTrack(self):
"""is the full track streamable""" """is the full track streamable"""
return self.__fullTrack return self.__fullTrack
@property
def playedOn(self):
"""datetime the track was last played"""
return self.__playedOn
@property
def lovedOn(self):
"""datetime the track was marked 'loved'"""
return self.__lovedOn
def __checkParams(self, def __checkParams(self,
params, params,
artist = None, artist = None,
@ -86,13 +100,13 @@ class Track(LastfmBase):
mbid = None): mbid = None):
if not ((artist and track) or mbid): if not ((artist and track) or mbid):
raise LastfmError("either (artist and track) or mbid has to be given as argument.") raise LastfmError("either (artist and track) or mbid has to be given as argument.")
if artist and track: if artist and track:
params.update({'artist': artist, 'track': track}) params.update({'artist': artist, 'track': track})
elif mbid: elif mbid:
params.update({'mbid': mbid}) params.update({'mbid': mbid})
return params return params
@property @property
def similar(self): def similar(self):
"""tracks similar to this track""" """tracks similar to this track"""
@ -126,12 +140,12 @@ class Track(LastfmBase):
for t in data.findall('track') for t in data.findall('track')
] ]
return self.__similar return self.__similar
@property @property
def mostSimilar(self): def mostSimilar(self):
"""track most similar to this track""" """track most similar to this track"""
return (len(self.similar) and self.similar[0] or None) return (len(self.similar) and self.similar[0] or None)
@property @property
def topFans(self): def topFans(self):
"""top fans of the track""" """top fans of the track"""
@ -157,11 +171,11 @@ class Track(LastfmBase):
for u in data.findall('user') for u in data.findall('user')
] ]
return self.__topFans return self.__topFans
@property @property
def topFan(self): def topFan(self):
return (len(self.topFans) and self.topFans[0] or None) return (len(self.topFans) and self.topFans[0] or None)
@property @property
def topTags(self): def topTags(self):
"""top tags for the track""" """top tags for the track"""
@ -186,11 +200,11 @@ class Track(LastfmBase):
for t in data.findall('tag') for t in data.findall('tag')
] ]
return self.__topTags return self.__topTags
@property @property
def topTag(self): def topTag(self):
return (len(self.topTags) and self.topTags[0] or None) return (len(self.topTags) and self.topTags[0] or None)
@staticmethod @staticmethod
def search(api, def search(api,
track, track,
@ -232,17 +246,17 @@ class Track(LastfmBase):
for t in data.findall('trackmatches/track') for t in data.findall('trackmatches/track')
] ]
) )
@staticmethod @staticmethod
def hashFunc(*args, **kwds): def hashFunc(*args, **kwds):
try: try:
return hash("%s%s" % (kwds['name'], hash(kwds['artist']))) return hash("%s%s" % (kwds['name'], hash(kwds['artist'])))
except KeyError: except KeyError:
raise LastfmError("name and artist have to be provided for hashing") raise LastfmError("name and artist have to be provided for hashing")
def __hash__(self): def __hash__(self):
return self.__class__.hashFunc(name = self.name, artist = self.artist) return self.__class__.hashFunc(name = self.name, artist = self.artist)
def __eq__(self, other): def __eq__(self, other):
if self.mbid and other.mbid: if self.mbid and other.mbid:
return self.mbid == other.mbid return self.mbid == other.mbid
@ -251,10 +265,10 @@ class Track(LastfmBase):
if (self.name and self.artist) and (other.name and other.artist): if (self.name and self.artist) and (other.name and other.artist):
return (self.name == other.name) and (self.artist == other.artist) return (self.name == other.name) and (self.artist == other.artist)
return super(Track, self).__eq__(other) return super(Track, self).__eq__(other)
def __lt__(self, other): def __lt__(self, other):
return self.name < other.name return self.name < other.name
def __repr__(self): def __repr__(self):
return "<lastfm.Track: '%s' by %s>" % (self.name, self.artist.name) return "<lastfm.Track: '%s' by %s>" % (self.name, self.artist.name)
@ -264,4 +278,4 @@ from error import LastfmError
from search import SearchResult from search import SearchResult
from stats import Stats from stats import Stats
from tag import Tag from tag import Tag
from user import User from user import User

View File

@ -13,7 +13,8 @@ class User(LastfmBase):
name = None, name = None,
url = None, url = None,
image = None, image = None,
stats = None): stats = None,
mostRecentTrack = 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
@ -26,6 +27,10 @@ class User(LastfmBase):
weight = stats.weight weight = stats.weight
) )
self.__events = None self.__events = None
self.__pastEvents = None
self.__friends = None
self.__lovedTracks = None
self.__mostRecentTrack = mostRecentTrack
@property @property
def name(self): def name(self):
@ -61,17 +66,65 @@ class User(LastfmBase):
@property @property
def pastEvents(self): def pastEvents(self):
pass if self.__pastEvents is None:
params = {'method': 'user.getpastevents', 'user': self.name}
data = self.__api._fetchData(params).find('events')
self.__pastEvents = [
Event.createFromData(self.__api, e)
for e in data.findall('event')
]
return self.__pastEvents
def getFriends(self, def getFriends(self,
recentTracks = False, recentTrack = False,
limit = None): limit = None):
pass params = {'method': 'user.getfriends', 'user': self.name}
if recentTrack:
params.update({'recenttracks': 'true'})
if limit is not None:
params.update({'limit': limit})
data = self.__api._fetchData(params).find('friends')
if recentTrack:
return [
User(
self.__api,
name = u.findtext('name'),
image = dict([(i.get('size'), i.text) for i in u.findall('image')]),
url = u.findtext('url'),
mostRecentTrack = Track(
self.__api,
name = u.findtext('recenttrack/name'),
mbid = u.findtext('recenttrack/mbid'),
url = u.findtext('recenttrack/url'),
artist = Artist(
self.__api,
name = u.findtext('recenttrack/artist/name'),
mbid = u.findtext('recenttrack/artist/mbid'),
url = u.findtext('recenttrack/artist/url'),
),
),
)
for u in data.findall('user')
]
else:
return [
User(
self.__api,
name = u.findtext('name'),
image = dict([(i.get('size'), i.text) for i in u.findall('image')]),
url = u.findtext('url'),
)
for u in data.findall('user')
]
@property @property
def friends(self): def friends(self):
"""friends of the user""" """friends of the user"""
return self.getFriends() if self.__friends is None:
self.__friends = self.getFriends()
return self.__friends
def getNeighbours(self, limit = None): def getNeighbours(self, limit = None):
pass pass
@ -86,6 +139,34 @@ class User(LastfmBase):
"""playlists of the user""" """playlists of the user"""
pass pass
@property
def lovedTracks(self):
if self.__lovedTracks is None:
params = {'method': 'user.getlovedtracks', 'user': self.name}
data = self.__api._fetchData(params).find('lovedtracks')
self.__lovedTracks = [
Track(
self.__api,
name = t.findtext('name'),
artist = Artist(
self.__api,
name = t.findtext('artist/name'),
mbid = t.findtext('artist/mbid'),
url = t.findtext('artist/url'),
),
mbid = t.findtext('mbid'),
image = dict([(i.get('size'), i.text) for i in t.findall('image')]),
lovedOn = datetime(*(
time.strptime(
t.findtext('date').strip(),
'%d %b %Y, %H:%M'
)[0:6])
)
)
for t in data.findall('track')
]
return self.__lovedTracks
def getRecentTracks(self, limit = None): def getRecentTracks(self, limit = None):
pass pass
@ -201,7 +282,12 @@ class User(LastfmBase):
def __repr__(self): def __repr__(self):
return "<lastfm.User: %s>" % self.name return "<lastfm.User: %s>" % self.name
from datetime import datetime
import time
from api import Api from api import Api
from artist import Artist
from error import LastfmError from error import LastfmError
from event import Event from event import Event
from stats import Stats from stats import Stats
from track import Track