Some refactoring and fixes for VLC

This commit is contained in:
Uriziel 2013-01-18 01:53:50 +01:00
parent e03cfe12c3
commit c354e2d3fd

View File

@ -3,7 +3,6 @@ import re
import threading import threading
from syncplay.players.basePlayer import BasePlayer from syncplay.players.basePlayer import BasePlayer
from syncplay import constants from syncplay import constants
from syncplay.messages import getMessage
import os import os
import random import random
import socket import socket
@ -13,8 +12,8 @@ class VlcPlayer(BasePlayer):
speedSupported = True speedSupported = True
RE_ANSWER = re.compile(r"(?:^(?P<command>[a-zA-Z_]+)(?:\: )?(?P<argument>.*))") RE_ANSWER = re.compile(r"(?:^(?P<command>[a-zA-Z_]+)(?:\: )?(?P<argument>.*))")
VLC_MIN_PORT = 10000 VLC_MIN_PORT = 10000
VLC_MAX_PORT = 65000 VLC_MAX_PORT = 55000
SLAVE_ARGS = ['--extraintf=luaintf','--lua-intf=syncplay','-vvv'] SLAVE_ARGS = ['--extraintf=luaintf','--lua-intf=syncplay']
random.seed() random.seed()
vlcport = random.randrange(VLC_MIN_PORT, VLC_MAX_PORT) vlcport = random.randrange(VLC_MIN_PORT, VLC_MAX_PORT)
@ -26,29 +25,21 @@ class VlcPlayer(BasePlayer):
self._duration = None self._duration = None
self._filename = None self._filename = None
self._filepath = None self._filepath = None
self._readyforchange = True self._playerReady = True
self._updatenotification = False
try: try:
self._listener = self.__Listener(self, playerPath, filePath, args) self._listener = self.__Listener(self, playerPath, filePath, args)
except ValueError: except ValueError:
self._client.ui.showMessage("Failed to load VLC") self._client.ui.showMessage("Failed to load VLC")
self._client.stop(True) self._client.stop(True)
return return
self._listener.setDaemon(True) self._listener.setDaemon(True)
self._listener.start() self._listener.start()
self._durationAsk = threading.Event() self._durationAsk = threading.Event()
self._filenameAsk = threading.Event() self._filenameAsk = threading.Event()
self._pathAsk = threading.Event() self._pathAsk = threading.Event()
self._positionAsk = threading.Event() self._positionAsk = threading.Event()
self._pausedAsk = threading.Event() self._pausedAsk = threading.Event()
self._vlcready = threading.Event() self._vlcready = threading.Event()
self._vlcready.wait() self._vlcready.wait()
self._preparePlayer() self._preparePlayer()
@ -62,26 +53,21 @@ class VlcPlayer(BasePlayer):
self._filenameAsk.wait() self._filenameAsk.wait()
self._pathAsk.wait() self._pathAsk.wait()
def _onFileUpdate(self): def _onFileUpdate(self):
self._fileUpdateClearEvents() self._fileUpdateClearEvents()
self._getFilename() self._getFileInfo()
self._getFilepath()
self._getLength()
self._fileUpdateWaitEvents() self._fileUpdateWaitEvents()
self._client.updateFile(self._filename, self._duration, self._filepath) self._client.updateFile(self._filename, self._duration, self._filepath)
self.setPaused(self._client.getGlobalPaused())
self.setPosition(self._client.getGlobalPosition())
def _preparePlayer(self): def _preparePlayer(self):
self.setPaused(self._client.getGlobalPaused()) self.setPaused(self._client.getGlobalPaused())
self.setPosition(self._client.getGlobalPosition()) self.setPosition(self._client.getGlobalPosition())
self._client.initPlayer(self) self._client.initPlayer(self)
self._readyforchange = True self._playerReady = True
def askForStatus(self): def askForStatus(self):
if (self._updatenotification):
self._updatenotification = False
self._onFileUpdate()
self._positionAsk.clear() self._positionAsk.clear()
self._pausedAsk.clear() self._pausedAsk.clear()
self._listener.sendLine(".") self._listener.sendLine(".")
@ -104,81 +90,37 @@ class VlcPlayer(BasePlayer):
self._paused = value self._paused = value
self._listener.sendLine('set-playstate: {}'.format("paused" if value else "playing")) self._listener.sendLine('set-playstate: {}'.format("paused" if value else "playing"))
def _getFilename(self): def _getFileInfo(self):
self._listener.sendLine("get-duration")
self._listener.sendLine("get-filepath")
self._listener.sendLine("get-filename") self._listener.sendLine("get-filename")
def _getLength(self):
self._listener.sendLine("get-duration")
def _getFilepath(self):
self._listener.sendLine("get-filepath")
def _getPaused(self):
self._listener.sendLine(".")
def _getPosition(self):
self._listener.sendLine(".")
def lineReceived(self, line): def lineReceived(self, line):
#print "received: {}".format(line) match, name, value = self.RE_ANSWER.match(line), "", ""
if (line[:16] == "VLC media player"): if match:
self._vlcready.set() name, value = match.group('command'), match.group('argument')
return
elif(line == "filepath-change-notification"):
if (self._readyforchange):
self._updatenotification = True
return
match = self.RE_ANSWER.match(line)
if not match:
return
name, value = match.group('command'), match.group('argument')
if (name == "filepath"):
if (value != "no-input"):
self._filepath = value
self._pathAsk.set()
elif(name == "duration"):
if (value != "no-input"):
self._duration = float(value)
print line
self._durationAsk.set() #
if (name == "filepath" and value != "no-input"):
self._filepath = value
self._pathAsk.set()
if(line == "filepath-change-notification"):
t = threading.Thread(target=self._onFileUpdate)
t.setDaemon(True)
t.start()
elif(name == "duration" and (value != "no-input")):
self._duration = float(value)
self._durationAsk.set()
elif(name == "playstate"): elif(name == "playstate"):
if(value == "no-input"): self._paused = bool(value == 'paused') if(value != "no-input") else self._client.getGlobalPaused()
self._paused = self._client.getGlobalPaused()
else:
self._paused = bool(value != 'playing')
self._pausedAsk.set() self._pausedAsk.set()
elif(name == "position"): elif(name == "position"):
if (value == "no-input"): self._position = float(value) if (value != "no-input") else self._client.getGlobalPosition()
self._position = self._client.getGlobalPosition()
else:
self._position = float(value)
self._positionAsk.set() self._positionAsk.set()
elif(name == "get-interface-version"):
print name
elif(name == "play-error"):
print name
elif(name == "set-playstate-error"):
print name
elif(name == "set-rate-error"):
print name
elif(name == "display-osd-error"):
print name
elif(name == "filename"): elif(name == "filename"):
self._filename = value self._filename = value
self._filenameAsk.set() self._filenameAsk.set()
elif (line[:16] == "VLC media player"):
self._vlcready.set()
@staticmethod @staticmethod
@ -218,6 +160,7 @@ class VlcPlayer(BasePlayer):
self._positionAsk.set() self._positionAsk.set()
self._vlcready.set() self._vlcready.set()
self._pausedAsk.set() self._pausedAsk.set()
self.__running = False
self._client.stop(False) self._client.stop(False)
class __Listener(threading.Thread, asynchat.async_chat): class __Listener(threading.Thread, asynchat.async_chat):
@ -230,25 +173,37 @@ class VlcPlayer(BasePlayer):
if(args): if(args):
call.extend(args) call.extend(args)
self.__process = subprocess.Popen(call) self.__process = subprocess.Popen(call, stderr=subprocess.PIPE)
threading.Thread.__init__(self, name="VLC Listener") threading.Thread.__init__(self, name="VLC Listener")
asynchat.async_chat.__init__(self) asynchat.async_chat.__init__(self)
self.set_terminator("\n") self.set_terminator("\n")
self._ibuffer = [] self._ibuffer = []
self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self._sendingData = threading.Lock()
self.connect(('localhost', self.__playerController.vlcport)) self.connect(('localhost', self.__playerController.vlcport))
def initiate_send(self):
with self._sendingData:
asynchat.async_chat.initiate_send(self)
def run(self): def run(self):
self.__running = True
asyncore.loop() asyncore.loop()
def collect_incoming_data(self, data): def collect_incoming_data(self, data):
self._ibuffer.append(data) self._ibuffer.append(data)
def close(self):
self.__running = False
self.__playerController.drop()
def found_terminator(self): def found_terminator(self):
# print "received: {}".format("".join(self._ibuffer))
self.__playerController.lineReceived("".join(self._ibuffer)) self.__playerController.lineReceived("".join(self._ibuffer))
self._ibuffer = [] self._ibuffer = []
def sendLine(self, line): def sendLine(self, line):
self.__playerController._vlcready.wait() if(self.__running):
#print "send: {}".format(line) # print "send: {}".format(line)
self.push(line + "\n") self.push(line + "\n")