Autoplay countdown (+reduce autoplayCheck frequency)

This commit is contained in:
Et0h 2015-02-16 20:06:15 +00:00
parent 279eb1bffb
commit 19a22b9105
3 changed files with 59 additions and 10 deletions

View File

@ -107,6 +107,9 @@ class SyncplayClient(object):
self.autoPlay = False self.autoPlay = False
self.autoPlayThreshold = None self.autoPlayThreshold = None
self.autoplayTimer = task.LoopingCall(self.autoplayCountdown)
self.autoplayTimeLeft = constants.AUTOPLAY_DELAY
self._warnings = self._WarningManager(self._player, self.userlist, self.ui, self) self._warnings = self._WarningManager(self._player, self.userlist, self.ui, self)
if constants.LIST_RELATIVE_CONFIGS and self._config.has_key('loadedRelativePaths') and self._config['loadedRelativePaths']: if constants.LIST_RELATIVE_CONFIGS and self._config.has_key('loadedRelativePaths') and self._config['loadedRelativePaths']:
paths = "; ".join(self._config['loadedRelativePaths']) paths = "; ".join(self._config['loadedRelativePaths'])
@ -498,16 +501,50 @@ class SyncplayClient(object):
self.autoplayCheck() self.autoplayCheck()
def changeAutoPlayThrehsold(self, newThreshold): def changeAutoPlayThrehsold(self, newThreshold):
oldAutoplayConditionsMet = self.autoplayConditionsMet()
self.autoPlayThreshold = newThreshold self.autoPlayThreshold = newThreshold
self.autoplayCheck() newAutoplayConditionsMet = self.autoplayConditionsMet()
if oldAutoplayConditionsMet == False and newAutoplayConditionsMet == True:
self.autoplayCheck()
def autoplayCheck(self): def autoplayCheck(self):
if self.autoPlay and self.userlist.currentUser.canControl() and self.userlist.isReadinessSupported() and self.userlist.areAllUsersInRoomReady() and self.autoPlayThreshold and self.userlist.usersInRoomCount() >= self.autoPlayThreshold: if self.autoplayConditionsMet():
self.startAutoplayCountdown()
else:
self.stopAutoplayCountdown()
def autoplayConditionsMet(self):
return self._playerPaused and self.autoPlay and self.userlist.currentUser.canControl() and self.userlist.isReadinessSupported() and self.userlist.areAllUsersInRoomReady() and self.autoPlayThreshold and self.userlist.usersInRoomCount() >= self.autoPlayThreshold
def autoplayTimerIsRunning(self):
return self.autoplayTimer.running
def startAutoplayCountdown(self):
if self.autoplayConditionsMet() and not self.autoplayTimer.running:
self.autoplayTimeLeft = constants.AUTOPLAY_DELAY
self.autoplayTimer.start(1)
def stopAutoplayCountdown(self):
if self.autoplayTimer.running:
self.autoplayTimer.stop()
self.autoplayTimeLeft = constants.AUTOPLAY_DELAY
def autoplayCountdown(self):
if not self.autoplayConditionsMet():
self.stopAutoplayCountdown()
return
countdownMessage = u"{}{}{}".format(getMessage("all-users-ready").format(self.userlist.readyUserCount()),self._player.osdMessageSeparator, getMessage("autoplaying-notification").format(int(self.autoplayTimeLeft)))
self.ui.showOSDMessage(countdownMessage, 1, secondaryOSD=True)
if self.autoplayTimeLeft <= 0:
self.setPaused(False) self.setPaused(False)
self.stopAutoplayCountdown()
else:
self.autoplayTimeLeft -= 1
def resetAutoPlayState(self): def resetAutoPlayState(self):
self.autoPlay = False self.autoPlay = False
self.ui.updateAutoPlayState(False) self.ui.updateAutoPlayState(False)
self.stopAutoplayCountdown()
@requireMinServerVersion(constants.USER_READY_MIN_VERSION) @requireMinServerVersion(constants.USER_READY_MIN_VERSION)
def toggleReady(self, manuallyInitiated=True): def toggleReady(self, manuallyInitiated=True):
@ -616,6 +653,8 @@ class SyncplayClient(object):
self.pausedTimer.start(constants.WARNING_OSD_MESSAGES_LOOP_INTERVAL, True) self.pausedTimer.start(constants.WARNING_OSD_MESSAGES_LOOP_INTERVAL, True)
def checkWarnings(self): def checkWarnings(self):
if self._client.autoplayConditionsMet():
return
self._checkIfYouReAloneInTheRoom(OSDOnly=False) self._checkIfYouReAloneInTheRoom(OSDOnly=False)
self._checkRoomForSameFiles(OSDOnly=False) self._checkRoomForSameFiles(OSDOnly=False)
self.checkReadyStates() self.checkReadyStates()
@ -660,7 +699,7 @@ class SyncplayClient(object):
self._displayReadySameWarning() self._displayReadySameWarning()
def _displayReadySameWarning(self): def _displayReadySameWarning(self):
if not self._client._player: if not self._client._player or self._client.autoplayTimerIsRunning():
return return
osdMessage = None osdMessage = None
fileDifferencesForRoom = self._userlist.getFileDifferencesForRoom() fileDifferencesForRoom = self._userlist.getFileDifferencesForRoom()
@ -693,6 +732,8 @@ class SyncplayClient(object):
pass pass
def __displayPausedMessagesOnOSD(self): def __displayPausedMessagesOnOSD(self):
if self._client.autoplayConditionsMet():
return
if self._client and self._client._player and self._client.getPlayerPaused(): if self._client and self._client._player and self._client.getPlayerPaused():
self._checkRoomForSameFiles(OSDOnly=True) self._checkRoomForSameFiles(OSDOnly=True)
self.checkReadyStates() self.checkReadyStates()
@ -1055,7 +1096,8 @@ class UiManager(object):
self.__ui.showUserList(currentUser, rooms) self.__ui.showUserList(currentUser, rooms)
def showOSDMessage(self, message, duration=constants.OSD_DURATION, secondaryOSD=False): def showOSDMessage(self, message, duration=constants.OSD_DURATION, secondaryOSD=False):
if secondaryOSD and not constants.SHOW_OSD_WARNINGS: autoplayConditionsMet = self._client.autoplayConditionsMet()
if secondaryOSD and not constants.SHOW_OSD_WARNINGS and not self._client.autoplayTimerIsRunning():
return return
if not self._client._player: if not self._client._player:
return return
@ -1063,7 +1105,10 @@ class UiManager(object):
if not self._client._player.secondaryOSDSupported: if not self._client._player.secondaryOSDSupported:
if secondaryOSD: if secondaryOSD:
self.lastSecondaryOSDMessage = message self.lastSecondaryOSDMessage = message
self.lastSecondaryOSDEndTime = time.time() + constants.NO_SECONDARY_OSD_WARNING_DURATION if autoplayConditionsMet:
self.lastSecondaryOSDEndTime = time.time() + 1.0
else:
self.lastSecondaryOSDEndTime = time.time() + constants.NO_SECONDARY_OSD_WARNING_DURATION
if self.lastPrimaryOSDEndTime and time.time() < self.lastPrimaryOSDEndTime: if self.lastPrimaryOSDEndTime and time.time() < self.lastPrimaryOSDEndTime:
message = u"{}{}{}".format(message, self._client._player.osdMessageSeparator, self.lastPrimaryOSDMessage) message = u"{}{}{}".format(message, self._client._player.osdMessageSeparator, self.lastPrimaryOSDMessage)
else: else:
@ -1071,7 +1116,7 @@ class UiManager(object):
self.lastPrimaryOSDEndTime = time.time() + constants.OSD_DURATION self.lastPrimaryOSDEndTime = time.time() + constants.OSD_DURATION
if self.lastSecondaryOSDEndTime and time.time() < self.lastSecondaryOSDEndTime: if self.lastSecondaryOSDEndTime and time.time() < self.lastSecondaryOSDEndTime:
message = u"{}{}{}".format(self.lastSecondaryOSDMessage, self._client._player.osdMessageSeparator, message) message = u"{}{}{}".format(self.lastSecondaryOSDMessage, self._client._player.osdMessageSeparator, message)
self._client._player.displayMessage(message, duration * 1000, secondaryOSD) self._client._player.displayMessage(message, int(duration * 1000), secondaryOSD)
def setControllerStatus(self, username, isController): def setControllerStatus(self, username, isController):
self.__ui.setControllerStatus(username, isController) self.__ui.setControllerStatus(username, isController)

View File

@ -1,8 +1,8 @@
# You might want to change these # You might want to change these
DEFAULT_PORT = 8999 DEFAULT_PORT = 8999
OSD_DURATION = 3 OSD_DURATION = 3.0
OSD_WARNING_MESSAGE_DURATION = 5 OSD_WARNING_MESSAGE_DURATION = 5.0
NO_SECONDARY_OSD_WARNING_DURATION = 13 NO_SECONDARY_OSD_WARNING_DURATION = 13.0
MPC_OSD_POSITION = 1 #Right corner, 1 for left MPC_OSD_POSITION = 1 #Right corner, 1 for left
MPLAYER_OSD_LEVEL = 1 MPLAYER_OSD_LEVEL = 1
UI_TIME_FORMAT = "[%X] " UI_TIME_FORMAT = "[%X] "
@ -34,7 +34,7 @@ MINIMUM_REWIND_THRESHOLD = 3
DEFAULT_FASTFORWARD_THRESHOLD = 5 DEFAULT_FASTFORWARD_THRESHOLD = 5
MINIMUM_FASTFORWARD_THRESHOLD = 4 MINIMUM_FASTFORWARD_THRESHOLD = 4
FASTFORWARD_EXTRA_TIME = 0.25 FASTFORWARD_EXTRA_TIME = 0.25
FASTFORWARD_RESET_THRESHOLD = 3 FASTFORWARD_RESET_THRESHOLD = 3.0
FASTFORWARD_BEHIND_THRESHOLD = 1.75 FASTFORWARD_BEHIND_THRESHOLD = 1.75
SEEK_THRESHOLD = 1 SEEK_THRESHOLD = 1
SLOWDOWN_RATE = 0.95 SLOWDOWN_RATE = 0.95
@ -46,6 +46,7 @@ PROTOCOL_TIMEOUT = 12.5
RECONNECT_RETRIES = 10 RECONNECT_RETRIES = 10
SERVER_STATE_INTERVAL = 1 SERVER_STATE_INTERVAL = 1
WARNING_OSD_MESSAGES_LOOP_INTERVAL = 1 WARNING_OSD_MESSAGES_LOOP_INTERVAL = 1
AUTOPLAY_DELAY = 3.0
SYNC_ON_PAUSE = True # Client seek to global position - subtitles may disappear on some media players SYNC_ON_PAUSE = True # Client seek to global position - subtitles may disappear on some media players
#Usually there's no need to adjust these #Usually there's no need to adjust these
LAST_PAUSED_DIFF_THRESHOLD = 2 LAST_PAUSED_DIFF_THRESHOLD = 2

View File

@ -36,6 +36,7 @@ en = {
"not-all-ready" : u"Not ready: {}", # Usernames "not-all-ready" : u"Not ready: {}", # Usernames
"all-users-ready" : u"Everyone is ready ({} users)", #Number of ready users "all-users-ready" : u"Everyone is ready ({} users)", #Number of ready users
"ready-to-unpause-notification" : u"You are now set as ready - unpause again to unpause", "ready-to-unpause-notification" : u"You are now set as ready - unpause again to unpause",
"autoplaying-notification" : u"Auto-playing in {}...",
"identifying-as-controller-notification" : u"Identifying as room operator with password '{}'...", "identifying-as-controller-notification" : u"Identifying as room operator with password '{}'...",
"failed-to-identify-as-controller-notification" : u"<{}> failed to identify as a room operator.", "failed-to-identify-as-controller-notification" : u"<{}> failed to identify as a room operator.",
@ -381,6 +382,7 @@ ru = {
"not-all-ready" : u"Not ready: {}", # Usernames # TODO: Translate into Russian "not-all-ready" : u"Not ready: {}", # Usernames # TODO: Translate into Russian
"all-users-ready" : u"Everyone is ready ({} users)", #Number of ready users # TODO: Translate into Russian "all-users-ready" : u"Everyone is ready ({} users)", #Number of ready users # TODO: Translate into Russian
"ready-to-unpause-notification" : u"You are now set as ready - unpause again to unpause", # TODO: Translate into Russian "ready-to-unpause-notification" : u"You are now set as ready - unpause again to unpause", # TODO: Translate into Russian
"autoplaying-notification" : u"Auto-playing in {}...", # TODO: Translate into Russian
"identifying-as-controller-notification" : u"Identifying as room operator with password '{}'...", # TODO: Translate into Russian "identifying-as-controller-notification" : u"Identifying as room operator with password '{}'...", # TODO: Translate into Russian
"failed-to-identify-as-controller-notification" : u"<{}> failed to identify as a room operator.", # TODO: Translate into Russian "failed-to-identify-as-controller-notification" : u"<{}> failed to identify as a room operator.", # TODO: Translate into Russian
@ -727,6 +729,7 @@ de = {
"not-all-ready" : u"Not ready: {}", # Usernames # TODO: Translate into German "not-all-ready" : u"Not ready: {}", # Usernames # TODO: Translate into German
"all-users-ready" : u"Everyone is ready ({} users)", #Number of ready users # TODO: Translate into German "all-users-ready" : u"Everyone is ready ({} users)", #Number of ready users # TODO: Translate into German
"ready-to-unpause-notification" : u"You are now set as ready - unpause again to unpause", # TODO: Translate into German "ready-to-unpause-notification" : u"You are now set as ready - unpause again to unpause", # TODO: Translate into German
"autoplaying-notification" : u"Auto-playing in {}...", # TODO: Translate into German
"identifying-as-controller-notification" : u"Identifiziere als Raumleiter mit Passwort '{}'...", # TODO: find a better translation to "room operator" "identifying-as-controller-notification" : u"Identifiziere als Raumleiter mit Passwort '{}'...", # TODO: find a better translation to "room operator"
"failed-to-identify-as-controller-notification" : u"<{}> konnte sich nicht als Raumleiter identifizieren.", "failed-to-identify-as-controller-notification" : u"<{}> konnte sich nicht als Raumleiter identifizieren.",