tag, tasteometer and track module are now complete

This commit is contained in:
Abhinav Sarkar 2008-08-17 18:42:32 +00:00
parent 5518193bc2
commit 4646a6cac0
5 changed files with 197 additions and 34 deletions

View File

@ -175,7 +175,7 @@ class Api(object):
type1, type2, type1, type2,
value1, value2, value1, value2,
limit = None): limit = None):
return Tasteometer(self, type1, type2, value1, value2, limit) return Tasteometer.compare(self, type1, type2, value1, value2, limit)
def getTrack(self, name, artist = None): def getTrack(self, name, artist = None):
if isinstance(artist, Artist): if isinstance(artist, Artist):

View File

@ -114,7 +114,9 @@ class Artist(LastfmBase):
@property @property
def similar(self): def similar(self):
"""artists similar to this artist""" """artists similar to this artist"""
return self.getSimilar() if self.__similar is None:
return self.getSimilar()
return self.__similar
@property @property
def mostSimilar(self): def mostSimilar(self):

View File

@ -12,13 +12,18 @@ class Tag(LastfmBase):
api, api,
name = None, name = None,
url = None, url = None,
streamable = None): streamable = 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.__streamable = streamable self.__streamable = streamable
self.__stats = stats and Stats(
subject = self,
count = stats.count
)
self.__similar = None self.__similar = None
self.__topAlbums = None self.__topAlbums = None
self.__topArtists = None self.__topArtists = None
@ -39,6 +44,10 @@ class Tag(LastfmBase):
"""is the tag streamable""" """is the tag streamable"""
return self.__streamable return self.__streamable
@property
def stats(self):
return self.__stats
@property @property
def similar(self): def similar(self):
"""tags similar to this tag""" """tags similar to this tag"""
@ -155,14 +164,52 @@ class Tag(LastfmBase):
@staticmethod @staticmethod
def getTopTags(api): def getTopTags(api):
pass params = {'method': 'tag.getTopTags'}
data = api._fetchData(params).find('toptags')
return [
Tag(
api,
name = t.findtext('name'),
url = t.findtext('url'),
stats = Stats(
subject = t.findtext('name'),
count = int(t.findtext('count')),
)
)
for t in data.findall('tag')
]
@staticmethod @staticmethod
def search(api, def search(api,
tag, tag,
limit = None, limit = None,
page = None): page = None):
pass params = {'method': 'tag.search', 'tag': tag}
if limit:
params.update({'limit': limit})
if page:
params.update({'page': page})
data = api._fetchData(params).find('results')
return SearchResult(
type = 'tag',
searchTerms = data.find("{%s}Query" % SearchResult.xmlns).attrib['searchTerms'],
startPage = int(data.find("{%s}Query" % SearchResult.xmlns).attrib['startPage']),
totalResults = int(data.findtext("{%s}totalResults" % SearchResult.xmlns)),
startIndex = int(data.findtext("{%s}startIndex" % SearchResult.xmlns)),
itemsPerPage = int(data.findtext("{%s}itemsPerPage" % SearchResult.xmlns)),
matches = [
Tag(
api,
name = t.findtext('name'),
url = t.findtext('url'),
stats = Stats(
subject = t.findtext('name'),
count = int(t.findtext('count')),
)
)
for t in data.findall('tagmatches/tag')
]
)
@staticmethod @staticmethod
def hashFunc(*args, **kwds): def hashFunc(*args, **kwds):
@ -188,4 +235,5 @@ from error import LastfmError
from album import Album from album import Album
from artist import Artist from artist import Artist
from track import Track from track import Track
from stats import Stats from stats import Stats
from search import SearchResult

View File

@ -34,7 +34,31 @@ class Tasteometer(object):
type1, type2, type1, type2,
value1, value2, value1, value2,
limit = None): limit = None):
pass params = {
'method': 'tasteometer.compare',
'type1': type1,
'type2': type2,
'value1': value1,
'value2': value2
}
if limit is not None:
params.update({'limit': limit})
data = api._fetchData(params).find('comparison/result')
return Tasteometer(
score = float(data.findtext('score')),
matches = int(data.find('artists').attrib['matches']),
artists = [
Artist(
api,
name = a.findtext('name'),
url = a.findtext('url'),
image = dict([(i.get('size'), i.text) for i in a.findall('image')]),
)
for a in data.findall('artists/artist')
]
)
def __repr__(self): def __repr__(self):
return "<lastfm.Tasteometer>" return "<lastfm.Tasteometer>"

View File

@ -31,9 +31,13 @@ class Track(LastfmBase):
subject = self, subject = self,
match = stats.match, match = stats.match,
playcount = stats.playcount, playcount = stats.playcount,
rank = stats.rank rank = stats.rank,
listeners = stats.listeners,
) )
self.__fullTrack = fullTrack self.__fullTrack = fullTrack
self.__similar = None
self.__topFans = None
self.__topTags = None
@property @property
def name(self): def name(self):
@ -89,50 +93,99 @@ class Track(LastfmBase):
params.update({'mbid': mbid}) params.update({'mbid': mbid})
return params return params
def getSimilar(self,
artist = None,
track = None,
mbid = None):
params = self.__checkParams({'method': 'track.getsimilar'}, artist, track, mbid)
data = self.__api._fetchData(params).find('similartracks')
@property @property
def similar(self): def similar(self):
"""tracks similar to this track""" """tracks similar to this track"""
return self.getSimilar() if self.__similar is None:
params = self.__checkParams(
{'method': 'track.getsimilar'},
self.artist.name,
self.name,
self.mbid
)
data = self.__api._fetchData(params).find('similartracks')
self.__similar = [
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'),
stats = Stats(
subject = t.findtext('name'),
match = float(t.findtext('match'))
),
streamable = (t.findtext('streamable') == '1'),
fullTrack = (t.find('streamable').attrib['fulltrack'] == '1'),
image = dict([(i.get('size'), i.text) for i in t.findall('image')]),
)
for t in data.findall('track')
]
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)
def getTopFans(self,
artist = None,
track = None,
mbid = None):
params = self.__checkParams({'method': 'track.gettopfans'}, artist, track, mbid)
data = self.__api._fetchData(params).find('topfans')
@property @property
def topFans(self): def topFans(self):
"""top fans of the track""" """top fans of the track"""
return self.getTopFans() if self.__topFans is None:
params = self.__checkParams(
{'method': 'track.gettopfans'},
self.artist.name,
self.name,
self.mbid
)
data = self.__api._fetchData(params).find('topfans')
self.__topFans = [
User(
self.__api,
name = u.findtext('name'),
url = u.findtext('url'),
image = dict([(i.get('size'), i.text) for i in u.findall('image')]),
stats = Stats(
subject = u.findtext('name'),
weight = int(u.findtext('weight'))
)
)
for u in data.findall('user')
]
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)
def getTopTags(self,
artist = None,
track = None,
mbid = None):
params = self.__checkParams({'method': 'track.gettoptags'}, artist, track, mbid)
data = self.__api._fetchData(params).find('toptags')
@property @property
def topTags(self): def topTags(self):
"""top tags for the track""" """top tags for the track"""
return self.getTopTags() if self.__topTags is None:
params = self.__checkParams(
{'method': 'track.gettoptags'},
self.artist.name,
self.name,
self.mbid
)
data = self.__api._fetchData(params).find('toptags')
self.__topTags = [
Tag(
self.__api,
name = t.findtext('name'),
url = t.findtext('url'),
stats = Stats(
subject = t.findtext('name'),
count = int(t.findtext('count')),
)
)
for t in data.findall('tag')
]
return self.__topTags
@property @property
def topTag(self): def topTag(self):
@ -144,7 +197,41 @@ class Track(LastfmBase):
artist = None, artist = None,
limit = None, limit = None,
page = None): page = None):
pass params = {'method': 'track.search', 'track': track}
if artist is not None:
params.update({'artist': artist})
if limit is not None:
params.update({'limit': limit})
if page is not None:
params.update({'page': page})
data = api._fetchData(params).find('results')
return SearchResult(
type = 'track',
searchTerms = data.find("{%s}Query" % SearchResult.xmlns).attrib['searchTerms'],
startPage = int(data.find("{%s}Query" % SearchResult.xmlns).attrib['startPage']),
totalResults = int(data.findtext("{%s}totalResults" % SearchResult.xmlns)),
startIndex = int(data.findtext("{%s}startIndex" % SearchResult.xmlns)),
itemsPerPage = int(data.findtext("{%s}itemsPerPage" % SearchResult.xmlns)),
matches = [
Track(
api,
name = t.findtext('name'),
artist = Artist(
api,
name = t.findtext('artist')
),
url = t.findtext('url'),
stats = Stats(
subject = t.findtext('name'),
listeners = int(t.findtext('listeners'))
),
streamable = (t.findtext('streamable') == '1'),
fullTrack = (t.find('streamable').attrib['fulltrack'] == '1'),
image = dict([(i.get('size'), i.text) for i in t.findall('image')]),
)
for t in data.findall('trackmatches/track')
]
)
@staticmethod @staticmethod
def hashFunc(*args, **kwds): def hashFunc(*args, **kwds):
@ -175,4 +262,6 @@ 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 from stats import Stats
from artist import Artist
from search import SearchResult