implemented some methods in user.py

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

View File

@ -13,7 +13,8 @@ class User(LastfmBase):
name = None,
url = None,
image = None,
stats = None):
stats = None,
mostRecentTrack = None):
if not isinstance(api, Api):
raise LastfmError("api reference must be supplied as an argument")
self.__api = api
@ -26,6 +27,10 @@ class User(LastfmBase):
weight = stats.weight
)
self.__events = None
self.__pastEvents = None
self.__friends = None
self.__lovedTracks = None
self.__mostRecentTrack = mostRecentTrack
@property
def name(self):
@ -61,17 +66,65 @@ class User(LastfmBase):
@property
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,
recentTracks = False,
recentTrack = False,
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
def friends(self):
"""friends of the user"""
return self.getFriends()
if self.__friends is None:
self.__friends = self.getFriends()
return self.__friends
def getNeighbours(self, limit = None):
pass
@ -86,6 +139,34 @@ class User(LastfmBase):
"""playlists of the user"""
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):
pass
@ -201,7 +282,12 @@ class User(LastfmBase):
def __repr__(self):
return "<lastfm.User: %s>" % self.name
from datetime import datetime
import time
from api import Api
from artist import Artist
from error import LastfmError
from event import Event
from stats import Stats
from track import Track