Hopefully fix new mpv file change issues

This commit is contained in:
Et0h 2014-09-14 12:52:59 +01:00
parent db6bb28afb
commit 1c660244ef
3 changed files with 74 additions and 15 deletions

View File

@ -87,6 +87,7 @@ MPC_LOCK_WAIT_TIME = 0.2
MPC_RETRY_WAIT_TIME = 0.01 MPC_RETRY_WAIT_TIME = 0.01
MPC_MAX_RETRIES = 30 MPC_MAX_RETRIES = 30
MPC_PAUSE_TOGGLE_DELAY = 0.05 MPC_PAUSE_TOGGLE_DELAY = 0.05
MPV_NEWFILE_IGNORE_TIME = 1
VLC_OPEN_MAX_WAIT_TIME = 15 VLC_OPEN_MAX_WAIT_TIME = 15
VLC_MIN_PORT = 10000 VLC_MIN_PORT = 10000
VLC_MAX_PORT = 55000 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'] 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 # --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=<SyncplayUpdateFile>\nANS_filename=${filename}\nANS_length=${=length}\nANS_path=${path}\n</SyncplayUpdateFile>']
MPV_SLAVE_ARGS_WINDOWS = ['--slave-broken'] MPV_SLAVE_ARGS_WINDOWS = ['--slave-broken']
MPV_SLAVE_ARGS_NONWINDOWS = ['--input-terminal=no','--input-file=/dev/stdin'] 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', VLC_SLAVE_ARGS = ['--extraintf=luaintf', '--lua-intf=syncplay', '--no-quiet', '--no-input-fast-seek',

View File

@ -23,6 +23,8 @@ class MplayerPlayer(BasePlayer):
self._filename = None self._filename = None
self._filepath = None self._filepath = None
self.quitReason = None self.quitReason = None
self.lastLoadedTime = None
self.fileLoaded = False
try: try:
self._listener = self.__Listener(self, playerPath, filePath, args) self._listener = self.__Listener(self, playerPath, filePath, args)
except ValueError: except ValueError:
@ -65,6 +67,9 @@ class MplayerPlayer(BasePlayer):
self.reactor.callLater(0, self._client.initPlayer, self) self.reactor.callLater(0, self._client.initPlayer, self)
self._onFileUpdate() self._onFileUpdate()
def _onMPVFileUpdate(self):
pass
def askForStatus(self): def askForStatus(self):
self._positionAsk.clear() self._positionAsk.clear()
self._pausedAsk.clear() self._pausedAsk.clear()
@ -87,6 +92,7 @@ class MplayerPlayer(BasePlayer):
self._setProperty('speed', "{:.2f}".format(value)) self._setProperty('speed', "{:.2f}".format(value))
def openFile(self, filePath): def openFile(self, filePath):
self._clearFileLoaded()
self._listener.sendLine(u'loadfile {}'.format(self._quoteArg(filePath))) self._listener.sendLine(u'loadfile {}'.format(self._quoteArg(filePath)))
self._onFileUpdate() self._onFileUpdate()
if self._paused != self._client.getGlobalPaused(): if self._paused != self._client.getGlobalPaused():
@ -124,18 +130,17 @@ class MplayerPlayer(BasePlayer):
arg = arg.replace('"', '\\"') arg = arg.replace('"', '\\"')
return u'"{}"'.format(arg) return u'"{}"'.format(arg)
def lineReceived(self, line): def _fileIsLoaded(self):
if "Error parsing option" in line: return True
self.quitReason = getMessage("mpv-version-error")
if "Failed to get value of property" in line: def _clearFileLoaded(self):
if "filename" in line: pass
self._getFilename()
elif "length" in line: def _handleMPVLines(self, line):
self._getLength() pass
elif "path" in line:
self._getFilepath() def lineReceived(self, line):
return self._handleMPVLines(line)
match = self.RE_ANSWER.match(line) match = self.RE_ANSWER.match(line)
if not match: if not match:
@ -145,10 +150,16 @@ class MplayerPlayer(BasePlayer):
name = name.lower() name = name.lower()
if name == self.POSITION_QUERY: 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() self._positionAsk.set()
elif name == "pause": 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() self._pausedAsk.set()
elif name == "length": elif name == "length":
self._duration = float(value) self._duration = float(value)

View File

@ -1,8 +1,9 @@
import re import re
import subprocess import subprocess
from syncplay.players.mplayer import MplayerPlayer from syncplay.players.mplayer import MplayerPlayer
from syncplay.messages import getMessage
from syncplay import constants from syncplay import constants
import os, sys import os, sys, time
class MpvPlayer(MplayerPlayer): class MpvPlayer(MplayerPlayer):
POSITION_QUERY = 'time-pos' POSITION_QUERY = 'time-pos'
@ -17,6 +18,52 @@ class MpvPlayer(MplayerPlayer):
self._paused = not self._paused self._paused = not self._paused
self._listener.sendLine('cycle pause') 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 == "<SyncplayUpdateFile>":
self._clearFileLoaded()
elif line == "</SyncplayUpdateFile>":
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 @staticmethod
def run(client, playerPath, filePath, args): def run(client, playerPath, filePath, args):
return MpvPlayer(client, MpvPlayer.getExpandedPath(playerPath), filePath, args) return MpvPlayer(client, MpvPlayer.getExpandedPath(playerPath), filePath, args)