From 370508acc4b128a26d992b82c39e8f60a8d588a8 Mon Sep 17 00:00:00 2001 From: bw Date: Thu, 3 Oct 2024 00:50:47 -0700 Subject: [PATCH] add scrobble frontend --- mopidy_subidy/__init__.py | 3 +++ mopidy_subidy/ext.conf | 1 + mopidy_subidy/frontend.py | 29 +++++++++++++++++++++++++++++ mopidy_subidy/subsonic_api.py | 17 +++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 mopidy_subidy/frontend.py diff --git a/mopidy_subidy/__init__.py b/mopidy_subidy/__init__.py index d9f260a..fea914c 100644 --- a/mopidy_subidy/__init__.py +++ b/mopidy_subidy/__init__.py @@ -23,9 +23,12 @@ class SubidyExtension(ext.Extension): schema["password"] = config.Secret() schema["legacy_auth"] = config.Boolean(optional=True) schema["api_version"] = config.String(optional=True) + schema["scrobble"] = config.Boolean(optional=True) return schema def setup(self, registry): from .backend import SubidyBackend + from .frontend import SubidyFrontend registry.add("backend", SubidyBackend) + registry.add("frontend", SubidyFrontend) diff --git a/mopidy_subidy/ext.conf b/mopidy_subidy/ext.conf index e935f13..175ee63 100644 --- a/mopidy_subidy/ext.conf +++ b/mopidy_subidy/ext.conf @@ -5,3 +5,4 @@ username = password = legacy_auth = no api_version = 1.14.0 +scrobble = false diff --git a/mopidy_subidy/frontend.py b/mopidy_subidy/frontend.py new file mode 100644 index 0000000..3325129 --- /dev/null +++ b/mopidy_subidy/frontend.py @@ -0,0 +1,29 @@ +import pykka + +import mopidy_subidy +from mopidy import core +from mopidy_subidy import subsonic_api + +class SubidyFrontend(pykka.ThreadingActor, core.CoreListener): + def __init__(self, config, core): + super().__init__() + subidy_config = config["subidy"] + self.subsonic_api = subsonic_api.SubsonicApi( + url=subidy_config["url"], + username=subidy_config["username"], + password=subidy_config["password"], + app_name=mopidy_subidy.SubidyExtension.dist_name, + legacy_auth=subidy_config["legacy_auth"], + api_version=subidy_config["api_version"], + ) + self.scrobble = subidy_config["scrobble"] + + def track_playback_started(self, tl_track): + if self.scrobble == True: + return self.subsonic_api.send_scrobble(tl_track.track.uri, False) + + def track_playback_ended(self, tl_track, time_position): + if self.scrobble == True: + time_position = time_position // 1000 + if time_position < tl_track.track.length // 2: + return self.subsonic_api.send_scrobble(tl_track.track.uri, True) diff --git a/mopidy_subidy/subsonic_api.py b/mopidy_subidy/subsonic_api.py index 50aacf7..e404cca 100644 --- a/mopidy_subidy/subsonic_api.py +++ b/mopidy_subidy/subsonic_api.py @@ -93,6 +93,23 @@ class SubsonicApi: def get_censored_song_stream_uri(self, song_id): return self.get_subsonic_uri("stream", dict(id=song_id), True) + def send_scrobble(self, song_id, submission=True): + try: + response = self.connection.scrobble( + uri.get_song_id(song_id), + submission + ) + except Exception: + logger.warning("Failed to scrobble") + return None + if response.get("status") != RESPONSE_OK: + logger.warning( + "Got non-okay status code from subsonic: $s" + % response.get("status") + ) + return None + return response.get("scrobble") + def find_raw( self, query,