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…
Reference in new issue