diff --git a/server/SimpleWebSocketServer.pyc b/server/SimpleWebSocketServer.pyc new file mode 100644 index 0000000..63c958b Binary files /dev/null and b/server/SimpleWebSocketServer.pyc differ diff --git a/server/server.py b/server/server.py new file mode 100644 index 0000000..81a3591 --- /dev/null +++ b/server/server.py @@ -0,0 +1,131 @@ +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()