From 7dbd704c5ded2a9fb0fd6222e0906c6bf046d420 Mon Sep 17 00:00:00 2001
From: duck <113956421+duckfromdiscord@users.noreply.github.com>
Date: Sat, 11 Nov 2023 17:56:40 -0500
Subject: [PATCH 1/3] make `auth.getMobileSession` return XML
---
maloja/apis/audioscrobbler.py | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/maloja/apis/audioscrobbler.py b/maloja/apis/audioscrobbler.py
index 6699618..350d4a3 100644
--- a/maloja/apis/audioscrobbler.py
+++ b/maloja/apis/audioscrobbler.py
@@ -28,6 +28,15 @@ class Audioscrobbler(APIHandler):
ScrobblingException:(500,{"error":8,"message":"Operation failed"})
}
+ # xml string escaping: https://stackoverflow.com/a/28703510
+ def xml_escape(self, str_xml: str):
+ str_xml = str_xml.replace("&", "&")
+ str_xml = str_xml.replace("<", "<")
+ str_xml = str_xml.replace("<", "<")
+ str_xml = str_xml.replace("\"", """)
+ str_xml = str_xml.replace("'", "'")
+ return str_xml
+
def get_method(self,pathnodes,keys):
return keys.get("method")
@@ -50,7 +59,14 @@ class Audioscrobbler(APIHandler):
client = apikeystore.check_and_identify_key(password)
if client:
sessionkey = self.generate_key(client)
- return 200,{"session":{"key":sessionkey}}
+ return 200,"""
+
+ %s
+ %s
+ 0
+
+
+""" % (self.xml_escape(user), self.xml_escape(sessionkey))
else:
raise InvalidAuthException()
# or username and token (deprecated by lastfm)
From be6b796b20c950bdc3fe7e3142dd9a3b8fdd55bf Mon Sep 17 00:00:00 2001
From: duck <113956421+duckfromdiscord@users.noreply.github.com>
Date: Sat, 11 Nov 2023 18:14:20 -0500
Subject: [PATCH 2/3] `auth.getMobileSession` return XML with token provided
---
maloja/apis/audioscrobbler.py | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/maloja/apis/audioscrobbler.py b/maloja/apis/audioscrobbler.py
index 350d4a3..38f3fd3 100644
--- a/maloja/apis/audioscrobbler.py
+++ b/maloja/apis/audioscrobbler.py
@@ -75,7 +75,14 @@ class Audioscrobbler(APIHandler):
key = apikeystore[client]
if md5(user + md5(key)) == token:
sessionkey = self.generate_key(client)
- return 200,{"session":{"key":sessionkey}}
+ return 200,"""
+
+ %s
+ %s
+ 0
+
+
+""" % (self.xml_escape(user), self.xml_escape(sessionkey))
raise InvalidAuthException()
else:
raise BadAuthException()
From 16b977d874fe2a65ce17df160228acbcefa18807 Mon Sep 17 00:00:00 2001
From: duck <113956421+duckfromdiscord@users.noreply.github.com>
Date: Wed, 3 Jan 2024 21:57:42 -0500
Subject: [PATCH 3/3] allow json format for `authmobile`, default to XML
---
maloja/apis/audioscrobbler.py | 37 ++++++++++++++++++++---------------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/maloja/apis/audioscrobbler.py b/maloja/apis/audioscrobbler.py
index 38f3fd3..7b7194a 100644
--- a/maloja/apis/audioscrobbler.py
+++ b/maloja/apis/audioscrobbler.py
@@ -54,19 +54,22 @@ class Audioscrobbler(APIHandler):
token = keys.get("authToken")
user = keys.get("username")
password = keys.get("password")
+ format = keys.get("format") or "xml" # Audioscrobbler 2.0 uses XML by default
# either username and password
if user is not None and password is not None:
client = apikeystore.check_and_identify_key(password)
if client:
sessionkey = self.generate_key(client)
- return 200,"""
-
- %s
- %s
- 0
-
-
-""" % (self.xml_escape(user), self.xml_escape(sessionkey))
+ if format == "json":
+ return 200,{"session":{"key":sessionkey}}
+ else:
+ return 200,"""
+
+ %s
+ %s
+ 0
+
+""" % (self.xml_escape(user), self.xml_escape(sessionkey))
else:
raise InvalidAuthException()
# or username and token (deprecated by lastfm)
@@ -75,14 +78,16 @@ class Audioscrobbler(APIHandler):
key = apikeystore[client]
if md5(user + md5(key)) == token:
sessionkey = self.generate_key(client)
- return 200,"""
-
- %s
- %s
- 0
-
-
-""" % (self.xml_escape(user), self.xml_escape(sessionkey))
+ if format == "json":
+ return 200,{"session":{"key":sessionkey}}
+ else:
+ return 200,"""
+
+ %s
+ %s
+ 0
+
+""" % (self.xml_escape(user), self.xml_escape(sessionkey))
raise InvalidAuthException()
else:
raise BadAuthException()