]>
Commit | Line | Data |
---|---|---|
1 | # Erebus IRC bot - Author: Erebus Team | |
2 | # vim: fileencoding=utf-8 | |
3 | # ListenBrainz now-playing | |
4 | ||
5 | # module info | |
6 | modinfo = { | |
7 | 'author': 'Erebus Team', | |
8 | 'license': 'public domain', | |
9 | 'compatible': [0], # compatible module API versions | |
10 | 'depends': [], # other modules required to work properly? | |
11 | 'softdeps': ['help'], # modules which are preferred but not required | |
12 | } | |
13 | ||
14 | # preamble | |
15 | import modlib | |
16 | lib = modlib.modlib(__name__) | |
17 | modstart = lib.modstart | |
18 | modstop = lib.modstop | |
19 | ||
20 | # module code | |
21 | import json | |
22 | import sys | |
23 | if sys.version_info.major < 3: | |
24 | from urllib import urlopen, quote, HTTPError | |
25 | else: | |
26 | from urllib.request import urlopen | |
27 | from urllib.parse import quote | |
28 | from urllib.error import HTTPError | |
29 | ||
30 | @lib.hook(('listenbrainz','np'), needchan=False, wantchan=True) | |
31 | @lib.help('[<user>]', 'looks up ListenBrainz now playing for a user', 'default user taken from SETINFO listenbrainz') | |
32 | def listenbrainz(bot, user, chan, realtarget, *args): | |
33 | if len(args) == 0: | |
34 | username = lib.mod('userinfo').get(user, 'listenbrainz') | |
35 | else: | |
36 | username = args[0] | |
37 | if username is None: | |
38 | return "I don't know what username you want to look at! Try !LISTENBRAINZ <user>" | |
39 | ||
40 | url = "https://api.listenbrainz.org/1/user/%s/playing-now" % (quote(username)) | |
41 | if sys.version_info.major < 3: | |
42 | url = url.encode('utf8') | |
43 | ||
44 | try: | |
45 | lbdata = json.load(urlopen(url)) | |
46 | except HTTPError as e: | |
47 | return "No such user (or some other error: %s %s) " % (e.code, e.msg) | |
48 | ||
49 | if lib.parent.cfg.getboolean('debug', 'listenbrainz'): | |
50 | lib.parent.log('*', "?", repr(lbdata)) | |
51 | ||
52 | if not lbdata['payload']['listens']: | |
53 | return "ListenBrainz says they're not listening to anything!" | |
54 | ||
55 | track = lbdata['payload']['listens'][0]['track_metadata'] | |
56 | player = 'unknown player' | |
57 | if 'media_player' in track['additional_info']: player = track['additional_info']['media_player'] | |
58 | elif 'listening_from' in track['additional_info']: player = track['additional_info']['listening_from'] | |
59 | return lib.parent.cfg.get('listenbrainz', 'format', "https://listenbrainz.org/user/%(user)s is playing %(track)s by %(artist)s (%(album)s) (from %(player)s)") % { | |
60 | 'user': username, | |
61 | 'track': track['track_name'], | |
62 | 'artist': track['artist_name'], | |
63 | 'album': track['release_name'], | |
64 | 'player': player, | |
65 | } |