Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions mopidy_subidy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@ def get_config_schema(self):
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)
1 change: 1 addition & 0 deletions mopidy_subidy/ext.conf
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ username =
password =
legacy_auth = no
api_version = 1.14.0
scrobble = false
29 changes: 29 additions & 0 deletions mopidy_subidy/frontend.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import pykka

import mopidy_subidy
from mopidy import core
from mopidy_subidy import subsonic_api, uri

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 and uri.is_uri(tl_track.track.uri):
return self.subsonic_api.send_scrobble(tl_track.track.uri, False)

def track_playback_ended(self, tl_track, time_position):
if self.scrobble == True and uri.is_uri(tl_track.track.uri):
time_position = time_position // 1000
if time_position < tl_track.track.length // 2:
return self.subsonic_api.send_scrobble(tl_track.track.uri, True)
17 changes: 17 additions & 0 deletions mopidy_subidy/subsonic_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,23 @@ def get_song_stream_uri(self, song_id):
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,
Expand Down