Last active
October 7, 2018 21:28
-
-
Save umputun/4440604 to your computer and use it in GitHub Desktop.
pi-radio-mpd - my simple wrapper for mpd to serve rest/json kind of api. working just fine on my RPi.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
import web, json, time, mpd, collections | |
STATIONS = { | |
"FoxNews" : "mmsh://209.107.209.181:80/D/138/13873/v0001/reflector:24137?MSWMExt=.asf", | |
"Classic" : "http://radio02-cn03.akadostream.ru:8100/classic128.mp3", | |
"Jazz": "http://streaming208.radionomy.com:80/A-JAZZ-FM-WEB" | |
} | |
urls = ( | |
'/', 'index', | |
'/apple-touch-icon.png', 'icon', | |
'/list', 'list', | |
'/play/(.*)', 'play', | |
'/volume/(.*)', 'volume', | |
'/volume(.*)', 'volume', | |
'/stop', 'stop', | |
'/status', 'status', | |
) | |
app = web.application(urls, globals()) | |
index_page = open('index.html', 'r').read() | |
class index: | |
def GET(self): return index_page | |
class icon: | |
def GET(self): | |
web.header('Content-Type', 'image/png') | |
return open('pi-radio.png', 'r').read() | |
class list: | |
def GET(self): | |
print STATIONS | |
web.header('Content-Type', 'application/json') | |
return (json.dumps({'response' : {'list': collections.OrderedDict(sorted(STATIONS.items()))} }, separators=(',',':') )) | |
class volume: | |
def GET(self, volume_level): #level between 0 and 10 | |
mpc = mc.get_client() | |
level = int(mc.get_client().status()['volume']) | |
if volume_level: | |
if int(volume_level) == 0: level = 0 | |
else: level = 80 + int(volume_level) * 2 | |
mpc.setvol(level) | |
else: | |
volume_level = (level - 80) / 2 | |
print "set level=%d, %s" % (level, volume_level) | |
mc.release_client() | |
web.header('Content-Type', 'application/json') | |
return (json.dumps({'response' : {'level': volume_level} }, separators=(',',':') )) | |
def POST(self, volume_level): return self.GET(volume_level) | |
class play: | |
def GET(self, station): | |
print "play station="+ station.encode('utf-8') | |
client = mc.get_client() | |
client.stop() | |
found_id = [sid for sid, st_name in mc.ids.items() if st_name == station][0] | |
print "play id=%s" % found_id | |
client.playid(found_id) | |
mc.release_client() | |
web.header('Content-Type', 'application/json') | |
web.ctx.status = '201 Created' | |
return (json.dumps({'response' : {'station': STATIONS[station]} }, separators=(',',':') )) | |
def POST(self, volume_level): return self.GET(volume_level) | |
class stop: | |
def GET(self): | |
print "stop" | |
client = mc.get_client() | |
client.stop() | |
mc.release_client() | |
web.header('Content-Type', 'application/json') | |
return (json.dumps({'response' : {'result' : 1} }, separators=(',',':') )) | |
def POST(self): return self.GET() | |
class status: | |
def GET(self): | |
mpd_status = mc.get_client().status() | |
print "status = " + str(mpd_status) | |
mc.release_client() | |
volume = (int(mpd_status['volume']) - 80) / 2 | |
web.header('Content-Type', 'application/json') | |
if mpd_status['state'] == 'play': | |
station_name = mc.ids[mpd_status['songid']] | |
return (json.dumps({'response' : {'status' : 'play', 'station' : station_name, 'volume' : volume} }, separators=(',',':') )) | |
else: | |
return (json.dumps({'response' : {'status' : 'stop', 'volume' : volume} }, separators=(',',':') )) | |
class mpd_controller: | |
def __init__(self, stations): | |
self.client = mpd.MPDClient() | |
try: | |
self.client.connect("localhost", 6600) | |
except mpd.ConnectionError: | |
print "already connected" | |
self.client.clear() | |
self.ids = {} | |
for (st_name, st_url) in stations.items(): | |
self.ids[self.client.addid(st_url)] = st_name | |
self.client.disconnect() | |
def get_client(self): | |
try: | |
self.client.connect("localhost", 6600) | |
except mpd.ConnectionError: | |
print "already connected" | |
return self.client | |
def release_client(self): | |
try: | |
self.client.disconnect() | |
except mpd.ConnectionError: | |
print "can't disconnect" | |
mc = mpd_controller(STATIONS) | |
if __name__ == "__main__": | |
app.run() | |
Requires python 2.7 or ordereddict package http://pypi.python.org/pypi/ordereddict
OrderedDict was not added to Python until version 2.7.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Requires python 2.6, mpd, python-mpd2 and wep.py