from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket import json import socket import os import threading import select import random SOCKPATH='/home/dario/.mpv.sock' global mpvParser mpvParser = None class SocketPoller(threading.Thread): def __init__(self, sockParser): super(SocketPoller, self).__init__() self.sockParser = sockParser self.stop=False if not os.path.exists(SOCKPATH): raise Exception("Could not find server socket ~/.mpv.sock, exiting") self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.sock.connect(SOCKPATH) self.buf="" def run(self): while not self.stop: if len( select.select([self.sock], [], [])[0] ) > 0: self.buf += self.sock.recv(1) if '\n' in self.buf: self.sockParser.newData(self.buf) self.buf="" def sendData(self, data): if not '\n' in data: data+='\n' print "sending data '%s'"%data self.sock.sendall(data) class MpvSockParser(object): def __init__(self): self.listeners = [] self.playerState = { "totalDuration": 42, "currentDuration": 23, "volume": 66, "fileName": "No Data Yet", "isPlaying": False } self.poller = None self.waitingForCommand = None def registerListener(self, listener): self.listeners.append(listener) def unregisterListener(self, listener): self.listeners.remove(listener) def notifyListeners(self): for l in self.listeners: l.dataNotify(self.playerState) def startPoll(self): self.poller = SocketPoller(self) self.poller.sendData('{"command":["observe_property",1,"time-pos"]}') self.poller.sendData('{"command":["observe_property",2,"volume"]}') self.poller.sendData('{"command":["observe_property",3,"filename"]}') self.poller.sendData('{"command":["observe_property",4,"duration"]}') self.poller.run() def newData(self, data): data = json.loads(data) # mpv-generated event if "event" in data: self.processEvent(data) # answer to our request if 'error' in data: self.processCommand(data) def processEvent(self, data): sendNotify = False if "data" in data and data["data"]==None: return print data if data['event'] == 'property-change' and data['name'] == 'time-pos': self.playerState['currentDuration'] = int(data['data']) if data['event'] == 'property-change' and data['name'] == 'volume': self.playerState['volume'] = int(data['data']) if data['event'] == 'property-change' and data['name'] == 'filename': self.playerState['fileName'] = data['data'] if data['event'] == 'property-change' and data['name'] == 'duration': self.playerState['totalDuration'] = int(data['data']) if data['event'] == 'pause': self.playerState['isPlaying'] = False if data['event'] == 'unpause': self.playerState['isPlaying'] = True print self.playerState self.notifyListeners() def processCommand(self, data): pass def sendCommand(self, command): if command[command] == "seek": pass class WSHandler(WebSocket): def handleMessage(self): #self.sendMessage(self.data) print "got message '%s'"%(self.data) def handleConnected(self): global mpvParser mpvParser.registerListener(self) print self.address, 'connected' def handleClose(self): global mpvParser print self.address, 'closed' mpvParser.unregisterListener(self) def dataNotify(self, data): data['type'] = 'status' self.sendMessage(data) if __name__=='__main__': global mpvParser mpvParser = MpvSockParser() mpvParser.startPoll() server = SimpleWebSocketServer('', 8000, SimpleEcho) server.serveforever()