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)