bitbot-3.11-fork/modules/lastfm.py

86 lines
3.4 KiB
Python
Raw Normal View History

#--require-config lastfm-api-key
from datetime import datetime, timezone
from src import ModuleManager, Utils
2016-03-29 11:56:58 +00:00
URL_SCROBBLER = "http://ws.audioscrobbler.com/2.0/"
@Utils.export("set", {"setting": "lastfm", "help": "Set last.fm username"})
class Module(ModuleManager.BaseModule):
_name = "last.fm"
@Utils.hook("received.command.np|listening|nowplaying")
2016-03-29 11:56:58 +00:00
def np(self, event):
"""
:help: Get the last listened to track from a user
:usage: [username]
"""
2016-03-29 11:56:58 +00:00
if event["args_split"]:
lastfm_username = event["args_split"][0]
shown_username = lastfm_username
2016-03-29 11:56:58 +00:00
else:
2018-08-15 09:34:58 +00:00
lastfm_username = event["user"].get_setting("lastfm",
2016-03-29 11:56:58 +00:00
event["user"].nickname)
shown_username = event["user"].nickname
2016-03-29 11:56:58 +00:00
page = Utils.get_url(URL_SCROBBLER, get_params={
"method": "user.getrecenttracks", "user": lastfm_username,
2016-03-29 11:56:58 +00:00
"api_key": self.bot.config["lastfm-api-key"],
"format": "json", "limit": "1"}, json=True)
if page:
if "recenttracks" in page and len(page["recenttracks"
]["track"]):
now_playing = page["recenttracks"]["track"][0]
track_name = now_playing["name"]
artist = now_playing["artist"]["#text"]
if '@attr' in now_playing:
np = True
else:
played = int(now_playing["date"]["uts"])
dts = int(datetime.now(tz=timezone.utc).timestamp())
np = bool((dts - played) < 120)
time_language = "is listening to" if np else "last " \
+ "listened to"
ytquery = " - ".join([artist, track_name])
short_url = self.events.on(
"get.searchyoutube").call_for_result(
query=ytquery)
short_url = " -- " + short_url if short_url else ""
2016-04-04 11:37:17 +00:00
info_page = Utils.get_url(URL_SCROBBLER, get_params={
"method": "track.getInfo", "artist": artist,
2016-03-29 11:56:58 +00:00
"track": track_name, "autocorrect": "1",
"api_key": self.bot.config["lastfm-api-key"],
"user": lastfm_username, "format": "json"}, json=True)
2016-03-29 11:56:58 +00:00
tags = []
if "toptags" in info_page.get("track", []):
2016-04-04 11:37:17 +00:00
for tag in info_page["track"]["toptags"]["tag"]:
2016-03-29 11:56:58 +00:00
tags.append(tag["name"])
if tags:
tags = " (%s)" % ", ".join(tags)
else:
tags = ""
play_count = ""
if "userplaycount" in info_page.get("track", []):
play_count = int(info_page["track"]["userplaycount"])
play_count = " (%d play%s)" % (play_count,
"s" if play_count > 1 else "")
2016-03-29 11:56:58 +00:00
2016-04-04 11:37:17 +00:00
event["stdout"].write(
"%s %s: %s - %s%s%s%s" % (
shown_username, time_language, artist, track_name,
play_count,
tags,
short_url))
2016-03-29 11:56:58 +00:00
else:
event["stderr"].write(
"The user '%s' has never scrobbled before" % (
shown_username))
2016-03-29 11:56:58 +00:00
else:
event["stderr"].write("Failed to load results")