From fadbb9a7ab9244592137288d074442d0272cd592 Mon Sep 17 00:00:00 2001
From: Philipp Wolfer <ph.wolfer@gmail.com>
Date: Sun, 24 Oct 2021 11:15:47 +0000
Subject: [PATCH] Added a Maloja plugin to submit listenings (!1383)

---
 api/config/settings/common.py                 |  1 +
 api/funkwhale_api/contrib/maloja/__init__.py  |  0
 .../contrib/maloja/funkwhale_ready.py         | 45 +++++++++++++++++++
 .../contrib/maloja/funkwhale_startup.py       | 14 ++++++
 changes/changelog.d/maloja.enhancement        |  1 +
 5 files changed, 61 insertions(+)
 create mode 100644 api/funkwhale_api/contrib/maloja/__init__.py
 create mode 100644 api/funkwhale_api/contrib/maloja/funkwhale_ready.py
 create mode 100644 api/funkwhale_api/contrib/maloja/funkwhale_startup.py
 create mode 100644 changes/changelog.d/maloja.enhancement

diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index dd040d1454..b86b552139 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -88,6 +88,7 @@ sys.path.append(FUNKWHALE_PLUGINS_PATH)
 CORE_PLUGINS = [
     "funkwhale_api.contrib.scrobbler",
     "funkwhale_api.contrib.listenbrainz",
+    "funkwhale_api.contrib.maloja",
 ]
 
 LOAD_CORE_PLUGINS = env.bool("FUNKWHALE_LOAD_CORE_PLUGINS", default=True)
diff --git a/api/funkwhale_api/contrib/maloja/__init__.py b/api/funkwhale_api/contrib/maloja/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/api/funkwhale_api/contrib/maloja/funkwhale_ready.py b/api/funkwhale_api/contrib/maloja/funkwhale_ready.py
new file mode 100644
index 0000000000..0dae6e3c6d
--- /dev/null
+++ b/api/funkwhale_api/contrib/maloja/funkwhale_ready.py
@@ -0,0 +1,45 @@
+import json
+
+from config import plugins
+from .funkwhale_startup import PLUGIN
+
+
+class MalojaException(Exception):
+    pass
+
+
+@plugins.register_hook(plugins.LISTENING_CREATED, PLUGIN)
+def submit_listen(listening, conf, **kwargs):
+    server_url = conf["server_url"]
+    api_key = conf["api_key"]
+    if not server_url or not api_key:
+        return
+
+    logger = PLUGIN["logger"]
+    logger.info("Submitting listening to Majola at %s", server_url)
+    payload = get_payload(listening, api_key)
+    logger.debug("Majola payload: %r", payload)
+    url = server_url.rstrip("/") + "/apis/mlj_1/newscrobble"
+    session = plugins.get_session()
+    response = session.post(url, payload)
+    response.raise_for_status()
+    details = json.loads(response.text)
+    if details["status"] == "success":
+        logger.info("Majola listening submitted successfully")
+    else:
+        raise MalojaException(response.text)
+
+
+def get_payload(listening, api_key):
+    track = listening.track
+    payload = {
+        "key": api_key,
+        "artists": track.artist.name,
+        "title": track.title,
+        "time": int(listening.creation_date.timestamp()),
+    }
+
+    if track.album:
+        payload["album"] = track.album.title
+
+    return payload
diff --git a/api/funkwhale_api/contrib/maloja/funkwhale_startup.py b/api/funkwhale_api/contrib/maloja/funkwhale_startup.py
new file mode 100644
index 0000000000..a9dd01d43a
--- /dev/null
+++ b/api/funkwhale_api/contrib/maloja/funkwhale_startup.py
@@ -0,0 +1,14 @@
+from config import plugins
+
+PLUGIN = plugins.get_plugin_config(
+    name="maloja",
+    label="Maloja",
+    description="A plugin that allows you to submit your listens to your Maloja server.",
+    homepage="https://docs.funkwhale.audio/users/builtinplugins.html#maloja-plugin",
+    version="0.1",
+    user=True,
+    conf=[
+        {"name": "server_url", "type": "text", "label": "Maloja server URL"},
+        {"name": "api_key", "type": "text", "label": "Your Maloja API key"},
+    ],
+)
diff --git a/changes/changelog.d/maloja.enhancement b/changes/changelog.d/maloja.enhancement
new file mode 100644
index 0000000000..07c3066f8d
--- /dev/null
+++ b/changes/changelog.d/maloja.enhancement
@@ -0,0 +1 @@
+Added a Maloja plugin to submit listenings
\ No newline at end of file
-- 
GitLab