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_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=<SyncplayUpdateFile>\nANS_filename=${filename}\nANS_length=${=length}\nANS_path=${path}\n</SyncplayUpdateFile>']
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',

View File

@ -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)

View File

@ -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 == "<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
def run(client, playerPath, filePath, args):
return MpvPlayer(client, MpvPlayer.getExpandedPath(playerPath), filePath, args)