Working audioscrobbler with last.fm!
This commit is contained in:
parent
8e68e69f93
commit
54633ef5ab
|
@ -19,7 +19,7 @@ def forward_to_scrobblers(listening, plugin_conf, **kwargs):
|
||||||
if username and password:
|
if username and password:
|
||||||
plugin.logger.info("Forwarding scrobbler to %s", url)
|
plugin.logger.info("Forwarding scrobbler to %s", url)
|
||||||
session = plugin.get_requests_session()
|
session = plugin.get_requests_session()
|
||||||
session_key, scrobble_url = scrobbler.handshake_v1(
|
session_key, _, scrobble_url = scrobbler.handshake_v1(
|
||||||
session=session, url=url, username=username, password=password
|
session=session, url=url, username=username, password=password
|
||||||
)
|
)
|
||||||
scrobbler.submit_scrobble_v1(
|
scrobbler.submit_scrobble_v1(
|
||||||
|
@ -31,3 +31,27 @@ def forward_to_scrobblers(listening, plugin_conf, **kwargs):
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
plugin.logger.debug("No scrobbler configuration for user, skipping")
|
plugin.logger.debug("No scrobbler configuration for user, skipping")
|
||||||
|
|
||||||
|
|
||||||
|
@plugin.hooks.connect("history.listening.now")
|
||||||
|
def forward_to_now_playing(track, user, plugin_conf, **kwargs):
|
||||||
|
if plugin_conf["user"] is None:
|
||||||
|
raise plugins.Skip()
|
||||||
|
|
||||||
|
username = plugin_conf["user"]["settings"].get("service__username")
|
||||||
|
password = plugin_conf["user"]["settings"].get("service__password")
|
||||||
|
url = plugin_conf["user"]["settings"].get("service__url", DEFAULT_SCROBBLER_URL)
|
||||||
|
if username and password:
|
||||||
|
plugin.logger.info("Forwarding scrobbler to %s", url)
|
||||||
|
session = plugin.get_requests_session()
|
||||||
|
session_key, now_playing_url, _ = scrobbler.handshake_v1(
|
||||||
|
session=session, url=url, username=username, password=password
|
||||||
|
)
|
||||||
|
scrobbler.submit_now_playing_v1(
|
||||||
|
session=session,
|
||||||
|
track=track,
|
||||||
|
session_key=session_key,
|
||||||
|
now_playing_url=now_playing_url,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
plugin.logger.debug("No scrobbler configuration for user, skipping")
|
||||||
|
|
|
@ -38,7 +38,7 @@ def handshake_v1(session, url, username, password):
|
||||||
result = handshake_response.text.split("\n")
|
result = handshake_response.text.split("\n")
|
||||||
if len(result) >= 4 and result[0] == "OK":
|
if len(result) >= 4 and result[0] == "OK":
|
||||||
session_key = result[1]
|
session_key = result[1]
|
||||||
# nowplaying_url = result[2]
|
nowplaying_url = result[2]
|
||||||
scrobble_url = result[3]
|
scrobble_url = result[3]
|
||||||
elif result[0] == "BANNED":
|
elif result[0] == "BANNED":
|
||||||
raise ScrobblerException("BANNED")
|
raise ScrobblerException("BANNED")
|
||||||
|
@ -50,7 +50,7 @@ def handshake_v1(session, url, username, password):
|
||||||
raise ScrobblerException(handshake_response.text)
|
raise ScrobblerException(handshake_response.text)
|
||||||
|
|
||||||
plugin.logger.debug("Handshake successful, scrobble url: %s", scrobble_url)
|
plugin.logger.debug("Handshake successful, scrobble url: %s", scrobble_url)
|
||||||
return session_key, scrobble_url
|
return session_key, nowplaying_url, scrobble_url
|
||||||
|
|
||||||
|
|
||||||
def submit_scrobble_v1(session, scrobble_time, track, session_key, scrobble_url):
|
def submit_scrobble_v1(session, scrobble_time, track, session_key, scrobble_url):
|
||||||
|
@ -69,14 +69,36 @@ def submit_scrobble_v1(session, scrobble_time, track, session_key, scrobble_url)
|
||||||
plugin.logger.debug("Scrobble successfull!")
|
plugin.logger.debug("Scrobble successfull!")
|
||||||
|
|
||||||
|
|
||||||
def get_scrobble_payload(track, scrobble_time):
|
def submit_now_playing_v1(session, track, session_key, now_playing_url):
|
||||||
|
payload = get_scrobble_payload(track, date=None, suffix="")
|
||||||
|
plugin.logger.debug("Sending now playing with payload %s", payload)
|
||||||
|
payload["s"] = session_key
|
||||||
|
response = session.post(now_playing_url, payload)
|
||||||
|
response.raise_for_status()
|
||||||
|
if response.text.startswith("OK"):
|
||||||
|
return
|
||||||
|
elif response.text.startswith("BADSESSION"):
|
||||||
|
raise ScrobblerException("Remote server says the session is invalid")
|
||||||
|
else:
|
||||||
|
raise ScrobblerException(response.text)
|
||||||
|
|
||||||
|
plugin.logger.debug("Now playing successfull!")
|
||||||
|
|
||||||
|
|
||||||
|
def get_scrobble_payload(track, date, suffix="[0]"):
|
||||||
|
"""
|
||||||
|
Documentation available at https://web.archive.org/web/20190531021725/https://www.last.fm/api/submissions
|
||||||
|
"""
|
||||||
upload = track.uploads.filter(duration__gte=0).first()
|
upload = track.uploads.filter(duration__gte=0).first()
|
||||||
return {
|
data = {
|
||||||
"a[0]": track.artist.name,
|
"a{}".format(suffix): track.artist.name,
|
||||||
"t[0]": track.title,
|
"t{}".format(suffix): track.title,
|
||||||
"i[0]": int(scrobble_time.timestamp()),
|
"l{}".format(suffix): upload.duration if upload else 0,
|
||||||
"l[0]": upload.duration if upload else 0,
|
"b{}".format(suffix): track.album.title or "",
|
||||||
"b[0]": track.album.title or "",
|
"n{}".format(suffix): track.position or "",
|
||||||
"n[0]": track.position or "",
|
"m{}".format(suffix): str(track.mbid) or "",
|
||||||
"m[0]": str(track.mbid) or "",
|
"o{}".format(suffix): "P", # Source: P = chosen by user
|
||||||
}
|
}
|
||||||
|
if date:
|
||||||
|
data["i{}".format(suffix)] = int(date.timestamp())
|
||||||
|
return data
|
||||||
|
|
|
@ -395,7 +395,7 @@ export default {
|
||||||
},
|
},
|
||||||
onunlock: function () {
|
onunlock: function () {
|
||||||
if (self.$store.state.player.playing) {
|
if (self.$store.state.player.playing) {
|
||||||
self.soundId = self.sound.play(self.soundId)
|
self.soundId = sound.play(self.soundId)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onload: function () {
|
onload: function () {
|
||||||
|
|
Loading…
Reference in New Issue