maloja/maloja/thirdparty/lastfm.py

74 lines
2.2 KiB
Python

from . import MetadataInterface, ProxyScrobbleInterface, utf
import hashlib
import urllib.parse, urllib.request
from doreah.logging import log
class LastFM(MetadataInterface, ProxyScrobbleInterface):
name = "LastFM"
identifier = "lastfm"
settings = {
"apikey":"LASTFM_API_KEY",
"sk":"LASTFM_API_SK",
"secret":"LASTFM_API_SECRET",
"username":"LASTFM_USERNAME",
"password":"LASTFM_PASSWORD"
}
proxyscrobble = {
"scrobbleurl": "http://ws.audioscrobbler.com/2.0/",
"response_type":"xml",
"required_settings": ["apikey","sk","secret"],
"activated_setting": "SCROBBLE_LASTFM"
}
metadata = {
"trackurl": "https://ws.audioscrobbler.com/2.0/?method=track.getinfo&track={title}&artist={artist}&api_key={apikey}&format=json",
"response_type":"json",
"response_parse_tree_track": ["track","album","image",-1,"#text"],
"required_settings": ["apikey"],
}
def get_image_artist(self,artist):
return None
# lastfm doesn't provide artist images
def proxyscrobble_parse_response(self,data):
return data.attrib.get("status") == "ok" and data.find("scrobbles").attrib.get("ignored") == "0"
def proxyscrobble_postdata(self,artists,title,timestamp):
return self.query_compose({
"method":"track.scrobble",
"artist[0]":", ".join(artists),
"track[0]":title,
"timestamp":timestamp,
"api_key":self.settings["apikey"],
"sk":self.settings["sk"]
})
def authorize(self):
try:
result = self.request(
self.proxyscrobble['scrobbleurl'],
self.query_compose({
"method":"auth.getMobileSession",
"username":self.settings["username"],
"password":self.settings["password"],
"api_key":self.settings["apikey"]
}),
responsetype="xml"
)
self.settings["sk"] = result.find("session").findtext("key")
except Exception as e:
pass
#log("Error while authenticating with LastFM: " + repr(e))
# creates signature and returns full query string
def query_compose(self,parameters):
m = hashlib.md5()
keys = sorted(str(k) for k in parameters)
m.update(utf("".join(str(k) + str(parameters[k]) for k in keys)))
m.update(utf(self.settings["secret"]))
sig = m.hexdigest()
return urllib.parse.urlencode(parameters) + "&api_sig=" + sig