You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.1 KiB
132 lines
4.1 KiB
|
9 years ago
|
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()
|