diff --git a/maloja/thirdparty/common/lastfm.py b/maloja/thirdparty/common/lastfm.py new file mode 100644 index 0000000..a481a47 --- /dev/null +++ b/maloja/thirdparty/common/lastfm.py @@ -0,0 +1,14 @@ +import hashlib +import urllib + +class LastFMInterface: + def query_compose(self,parameters): + m = hashlib.md5() + keys = sorted(str(k) for k in parameters) + m.update(self.utf("".join(str(k) + str(parameters[k]) for k in keys))) + m.update(self.utf(get_settings("LASTFM_API_SECRET"))) + sig = m.hexdigest() + return urllib.parse.urlencode(parameters) + "&api_sig=" + sig + + def utf(self,st): + return st.encode(encoding="UTF-8") diff --git a/maloja/thirdparty/scrobble/__init__.py b/maloja/thirdparty/scrobble/__init__.py new file mode 100644 index 0000000..a1c1b68 --- /dev/null +++ b/maloja/thirdparty/scrobble/__init__.py @@ -0,0 +1,20 @@ +import xml.etree.ElementTree as ElementTree +import urllib + +class ScrobbleInterface: + + required_settings = [] + activated_setting = "" + + def active(self): + return ( + all(get_settings(settingname) not in [None,"ASK"] for settingname in self.required_settings) and + get_settings(self.activated_setting) + ) + + def scrobble(self,artists,title,timestamp): + response = urllib.request.urlopen(self.scrobbleurl,data=self.postdata(artists,title,timestamp)) + responsedata = response.read() + if self.response_type == "xml": + data = ElementTree.fromstring(responsedata) + return self.parse_response(data) diff --git a/maloja/thirdparty/scrobble/lastfm.py b/maloja/thirdparty/scrobble/lastfm.py new file mode 100644 index 0000000..f7dbd60 --- /dev/null +++ b/maloja/thirdparty/scrobble/lastfm.py @@ -0,0 +1,26 @@ +from . import ScrobbleInterface + +from doreah.settings import get_settings + +class LastFMScrobbler(ScrobbleInterface,LastFMInterface): + + scrobbleurl = "http://ws.audioscrobbler.com/2.0/" + required_settings = [ + "LASTFM_API_KEY", + "LASTFM_API_SK", + "LASTFM_API_SECRET" + ] + activated_setting = "SCROBBLE_LASTFM" + + def parse_response(self,data): + return data.attrib.get("status") == "ok" and data.find("scrobbles").attrib.get("ignored") == "0" + + def postdata(self,artists,title,timestamp): + return self.query_compose({ + "method":"track.scrobble", + "artist[0]":", ".join(artists), + "track[0]":title, + "timestamp":timestamp, + "api_key":get_settings("LASTFM_API_KEY"), + "sk":get_settings("LASTFM_API_SK") + })