From 08bd352641cd5a4749db4f282253d960d3e59a9f Mon Sep 17 00:00:00 2001
From: krateng <git.noreply@krateng.ch>
Date: Wed, 6 Apr 2022 22:05:41 +0200
Subject: [PATCH] Adapted listenbrainz API to new architecture

---
 maloja/apis/_apikeys.py     |  5 +++--
 maloja/apis/_base.py        |  6 ++----
 maloja/apis/listenbrainz.py | 12 +++++++++---
 maloja/apis/native_v1.py    |  5 ++++-
 maloja/database/__init__.py |  4 ++--
 5 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/maloja/apis/_apikeys.py b/maloja/apis/_apikeys.py
index 95fc053..02c9e09 100644
--- a/maloja/apis/_apikeys.py
+++ b/maloja/apis/_apikeys.py
@@ -20,8 +20,9 @@ def api_key_correct(request,args,kwargs):
 	elif "apikey" in kwargs:
 		apikey = kwargs.pop("apikey")
 	else: return False
-	if checkAPIkey(apikey):
-		client = [c for c in apikeystore if apikeystore[c]==apikey][0]
+
+	client = apikeystore.check_and_identify_key(apikey)
+	if client:
 		return {'client':client}
 	else:
 		return False
diff --git a/maloja/apis/_base.py b/maloja/apis/_base.py
index 4177ce3..938c701 100644
--- a/maloja/apis/_base.py
+++ b/maloja/apis/_base.py
@@ -89,12 +89,10 @@ class APIHandler:
 		return method(path,keys)
 
 
-	def scrobble(self,artiststr,titlestr,time=None,duration=None,album=None):
-		logmsg = f"API {self.__apiname__} receiving scrobble: ARTISTS: {artiststr}, TRACK: {titlestr}"
-		log(logmsg)
+	def scrobble(self,rawscrobble,client=None):
 
 		# fixing etc is handled by the main scrobble function
 		try:
-			database.incoming_scrobble(artists=[artiststr],title=titlestr,time=time,duration=duration,album=album)
+			return database.incoming_scrobble(rawscrobble,api=self.__apiname__,client=client)
 		except:
 			raise ScrobblingException()
diff --git a/maloja/apis/listenbrainz.py b/maloja/apis/listenbrainz.py
index 7447bb9..6896b6a 100644
--- a/maloja/apis/listenbrainz.py
+++ b/maloja/apis/listenbrainz.py
@@ -2,7 +2,7 @@ from ._base import APIHandler
 from ._exceptions import *
 from .. import database
 import datetime
-from ._apikeys import checkAPIkey
+from ._apikeys import apikeystore
 
 from ..globalconf import malojaconfig
 
@@ -37,7 +37,9 @@ class Listenbrainz(APIHandler):
 		except:
 			raise BadAuthException()
 
-		if not checkAPIkey(token):
+		client = apikeystore.check_and_identify_key(token)
+
+		if not client:
 			raise InvalidAuthException()
 
 		try:
@@ -60,7 +62,11 @@ class Listenbrainz(APIHandler):
 				except:
 					raise MalformedJSONException()
 
-				self.scrobble(artiststr,titlestr,timestamp)
+				self.scrobble({
+					'track_artists':[artiststr],
+					'track_title':titlestr,
+					'scrobble_time':timestamp
+				},client=client)
 
 			return 200,{"status":"ok"}
 
diff --git a/maloja/apis/native_v1.py b/maloja/apis/native_v1.py
index d2011c2..4e930c4 100644
--- a/maloja/apis/native_v1.py
+++ b/maloja/apis/native_v1.py
@@ -248,12 +248,15 @@ def post_scrobble(artist:Multi=None,auth_result=None,**keys):
 		'scrobble_time':int(keys.get('time')) if (keys.get('time') is not None) else None
 	}
 
+	# for logging purposes, don't pass values that we didn't actually supply
+	rawscrobble = {k:rawscrobble[k] for k in rawscrobble if rawscrobble[k]}
+
 	return database.incoming_scrobble(
 		rawscrobble,
 		client='browser' if auth_result.get('doreah_native_auth_check') else auth_result.get('client'),
+		api='native/v1',
 		fix=(keys.get("nofix") is None)
 	)
-	# TODO: malojaclient needs to be converted to proper argument in doreah
 
 
 
diff --git a/maloja/database/__init__.py b/maloja/database/__init__.py
index 66972fd..ea0eebe 100644
--- a/maloja/database/__init__.py
+++ b/maloja/database/__init__.py
@@ -86,13 +86,13 @@ coa = CollectorAgent()
 ##
 ##
 
-def incoming_scrobble(rawscrobble,fix=True,client=None,dbconn=None):
+def incoming_scrobble(rawscrobble,fix=True,client=None,api=None,dbconn=None):
 
 	if (not "track_artists" in rawscrobble) or (len(rawscrobble['track_artists']) == 0) or (not "track_title" in rawscrobble):
 		log(f"Incoming scrobble {rawscrobble} [Source: {client}] is not valid")
 		return {"status":"failure"}
 
-	log(f"Incoming scrobble [{client}]: {rawscrobble}")
+	log(f"Incoming scrobble [Client: {client} | API: {api}]: {rawscrobble}")
 
 	# raw scrobble to processed info
 	scrobbleinfo = {**rawscrobble}