Able to update playerState from socket

master
Dario Ernst 9 years ago
parent 21dc6257b8
commit 580da93ee4

Binary file not shown.

@ -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()
Loading…
Cancel
Save