tag, tasteometer and track module are now complete
This commit is contained in:
parent
5518193bc2
commit
4646a6cac0
@ -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):
|
||||||
|
@ -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):
|
||||||
|
56
src/tag.py
56
src/tag.py
@ -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
|
@ -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>"
|
||||||
|
143
src/track.py
143
src/track.py
@ -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
|
Loading…
Reference in New Issue
Block a user