diff --git a/plugin.py b/plugin.py index 2c4d543..52ffeba 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): """ @@ -52,16 +53,16 @@ class ListenBrainz(callbacks.Plugin): 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: + 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" + ) + else: response = f"{user} doen't seem to be listening to anything" - irc.reply(response) + irc.reply(response) - @wrap(["something"]) - def listencount(self,irc,msg, args, user): + @wrap(["text"]) + def listencount(self, irc, msg, args, user): """ Announces total number of tracks scrobbled by @@ -70,11 +71,92 @@ class ListenBrainz(callbacks.Plugin): count = client.get_user_listen_count(user) if count is not None: response = f"{user} has recorded listening to {count} tracks" + irc.reply(response) else: response = "Nothing recorded" irc.reply(response) - + @wrap(["text"]) + def tracks(self, irc, msg, args, 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): + """ + + Announces the top albums/releases listened to by . + """ + 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