112 lines
3.5 KiB
Python
112 lines
3.5 KiB
Python
|
'''
|
||
|
djcontrol.py
|
||
|
|
||
|
This is the helper script that glues the webapi/database to the liquidsoap
|
||
|
application. We make RESTful requests here to get the next song and to report
|
||
|
when a song has been played.
|
||
|
'''
|
||
|
|
||
|
import argparse
|
||
|
import json
|
||
|
|
||
|
import requests
|
||
|
|
||
|
|
||
|
DJ_TOKEN = 'place_generated_token_here'
|
||
|
|
||
|
API_URL = 'https://savepointradio.net/api/'
|
||
|
|
||
|
RADIO_NAME = 'Save Point Radio'
|
||
|
|
||
|
HEADERS = {
|
||
|
'Content-Type': 'application/json; charset=utf-8',
|
||
|
'Authorization': 'Token {}'.format(DJ_TOKEN)
|
||
|
}
|
||
|
|
||
|
ANNOTATE = 'annotate:req_id="{}",type="{}",artist="{}",title="{}",game="{}":{}'
|
||
|
|
||
|
|
||
|
def clean_quotes(unclean_string):
|
||
|
'''
|
||
|
Escapes quotes for use in the Liquidsoap parser.
|
||
|
'''
|
||
|
return unclean_string.replace('"', '\\"')
|
||
|
|
||
|
|
||
|
def beautify_artists(artists):
|
||
|
'''
|
||
|
Turns a list of one or more artists into a proper English listing.
|
||
|
'''
|
||
|
output = ', '
|
||
|
if len(artists) == 2:
|
||
|
output = ' & '
|
||
|
return clean_quotes(output.join(artists))
|
||
|
|
||
|
|
||
|
description = 'Lets the DJ control the radio.'
|
||
|
|
||
|
parser = argparse.ArgumentParser(description=description)
|
||
|
subparsers = parser.add_subparsers(dest='command')
|
||
|
|
||
|
parser_next = subparsers.add_parser('next',
|
||
|
help='Gets the next song from the radio.')
|
||
|
parser_played = subparsers.add_parser('played',
|
||
|
help='Tells the radio which song just played.')
|
||
|
parser_played.add_argument('request',
|
||
|
help='Song request ID number.',
|
||
|
nargs=1,
|
||
|
type=int)
|
||
|
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
if args.command == 'next':
|
||
|
try:
|
||
|
r = requests.get(API_URL + 'next/',
|
||
|
headers=HEADERS,
|
||
|
timeout=5)
|
||
|
r.encoding = 'utf-8'
|
||
|
r.raise_for_status()
|
||
|
except requests.exceptions.HTTPError as errh:
|
||
|
print('Http Error: {}'.format(errh))
|
||
|
except requests.exceptions.ConnectionError as errc:
|
||
|
print('Error Connecting: {}'.format(errc))
|
||
|
except requests.exceptions.Timeout as errt:
|
||
|
print('Timeout Error: {}'.format(errt))
|
||
|
except requests.exceptions.RequestException as err:
|
||
|
print('Error: {}'.format(err))
|
||
|
else:
|
||
|
req = json.loads(r.text)
|
||
|
song = req['song']
|
||
|
if song['song_type'] == 'J':
|
||
|
artist = RADIO_NAME
|
||
|
title = 'Jingle'
|
||
|
game = RADIO_NAME
|
||
|
else:
|
||
|
artist = beautify_artists(song['artists'])
|
||
|
title = clean_quotes(song['title'])
|
||
|
game = clean_quotes(song['game'])
|
||
|
print(ANNOTATE.format(req['id'],
|
||
|
song['song_type'],
|
||
|
artist,
|
||
|
title,
|
||
|
game,
|
||
|
song['path']))
|
||
|
elif args.command == 'played':
|
||
|
try:
|
||
|
req_played = json.dumps({'song_request': args.request[0]})
|
||
|
r = requests.post(API_URL + 'played/',
|
||
|
headers=HEADERS,
|
||
|
data=req_played,
|
||
|
timeout=5)
|
||
|
r.encoding = 'utf-8'
|
||
|
r.raise_for_status()
|
||
|
except requests.exceptions.HTTPError as errh:
|
||
|
print('Http Error: {}'.format(errh))
|
||
|
print(r.text)
|
||
|
except requests.exceptions.ConnectionError as errc:
|
||
|
print('Error Connecting: {}'.format(errc))
|
||
|
except requests.exceptions.Timeout as errt:
|
||
|
print('Timeout Error: {}'.format(errt))
|
||
|
except requests.exceptions.RequestException as err:
|
||
|
print('Error: {}'.format(err))
|