From 1c660244ef8ab2333df45a95ff787885b2358854 Mon Sep 17 00:00:00 2001 From: Et0h Date: Sun, 14 Sep 2014 12:52:59 +0100 Subject: [PATCH] Hopefully fix new mpv file change issues --- syncplay/constants.py | 3 ++- syncplay/players/mplayer.py | 37 ++++++++++++++++++---------- syncplay/players/mpv.py | 49 ++++++++++++++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 15 deletions(-) diff --git a/syncplay/constants.py b/syncplay/constants.py index c49e03e..641bae8 100644 --- a/syncplay/constants.py +++ b/syncplay/constants.py @@ -87,6 +87,7 @@ MPC_LOCK_WAIT_TIME = 0.2 MPC_RETRY_WAIT_TIME = 0.01 MPC_MAX_RETRIES = 30 MPC_PAUSE_TOGGLE_DELAY = 0.05 +MPV_NEWFILE_IGNORE_TIME = 1 VLC_OPEN_MAX_WAIT_TIME = 15 VLC_MIN_PORT = 10000 VLC_MAX_PORT = 55000 @@ -105,7 +106,7 @@ STYLE_NOFILEITEM_COLOR = 'blue' MPLAYER_SLAVE_ARGS = ['-slave', '--hr-seek=always', '-nomsgcolor', '-msglevel', 'all=1:global=4:cplayer=4'] # --quiet works with both mpv 0.2 and 0.3 -MPV_SLAVE_ARGS = ['--hr-seek=always', '--quiet', '--keep-open'] +MPV_SLAVE_ARGS = ['--hr-seek=always', '--quiet', '--keep-open', '--term-playing-msg=\nANS_filename=${filename}\nANS_length=${=length}\nANS_path=${path}\n'] MPV_SLAVE_ARGS_WINDOWS = ['--slave-broken'] MPV_SLAVE_ARGS_NONWINDOWS = ['--input-terminal=no','--input-file=/dev/stdin'] VLC_SLAVE_ARGS = ['--extraintf=luaintf', '--lua-intf=syncplay', '--no-quiet', '--no-input-fast-seek', diff --git a/syncplay/players/mplayer.py b/syncplay/players/mplayer.py index 343a201..98d72df 100644 --- a/syncplay/players/mplayer.py +++ b/syncplay/players/mplayer.py @@ -23,6 +23,8 @@ class MplayerPlayer(BasePlayer): self._filename = None self._filepath = None self.quitReason = None + self.lastLoadedTime = None + self.fileLoaded = False try: self._listener = self.__Listener(self, playerPath, filePath, args) except ValueError: @@ -65,6 +67,9 @@ class MplayerPlayer(BasePlayer): self.reactor.callLater(0, self._client.initPlayer, self) self._onFileUpdate() + def _onMPVFileUpdate(self): + pass + def askForStatus(self): self._positionAsk.clear() self._pausedAsk.clear() @@ -87,6 +92,7 @@ class MplayerPlayer(BasePlayer): self._setProperty('speed', "{:.2f}".format(value)) def openFile(self, filePath): + self._clearFileLoaded() self._listener.sendLine(u'loadfile {}'.format(self._quoteArg(filePath))) self._onFileUpdate() if self._paused != self._client.getGlobalPaused(): @@ -124,18 +130,17 @@ class MplayerPlayer(BasePlayer): arg = arg.replace('"', '\\"') return u'"{}"'.format(arg) - def lineReceived(self, line): - if "Error parsing option" in line: - self.quitReason = getMessage("mpv-version-error") + def _fileIsLoaded(self): + return True - if "Failed to get value of property" in line: - if "filename" in line: - self._getFilename() - elif "length" in line: - self._getLength() - elif "path" in line: - self._getFilepath() - return + def _clearFileLoaded(self): + pass + + def _handleMPVLines(self, line): + pass + + def lineReceived(self, line): + self._handleMPVLines(line) match = self.RE_ANSWER.match(line) if not match: @@ -145,10 +150,16 @@ class MplayerPlayer(BasePlayer): name = name.lower() if name == self.POSITION_QUERY: - self._position = float(value) + if self._fileIsLoaded(): + self._position = float(value) + else: + self._position = self._client.getGlobalPosition() self._positionAsk.set() elif name == "pause": - self._paused = bool(value == 'yes') + if self._fileIsLoaded(): + self._paused = bool(value == 'yes') + else: + self._paused = self._client.getGlobalPaused() self._pausedAsk.set() elif name == "length": self._duration = float(value) diff --git a/syncplay/players/mpv.py b/syncplay/players/mpv.py index 31979b9..4ba7bcc 100644 --- a/syncplay/players/mpv.py +++ b/syncplay/players/mpv.py @@ -1,8 +1,9 @@ import re import subprocess from syncplay.players.mplayer import MplayerPlayer +from syncplay.messages import getMessage from syncplay import constants -import os, sys +import os, sys, time class MpvPlayer(MplayerPlayer): POSITION_QUERY = 'time-pos' @@ -17,6 +18,52 @@ class MpvPlayer(MplayerPlayer): self._paused = not self._paused self._listener.sendLine('cycle pause') + def _onFileUpdate(self): + pass + + def _clearFileLoaded(self): + self.fileLoaded = False + self.lastLoadedTime = None + + def _handleMPVLines(self, line): + if "Error parsing option" in line: + self.quitReason = getMessage("mpv-version-error") + + elif line == "": + self._clearFileLoaded() + + elif line == "": + self._onMPVFileUpdate() + + elif "Failed to get value of property" in line: + if "filename" in line: + self._getFilename() + elif "length" in line: + self._getLength() + elif "path" in line: + self._getFilepath() + elif "time-pos" in line: + self.setPosition(self._client.getGlobalPosition()) + self._positionAsk.set() + raise ValueError + + elif "Playing:" in line: + self._clearFileLoaded() + + def _onMPVFileUpdate(self): + self.fileLoaded = True + self.lastLoadedTime = time.time() + self.reactor.callFromThread(self._client.updateFile, self._filename, self._duration, self._filepath) + self.reactor.callFromThread(self.setPosition, self._client.getGlobalPosition()) + if self._paused != self._client.getGlobalPaused(): + self.reactor.callFromThread(self._client.getGlobalPaused) + + def _fileIsLoaded(self): + if self.fileLoaded == True and self.lastLoadedTime != None and time.time() > (self.lastLoadedTime + constants.MPV_NEWFILE_IGNORE_TIME): + return True + else: + return False + @staticmethod def run(client, playerPath, filePath, args): return MpvPlayer(client, MpvPlayer.getExpandedPath(playerPath), filePath, args)