* Added Scrobbler.scrobble_many(...) method
* Fixed issue #38: Moved AuthenticatedUser.get_cover_image() to User.get_image() and all the other "user.getInfo" related methods to User as well. * Fixed issue #39: Added PERIOD_7DAYS constant
This commit is contained in:
parent
4772a67b2e
commit
c0da0cc880
176
pylast.py
176
pylast.py
|
@ -63,6 +63,7 @@ EVENT_MAYBE_ATTENDING = '1'
|
||||||
EVENT_NOT_ATTENDING = '2'
|
EVENT_NOT_ATTENDING = '2'
|
||||||
|
|
||||||
PERIOD_OVERALL = 'overall'
|
PERIOD_OVERALL = 'overall'
|
||||||
|
PERIOD_7DAYs = "7day"
|
||||||
PERIOD_3MONTHS = '3month'
|
PERIOD_3MONTHS = '3month'
|
||||||
PERIOD_6MONTHS = '6month'
|
PERIOD_6MONTHS = '6month'
|
||||||
PERIOD_12MONTHS = '12month'
|
PERIOD_12MONTHS = '12month'
|
||||||
|
@ -943,6 +944,16 @@ def _string_output(funct):
|
||||||
|
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
def _pad_list(given_list, desired_length, padding = None):
|
||||||
|
"""
|
||||||
|
Pads a list to be of the desired_length.
|
||||||
|
"""
|
||||||
|
|
||||||
|
while len(given_list) < desired_length:
|
||||||
|
given_list.append(padding)
|
||||||
|
|
||||||
|
return given_list
|
||||||
|
|
||||||
class _BaseObject(object):
|
class _BaseObject(object):
|
||||||
"""An abstract webservices object."""
|
"""An abstract webservices object."""
|
||||||
|
|
||||||
|
@ -2826,10 +2837,67 @@ class User(_BaseObject):
|
||||||
|
|
||||||
return seq
|
return seq
|
||||||
|
|
||||||
|
def get_id(self):
|
||||||
|
"""Returns the user id."""
|
||||||
|
|
||||||
|
doc = self._request("user.getInfo", True)
|
||||||
|
|
||||||
|
return _extract(doc, "id")
|
||||||
|
|
||||||
|
def get_language(self):
|
||||||
|
"""Returns the language code of the language used by the user."""
|
||||||
|
|
||||||
|
doc = self._request("user.getInfo", True)
|
||||||
|
|
||||||
|
return _extract(doc, "lang")
|
||||||
|
|
||||||
|
def get_country(self):
|
||||||
|
"""Returns the name of the country of the user."""
|
||||||
|
|
||||||
|
doc = self._request("user.getInfo", True)
|
||||||
|
|
||||||
|
return Country(_extract(doc, "country"), self.network)
|
||||||
|
|
||||||
|
def get_age(self):
|
||||||
|
"""Returns the user's age."""
|
||||||
|
|
||||||
|
doc = self._request("user.getInfo", True)
|
||||||
|
|
||||||
|
return _number(_extract(doc, "age"))
|
||||||
|
|
||||||
|
def get_gender(self):
|
||||||
|
"""Returns the user's gender. Either USER_MALE or USER_FEMALE."""
|
||||||
|
|
||||||
|
doc = self._request("user.getInfo", True)
|
||||||
|
|
||||||
|
value = _extract(doc, "gender")
|
||||||
|
|
||||||
|
if value == 'm':
|
||||||
|
return USER_MALE
|
||||||
|
elif value == 'f':
|
||||||
|
return USER_FEMALE
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def is_subscriber(self):
|
||||||
|
"""Returns whether the user is a subscriber or not. True or False."""
|
||||||
|
|
||||||
|
doc = self._request("user.getInfo", True)
|
||||||
|
|
||||||
|
return _extract(doc, "subscriber") == "1"
|
||||||
|
|
||||||
|
def get_playcount(self):
|
||||||
|
"""Returns the user's playcount so far."""
|
||||||
|
|
||||||
|
doc = self._request("user.getInfo", True)
|
||||||
|
|
||||||
|
return _number(_extract(doc, "playcount"))
|
||||||
|
|
||||||
def get_top_albums(self, period = PERIOD_OVERALL):
|
def get_top_albums(self, period = PERIOD_OVERALL):
|
||||||
"""Returns the top albums played by a user.
|
"""Returns the top albums played by a user.
|
||||||
* period: The period of time. Possible values:
|
* period: The period of time. Possible values:
|
||||||
o PERIOD_OVERALL
|
o PERIOD_OVERALL
|
||||||
|
o PERIOD_7DAYS
|
||||||
o PERIOD_3MONTHS
|
o PERIOD_3MONTHS
|
||||||
o PERIOD_6MONTHS
|
o PERIOD_6MONTHS
|
||||||
o PERIOD_12MONTHS
|
o PERIOD_12MONTHS
|
||||||
|
@ -2854,6 +2922,7 @@ class User(_BaseObject):
|
||||||
"""Returns the top artists played by a user.
|
"""Returns the top artists played by a user.
|
||||||
* period: The period of time. Possible values:
|
* period: The period of time. Possible values:
|
||||||
o PERIOD_OVERALL
|
o PERIOD_OVERALL
|
||||||
|
o PERIOD_7DAYS
|
||||||
o PERIOD_3MONTHS
|
o PERIOD_3MONTHS
|
||||||
o PERIOD_6MONTHS
|
o PERIOD_6MONTHS
|
||||||
o PERIOD_12MONTHS
|
o PERIOD_12MONTHS
|
||||||
|
@ -2891,6 +2960,7 @@ class User(_BaseObject):
|
||||||
"""Returns the top tracks played by a user.
|
"""Returns the top tracks played by a user.
|
||||||
* period: The period of time. Possible values:
|
* period: The period of time. Possible values:
|
||||||
o PERIOD_OVERALL
|
o PERIOD_OVERALL
|
||||||
|
o PERIOD_7DAYS
|
||||||
o PERIOD_3MONTHS
|
o PERIOD_3MONTHS
|
||||||
o PERIOD_6MONTHS
|
o PERIOD_6MONTHS
|
||||||
o PERIOD_12MONTHS
|
o PERIOD_12MONTHS
|
||||||
|
@ -3007,6 +3077,13 @@ class User(_BaseObject):
|
||||||
|
|
||||||
return (score, shared_artists_seq)
|
return (score, shared_artists_seq)
|
||||||
|
|
||||||
|
def get_image(self):
|
||||||
|
"""Returns the user's avatar."""
|
||||||
|
|
||||||
|
doc = self._request("user.getInfo", True)
|
||||||
|
|
||||||
|
return _extract(doc, "image")
|
||||||
|
|
||||||
def get_url(self, domain_name = DOMAIN_ENGLISH):
|
def get_url(self, domain_name = DOMAIN_ENGLISH):
|
||||||
"""Returns the url of the user page on the network.
|
"""Returns the url of the user page on the network.
|
||||||
* domain_name: The network's language domain. Possible values:
|
* domain_name: The network's language domain. Possible values:
|
||||||
|
@ -3073,69 +3150,6 @@ class AuthenticatedUser(User):
|
||||||
self.name = _extract(doc, "name")
|
self.name = _extract(doc, "name")
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
def get_id(self):
|
|
||||||
"""Returns the user id."""
|
|
||||||
|
|
||||||
doc = self._request("user.getInfo", True)
|
|
||||||
|
|
||||||
return _extract(doc, "id")
|
|
||||||
|
|
||||||
def get_cover_image(self):
|
|
||||||
"""Returns the user's avatar."""
|
|
||||||
|
|
||||||
doc = self._request("user.getInfo", True)
|
|
||||||
|
|
||||||
return _extract(doc, "image")
|
|
||||||
|
|
||||||
def get_language(self):
|
|
||||||
"""Returns the language code of the language used by the user."""
|
|
||||||
|
|
||||||
doc = self._request("user.getInfo", True)
|
|
||||||
|
|
||||||
return _extract(doc, "lang")
|
|
||||||
|
|
||||||
def get_country(self):
|
|
||||||
"""Returns the name of the country of the user."""
|
|
||||||
|
|
||||||
doc = self._request("user.getInfo", True)
|
|
||||||
|
|
||||||
return Country(_extract(doc, "country"), self.network)
|
|
||||||
|
|
||||||
def get_age(self):
|
|
||||||
"""Returns the user's age."""
|
|
||||||
|
|
||||||
doc = self._request("user.getInfo", True)
|
|
||||||
|
|
||||||
return _number(_extract(doc, "age"))
|
|
||||||
|
|
||||||
def get_gender(self):
|
|
||||||
"""Returns the user's gender. Either USER_MALE or USER_FEMALE."""
|
|
||||||
|
|
||||||
doc = self._request("user.getInfo", True)
|
|
||||||
|
|
||||||
value = _extract(doc, "gender")
|
|
||||||
|
|
||||||
if value == 'm':
|
|
||||||
return USER_MALE
|
|
||||||
elif value == 'f':
|
|
||||||
return USER_FEMALE
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
def is_subscriber(self):
|
|
||||||
"""Returns whether the user is a subscriber or not. True or False."""
|
|
||||||
|
|
||||||
doc = self._request("user.getInfo", True)
|
|
||||||
|
|
||||||
return _extract(doc, "subscriber") == "1"
|
|
||||||
|
|
||||||
def get_playcount(self):
|
|
||||||
"""Returns the user's playcount so far."""
|
|
||||||
|
|
||||||
doc = self._request("user.getInfo", True)
|
|
||||||
|
|
||||||
return _number(_extract(doc, "playcount"))
|
|
||||||
|
|
||||||
def get_recommended_events(self, limit=50):
|
def get_recommended_events(self, limit=50):
|
||||||
"""
|
"""
|
||||||
Returns a sequence of Event objects
|
Returns a sequence of Event objects
|
||||||
|
@ -3650,3 +3664,39 @@ class Scrobbler(object):
|
||||||
"b[0]": _string(album), "n[0]": track_number, "m[0]": mbid}
|
"b[0]": _string(album), "n[0]": track_number, "m[0]": mbid}
|
||||||
|
|
||||||
_ScrobblerRequest(self.submissions_url, params, self.network).execute()
|
_ScrobblerRequest(self.submissions_url, params, self.network).execute()
|
||||||
|
|
||||||
|
def scrobble_many(self, tracks):
|
||||||
|
"""
|
||||||
|
Scrobble several tracks at once.
|
||||||
|
|
||||||
|
tracks: A sequence of a sequence of parameters for each trach. The order of parameters
|
||||||
|
is the same as if passed to the scrobble() method.
|
||||||
|
"""
|
||||||
|
|
||||||
|
remainder = []
|
||||||
|
|
||||||
|
if len(tracks) > 50:
|
||||||
|
remainder = tracks[50:]
|
||||||
|
tracks = tracks[:50]
|
||||||
|
|
||||||
|
params = {"s": self._get_session_id()}
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
for t in tracks:
|
||||||
|
_pad_list(t, 9, "")
|
||||||
|
params["a[%s]" % str(i)] = _string(t[0])
|
||||||
|
params["t[%s]" % str(i)] = _string(t[1])
|
||||||
|
params["i[%s]" % str(i)] = str(t[2])
|
||||||
|
params["o[%s]" % str(i)] = t[3]
|
||||||
|
params["r[%s]" % str(i)] = t[4]
|
||||||
|
params["l[%s]" % str(i)] = str(t[5])
|
||||||
|
params["b[%s]" % str(i)] = _string(t[6])
|
||||||
|
params["n[%s]" % str(i)] = t[7]
|
||||||
|
params["m[%s]" % str(i)] = t[8]
|
||||||
|
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
_ScrobblerRequest(self.submissions_url, params, self.network).execute()
|
||||||
|
|
||||||
|
if remainder:
|
||||||
|
self.scrobble_many(remainder)
|
||||||
|
|
Loading…
Reference in a new issue