summaryrefslogtreecommitdiffstats
path: root/plugin.py
diff options
context:
space:
mode:
authorPratyush Desai2025-11-19 19:19:21 +0530
committerPratyush Desai2025-11-20 14:16:46 +0530
commit25d72680cb608fb8827b54f2eb0d404d52cde754 (patch)
tree4b937a65d2b4951a8ef2e069fc2d437ae20a4585 /plugin.py
parent81c0f66cf594d7a44b166bb05de79ed0277c188e (diff)
downloadlistenbrainz-25d72680cb608fb8827b54f2eb0d404d52cde754.tar.gz
listenbrainz-25d72680cb608fb8827b54f2eb0d404d52cde754.tar.bz2
listenbrainz-25d72680cb608fb8827b54f2eb0d404d52cde754.zip
Added more commands
added 2 commands that show the top tracks and albums played by a user. There are some formatting decisions that will need to be taken. Also the client library for the API seems exhausted. Missing some key things. Yet to use a constructor the initialize an instance of the client when plugin is called rather than under each function. Signed-off-by: Pratyush Desai <pratyush.desai@liberta.casa>
Diffstat (limited to 'plugin.py')
-rw-r--r--plugin.py113
1 files changed, 97 insertions, 16 deletions
diff --git a/plugin.py b/plugin.py
index 2c4d543..3b4a589 100644
--- a/plugin.py
+++ b/plugin.py
@@ -35,14 +35,15 @@ 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"])
+ @wrap(["text"])
def np(self, irc, msg, args, user):
"""<user>
@@ -50,31 +51,111 @@ class ListenBrainz(callbacks.Plugin):
"""
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:
+ 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:
+ 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.
+ """
+ client = liblistenbrainz.ListenBrainz()
+ try:
+ data = 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[:3]
+
+ 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>.
+ """
+ client = liblistenbrainz.ListenBrainz()
+ try:
+ data = 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[:3]
+
+ 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