diff --git a/syncplay/__init__.py b/syncplay/__init__.py index 38cf47b..fef95bb 100644 --- a/syncplay/__init__.py +++ b/syncplay/__init__.py @@ -1,4 +1,4 @@ version = '1.4.0' milestone = 'Yoitsu' -release_number = '24' +release_number = '25' projectURL = 'http://syncplay.pl/' diff --git a/syncplay/client.py b/syncplay/client.py index de75975..d0b4261 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -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) diff --git a/syncplay/constants.py b/syncplay/constants.py index f919e53..62c1eca 100644 --- a/syncplay/constants.py +++ b/syncplay/constants.py @@ -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 diff --git a/syncplay/players/mplayer.py b/syncplay/players/mplayer.py index 0532203..5cf9bd5 100644 --- a/syncplay/players/mplayer.py +++ b/syncplay/players/mplayer.py @@ -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(" Ready to send: True") + else: + self.__playerController._client.ui.showDebugMessage(" 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(" 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(" 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 diff --git a/syncplay/players/mpv.py b/syncplay/players/mpv.py index 01bf160..ff8cf97 100644 --- a/syncplay/players/mpv.py +++ b/syncplay/players/mpv.py @@ -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 == "" or "Playing:" in line: + self._listener.setReadyToSend(False) self._clearFileLoaded() elif line == "": 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: diff --git a/syncplay/players/vlc.py b/syncplay/players/vlc.py index 2a82c75..bdeba7d 100644 --- a/syncplay/players/vlc.py +++ b/syncplay/players/vlc.py @@ -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":