Added more commands #2

Merged
pratyush merged 2 commits from add_more_commands into master 2025-11-21 11:03:13 +01:00

122
plugin.py
View File

@ -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>
pratyush marked this conversation as resolved Outdated
Outdated
Review

nit: I think if listen is None ... foo ... else ... bar would be more direct than if listen is not None ... bar ... else ... foo

nit: I think `if listen is None ... foo ... else ... bar` would be more direct than `if listen is not None ... bar ... else ... foo`
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>
pratyush marked this conversation as resolved Outdated
Outdated
Review

similar here, but it was not touched in this patch

similar here, but it was not touched in this patch
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
pratyush marked this conversation as resolved Outdated
Outdated
Review

rank does not seem to be used, it could be removed, and then enumerate() and i would no longer be needed either - or am I missing something?

`rank` does not seem to be used, it could be removed, and then `enumerate()` and `i` would no longer be needed either - or am I missing something?

it was a part of the output in the original idea but thought maybe it’s better to merge a –count optional arg which also does a reply.inPrivate (iirc it’s called).

it was a part of the output in the original idea but thought maybe it's better to merge a --count optional arg which also does a reply.inPrivate (iirc it's called).

i feel even 4 lines is a lot of output so kept this hardcoded to top 3 results as it gives 25 by default.

i feel even 4 lines is a lot of output so kept this hardcoded to top 3 results as it gives 25 by default.

Planning to keep it.

Planning to keep it.
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
pratyush marked this conversation as resolved Outdated
Outdated
Review

same here

same here
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