Queue/drop messages sent while mpv is loading a file & throttle mpv message sending (+ revert problematic unicode)

This commit is contained in:
Et0h 2016-06-11 19:51:10 +01:00
parent e71de798e9
commit 28eb7a0561
6 changed files with 63 additions and 6 deletions

View File

@ -1,4 +1,4 @@
version = '1.4.0'
milestone = 'Yoitsu'
release_number = '24'
release_number = '25'
projectURL = 'http://syncplay.pl/'

View File

@ -1280,7 +1280,7 @@ class UiManager(object):
def showDebugMessage(self, message):
if constants.DEBUG_MODE and message.rstrip():
sys.stderr.write(u"{}{}\n".format(time.strftime(constants.UI_TIME_FORMAT, time.localtime()),message.rstrip()))
sys.stderr.write("{}{}\n".format(time.strftime(constants.UI_TIME_FORMAT, time.localtime()),message.rstrip()))
def showMessage(self, message, noPlayer=False, noTimestamp=False, secondaryOSD=False):
if not noPlayer: self.showOSDMessage(message, duration=constants.OSD_DURATION, secondaryOSD=secondaryOSD)

View File

@ -121,6 +121,8 @@ MPC_RETRY_WAIT_TIME = 0.01
MPC_MAX_RETRIES = 30
MPC_PAUSE_TOGGLE_DELAY = 0.05
MPV_NEWFILE_IGNORE_TIME = 1
MPV_SENDMESSAGE_COOLDOWN_TIME = 0.05
MPV_MAX_NEWFILE_COOLDOWN_TIME = 3
STREAM_ADDITIONAL_IGNORE_TIME = 10
MPV_LOCK_WAIT_TIME = 0.05
VLC_OPEN_MAX_WAIT_TIME = 15

View File

@ -266,6 +266,10 @@ class MplayerPlayer(BasePlayer):
class __Listener(threading.Thread):
def __init__(self, playerController, playerPath, filePath, args):
self.sendQueue = []
self.readyToSend = True
self.lastSendTime = None
self.lastNotReadyTime = None
self.__playerController = playerController
if self.__playerController.getPlayerPathErrors(playerPath,filePath):
raise ValueError()
@ -322,12 +326,54 @@ class MplayerPlayer(BasePlayer):
self.__playerController.lineReceived(line)
self.__playerController.drop()
def sendLine(self, line):
def isReadyForSend(self):
self.checkForReadinessOverride()
return self.readyToSend
def setReadyToSend(self, newReadyState):
oldState = self.readyToSend
self.readyToSend = newReadyState
self.lastNotReadyTime = time.time() if newReadyState == False else None
if self.readyToSend == True:
self.__playerController._client.ui.showDebugMessage("<mpv> Ready to send: True")
else:
self.__playerController._client.ui.showDebugMessage("<mpv> Ready to send: False")
if self.readyToSend == True and oldState == False:
self.processSendQueue()
def checkForReadinessOverride(self):
if self.lastNotReadyTime and time.time() - self.lastNotReadyTime > constants.MPV_MAX_NEWFILE_COOLDOWN_TIME:
self.setReadyToSend(True)
def sendLine(self, line, notReadyAfterThis=None):
self.checkForReadinessOverride()
if self.readyToSend == False and "print_text ANS_pause" in line:
self.__playerController._client.ui.showDebugMessage("<mpv> Not ready to get status update, so skipping")
return
self.sendQueue.append(line)
self.processSendQueue()
if notReadyAfterThis:
self.setReadyToSend(False)
def processSendQueue(self):
while self.sendQueue and self.readyToSend:
if self.lastSendTime and time.time() - self.lastSendTime < constants.MPV_SENDMESSAGE_COOLDOWN_TIME:
self.__playerController._client.ui.showDebugMessage("<mpv> Throttling message send, so sleeping for {}".format(constants.MPV_SENDMESSAGE_COOLDOWN_TIME))
time.sleep(constants.MPV_SENDMESSAGE_COOLDOWN_TIME)
try:
lineToSend = self.sendQueue.pop()
if lineToSend:
self.lastSendTime = time.time()
self.actuallySendLine(lineToSend)
except IndexError:
pass
def actuallySendLine(self, line):
try:
if not isinstance(line, unicode):
line = line.decode('utf8')
line = (line + u"\n").encode('utf8')
self.__playerController._client.ui.showDebugMessage(u"player >> {}".format(line))
self.__playerController._client.ui.showDebugMessage("player >> {}".format(line))
self.__process.stdin.write(line)
except IOError:
pass

View File

@ -163,6 +163,10 @@ class NewMpvPlayer(OldMpvPlayer):
def askForStatus(self):
self._positionAsk.clear()
self._pausedAsk.clear()
if not self._listener.isReadyForSend:
self._client.ui.showDebugMessage("mpv not ready for update")
return
self._getPausedAndPosition()
self._positionAsk.wait(constants.MPV_LOCK_WAIT_TIME)
self._pausedAsk.wait(constants.MPV_LOCK_WAIT_TIME)
@ -183,7 +187,7 @@ class NewMpvPlayer(OldMpvPlayer):
def _loadFile(self, filePath):
self._clearFileLoaded()
self._listener.sendLine(u'loadfile {}'.format(self._quoteArg(filePath)))
self._listener.sendLine(u'loadfile {}'.format(self._quoteArg(filePath)), notReadyAfterThis=True)
def setPosition(self, value):
super(self.__class__, self).setPosition(value)
@ -206,10 +210,15 @@ class NewMpvPlayer(OldMpvPlayer):
self.mpvErrorCheck(line)
if line == "<SyncplayUpdateFile>" or "Playing:" in line:
self._listener.setReadyToSend(False)
self._clearFileLoaded()
elif line == "</SyncplayUpdateFile>":
self._onFileUpdate()
self._listener.setReadyToSend(True)
elif "Failed" in line or "failed" in line or "No video or audio streams selected" in line or "error" in line:
self._listener.setReadyToSend(True)
def _recentlyReset(self):
if not self.lastResetTime:

View File

@ -368,7 +368,7 @@ class VlcPlayer(BasePlayer):
self.sendLine("get-vlc-version")
try:
self.push(line + "\n")
self.__playerController._client.ui.showDebugMessage(u"player >> {}".format(line))
self.__playerController._client.ui.showDebugMessage("player >> {}".format(line))
except:
pass
if line == "close-vlc":