Queue/drop messages sent while mpv is loading a file & throttle mpv message sending (+ revert problematic unicode)
This commit is contained in:
parent
e71de798e9
commit
28eb7a0561
@ -1,4 +1,4 @@
|
||||
version = '1.4.0'
|
||||
milestone = 'Yoitsu'
|
||||
release_number = '24'
|
||||
release_number = '25'
|
||||
projectURL = 'http://syncplay.pl/'
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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":
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user