]> jfr.im git - erebus.git/commitdiff
add listenbrainz module
authorJohn Runyon <redacted>
Sat, 19 Aug 2023 04:55:45 +0000 (22:55 -0600)
committerJohn Runyon <redacted>
Sat, 19 Aug 2023 04:55:45 +0000 (22:55 -0600)
modules/listenbrainz.py [new file with mode: 0644]

diff --git a/modules/listenbrainz.py b/modules/listenbrainz.py
new file mode 100644 (file)
index 0000000..c7ae6c9
--- /dev/null
@@ -0,0 +1,64 @@
+# Erebus IRC bot - Author: Erebus Team
+# vim: fileencoding=utf-8
+
+# module info
+modinfo = {
+       'author': 'Erebus Team',
+       'license': 'public domain',
+       'compatible': [0], # compatible module API versions
+       'depends': [], # other modules required to work properly?
+       'softdeps': ['help'], # modules which are preferred but not required
+}
+
+# preamble
+import modlib
+lib = modlib.modlib(__name__)
+modstart = lib.modstart
+modstop = lib.modstop
+
+# module code
+import json
+import sys
+if sys.version_info.major < 3:
+       from urllib import urlopen, quote, HTTPError
+else:
+       from urllib.request import urlopen
+       from urllib.parse import quote
+       from urllib.error import HTTPError
+
+@lib.hook(('listenbrainz','np'), needchan=False, wantchan=True)
+@lib.help('[<user>]', 'looks up ListenBrainz now playing for a user', 'default user taken from SETINFO listenbrainz')
+def listenbrainz(bot, user, chan, realtarget, *args):
+       if len(args) == 0:
+               username = lib.mod('userinfo').get(user, 'listenbrainz')
+       else:
+               username = args[0]
+       if username is None:
+               return "I don't know what username you want to look at! Try !LISTENBRAINZ <user>"
+
+       url = "https://api.listenbrainz.org/1/user/%s/playing-now" % (quote(username))
+       if sys.version_info.major < 3:
+               url = url.encode('utf8')
+
+       try:
+               lbdata = json.load(urlopen(url))
+       except HTTPError as e:
+               return "No such user (or some other error: %s %s) " % (e.code, e.msg)
+
+       if lib.parent.cfg.getboolean('debug', 'listenbrainz'):
+               lib.parent.log('*', "?", repr(lbdata))
+
+       if not lbdata['payload']['listens']:
+               return "ListenBrainz says they're not listening to anything!"
+
+       track = lbdata['payload']['listens'][0]['track_metadata']
+       player = 'unknown player'
+       if 'media_player' in track['additional_info']: player = track['additional_info']['media_player']
+       elif 'listening_from' in track['additional_info']: player = track['additional_info']['listening_from']
+       return "%(user)s is playing %(track)s by %(artist)s (%(album)s) (from %(player)s)" % {
+               'user': username,
+               'track': track['track_name'],
+               'artist': track['artist_name'],
+               'album': track['release_name'],
+               'player': player,
+       }