implemented some methods in user.py
This commit is contained in:
parent
291ec6846a
commit
e21be6a3ed
48
src/track.py
48
src/track.py
@ -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
|
||||||
|
96
src/user.py
96
src/user.py
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user