summaryrefslogtreecommitdiffstats
path: root/plugin.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugin.py')
-rw-r--r--plugin.py122
1 files changed, 102 insertions, 20 deletions
diff --git a/plugin.py b/plugin.py
index 2c4d543..c985e83 100644
--- a/plugin.py
+++ b/plugin.py
@@ -35,47 +35,129 @@ from supybot.commands import *
from supybot.i18n import PluginInternationalization
-_ = PluginInternationalization('ListenBrainz')
+_ = PluginInternationalization("ListenBrainz")
class ListenBrainz(callbacks.Plugin):
"""Fetches scrobbled metadata for users."""
threaded = True
- @wrap(["something"])
+ def __init__(self, irc):
+ self.__parent = super(ListenBrainz, self)
+ self.__parent.__init__(irc)
+ self.client = liblistenbrainz.ListenBrainz()
+ self.DISPLAY_LIMIT = 3
+
+ @wrap(["text"])
def np(self, irc, msg, args, user):
"""<user>
Announces the track currently being played by <user>.
"""
- client = liblistenbrainz.ListenBrainz()
- listen = client.get_playing_now(user)
- if listen is not None:
- response = (
- f"{user} is currently playing: \x02{listen.track_name}\x0F "
- f"from \x02{listen.release_name}\x0F by \x02{listen.artist_name}\x0F "
- f"at \x02{listen.listened_at}\x0F")
- irc.reply(response)
- else:
+ listen = self.client.get_playing_now(user)
+ if listen is None:
response = f"{user} doen't seem to be listening to anything"
- irc.reply(response)
+ else:
+ response = (
+ f"{user} is currently playing: \x02{listen.track_name}\x0f "
+ f"from \x02{listen.release_name}\x0f by \x02{listen.artist_name}\x0f "
+ f"at \x02{listen.listened_at}\x0f"
+ )
+ irc.reply(response)
- @wrap(["something"])
- def listencount(self,irc,msg, args, user):
+
+ @wrap(["text"])
+ def listencount(self, irc, msg, args, user):
"""<user>
Announces total number of tracks scrobbled by <user>
"""
- client = liblistenbrainz.ListenBrainz()
- count = client.get_user_listen_count(user)
- if count is not None:
- response = f"{user} has recorded listening to {count} tracks"
- else:
+ count = self.client.get_user_listen_count(user)
+ if count is None:
response = "Nothing recorded"
+ else:
+ response = (f"{user} has recorded listening to {count} tracks")
irc.reply(response)
-
+ @wrap(["text"])
+ def tracks(self, irc, msg, args, user):
+ """<user>
+
+ <user>'s top listened to album releases.
+ """
+ try:
+ data = self.client.get_user_recordings(user)
+ payload = data.get("payload", {})
+
+ except Exception as e:
+ irc.error(f"An unexpected error occurred: {e}", Raise=True)
+ return
+
+ total_tracks = payload.get("total_recording_count", "N/A")
+ recordings = payload.get("recordings", [])
+ if not recordings:
+ irc.reply(f"{user} has no recorded tracks.")
+ return
+
+ top_tracks = recordings[:DISPLAY_LIMIT]
+ header = f"{user}'s Top {len(top_tracks)} Tracks (Total unique tracks: {total_tracks:,}):"
+ irc.reply(header)
+ for i, track in enumerate(top_tracks):
+ rank = i + 1
+ artist = track.get("artist_name", "Unknown Artist")
+ track_name = track.get("track_name", "Unknown Track")
+ release_name = track.get("release_name")
+ count = track.get("listen_count", 0)
+
+ release_info = f" from \x02{release_name}\x0f" if release_name else ""
+
+ response = (
+ f"({count:,} listens): "
+ f"\x02{track_name}\x0f{release_info} by "
+ f"\x02{artist}\x0f"
+ )
+ irc.reply(response)
+
+
+ @wrap(["text"])
+ def albums(self, irc, msg, args, user):
+ """<user>
+
+ Announces the top albums/releases listened to by <user>.
+ """
+ try:
+ data = self.client.get_user_releases(user)
+ payload = data.get("payload", {})
+ except Exception as e:
+ irc.error(f"An unexpected error occurred: {e}", Raise=True)
+ return
+
+ total_albums = payload.get("total_release_count", "N/A")
+ releases = payload.get("releases", [])
+
+ if not releases:
+ irc.reply(f"{user} has no recorded releases.")
+ return
+
+ top_releases = releases[:DISPLAY_LIMIT]
+
+ header = f"{user}'s Top {len(top_releases)} Releases (Total unique releases: {total_albums:,}):"
+ irc.reply(header)
+
+ for i, release in enumerate(top_releases):
+ rank = i + 1
+ artist = release.get("artist_name", "Unknown Artist")
+ release_name = release.get("release_name", "Unknown Album")
+ count = release.get("listen_count", 0)
+
+ response = (
+ f"({count:,} listens): "
+ f"\x02{release_name}\x0f by "
+ f"\x02{artist}\x0f"
+ )
+ irc.reply(response)
+
Class = ListenBrainz