mirror of
https://github.com/oddluck/limnoria-plugins.git
synced 2025-04-30 07:21:16 -05:00
164 lines
5.6 KiB
Python
164 lines
5.6 KiB
Python
###
|
|
# Copyright (c) 2018, cottongin
|
|
# All rights reserved.
|
|
# see LICENSE.txt
|
|
#
|
|
###
|
|
|
|
import requests
|
|
|
|
from supybot import utils, plugins, ircutils, callbacks
|
|
from supybot.commands import *
|
|
try:
|
|
from supybot.i18n import PluginInternationalization
|
|
_ = PluginInternationalization('AzuraCast')
|
|
except ImportError:
|
|
# Placeholder that allows to run the plugin on a bot
|
|
# without the i18n module
|
|
_ = lambda x: x
|
|
|
|
|
|
class AzuraCast(callbacks.Plugin):
|
|
"""Plugin for the AzuraCast API"""
|
|
threaded = True
|
|
|
|
def __init__(self, irc):
|
|
self.__parent = super(AzuraCast, self)
|
|
self.__parent.__init__(irc)
|
|
|
|
self.BASE_API = self.registryValue('AzuraAPI') + '{endpoint}'
|
|
self.PUB_URL = self.registryValue('PublicURL') + '{name}'
|
|
|
|
def _fetchURL(self, url, headers=None):
|
|
return requests.get(url, headers=headers).json()
|
|
|
|
def _parseData(self, data):
|
|
stations = {}
|
|
for station in data:
|
|
tmp_dict = {}
|
|
code = station['station']['shortcode']
|
|
tmp_dict['id'] = station['station']['id']
|
|
tmp_dict['name'] = station['station']['name']
|
|
tmp_dict['description'] = station['station']['description']
|
|
tmp_dict['player_url'] = station['station']['listen_url'].split('?')[0] \
|
|
if station['station']['is_public'] else ''
|
|
tmp_dict['public_url'] = self.PUB_URL.format(
|
|
name=code) if station['station']['is_public'] else ''
|
|
tmp_dict['listeners'] = station['listeners']
|
|
tmp_dict['nowplaying'] = station['now_playing']
|
|
stations[code] = tmp_dict
|
|
return stations
|
|
|
|
@wrap([getopts({'station': 'somethingWithoutSpaces'})])
|
|
def nowplaying(self, irc, msg, args, options):
|
|
"""
|
|
Fetches what is now playing
|
|
"""
|
|
options = dict(options)
|
|
station = options.get('station')
|
|
endpoint = 'nowplaying'
|
|
url = self.BASE_API.format(endpoint=endpoint)
|
|
|
|
data = self._fetchURL(url)
|
|
|
|
if not data:
|
|
irc.reply('ERROR: Something went wrong fetching data @ {}'.format(url))
|
|
return
|
|
|
|
data = self._parseData(data)
|
|
|
|
output = []
|
|
if station:
|
|
# one station only
|
|
d = data.get(station.lower())
|
|
prefix = ircutils.bold('Now Playing on {}:'.format(d['name']))
|
|
album = ' [{}]'.format(d['nowplaying']['song']['album']) \
|
|
if d['nowplaying']['song']['album'] else ''
|
|
url = ' | {}'.format(d['public_url']) if d['public_url'] else ''
|
|
np = '{}'.format(d['nowplaying']['song']['text'])
|
|
listeners = " | Listeners: {}".format(d['listeners']['current'])
|
|
string = '{} {}{}{}{}'.format(prefix, np, album, listeners, url)
|
|
output.append(string)
|
|
else:
|
|
# all stations?
|
|
for s,d in data.items():
|
|
prefix = ircutils.bold('Now Playing on {}:'.format(d['name']))
|
|
album = ' [{}]'.format(d['nowplaying']['song']['album']) \
|
|
if d['nowplaying']['song']['album'] else ''
|
|
url = ' | {}'.format(d['public_url']) if d['public_url'] else ''
|
|
np = '{}'.format(d['nowplaying']['song']['text'])
|
|
listeners = " | Listeners: {}".format(d['listeners']['current'])
|
|
string = '{} {}{}{}{}'.format(prefix, np, album, listeners, url)
|
|
output.append(string)
|
|
|
|
for string in output:
|
|
irc.reply(string)
|
|
|
|
return
|
|
|
|
@wrap([getopts({'station': 'somethingWithoutSpaces'})])
|
|
def listeners(self, irc, msg, args, options):
|
|
"""
|
|
Fetches listeners
|
|
"""
|
|
options = dict(options)
|
|
station = options.get('station')
|
|
endpoint = 'nowplaying'
|
|
url = self.BASE_API.format(endpoint=endpoint)
|
|
|
|
data = self._fetchURL(url)
|
|
|
|
if not data:
|
|
irc.reply('ERROR: Something went wrong fetching data @ {}'.format(url))
|
|
return
|
|
|
|
data = self._parseData(data)
|
|
|
|
output = []
|
|
if station:
|
|
# one station only
|
|
d = data.get(station.lower())
|
|
count = d['listeners']['current']
|
|
if count > 1 and count != 0:
|
|
cur = 'are currently'
|
|
plr = ' {} listeners '.format(ircutils.bold(count))
|
|
elif count == 1:
|
|
cur = 'is currently'
|
|
plr = ' {} listener '.format(ircutils.bold(count))
|
|
else:
|
|
cur = 'are no listeners'
|
|
plr = ' '
|
|
string = 'There {}{}on {}'.format(
|
|
cur, plr,
|
|
ircutils.bold(d['name']))
|
|
output.append(string)
|
|
else:
|
|
# all stations?
|
|
for s,d in data.items():
|
|
count = d['listeners']['current']
|
|
if count > 1 and count != 0:
|
|
cur = 'are currently'
|
|
plr = ' {} listeners '.format(ircutils.bold(count))
|
|
elif count == 1:
|
|
cur = 'is currently'
|
|
plr = ' {} listener '.format(ircutils.bold(count))
|
|
else:
|
|
cur = 'are no listeners'
|
|
plr = ' '
|
|
string = 'There {}{}on {}'.format(
|
|
cur, plr,
|
|
ircutils.bold(d['name']))
|
|
output.append(string)
|
|
|
|
|
|
for string in output:
|
|
irc.reply(string)
|
|
|
|
return
|
|
|
|
|
|
Class = AzuraCast
|
|
|
|
|
|
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:
|