Added method stubs for sharedplaylists

This commit is contained in:
Uriziel 2015-10-01 23:30:15 +02:00
parent 9a12bac379
commit efe32b406e
4 changed files with 117 additions and 6 deletions

View File

@ -113,6 +113,9 @@ class SyncplayClient(object):
self.autoplayTimer = task.LoopingCall(self.autoplayCountdown) self.autoplayTimer = task.LoopingCall(self.autoplayCountdown)
self.autoplayTimeLeft = constants.AUTOPLAY_DELAY self.autoplayTimeLeft = constants.AUTOPLAY_DELAY
self._playlist = []
self._playlistIndex = None
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'])
@ -156,9 +159,6 @@ class SyncplayClient(object):
return False return False
return True return True
def playlistUpdate(self, newPlaylist):
print newPlaylist
def _determinePlayerStateChange(self, paused, position): def _determinePlayerStateChange(self, paused, position):
pauseChange = self.getPlayerPaused() != paused and self.getGlobalPaused() != paused pauseChange = self.getPlayerPaused() != paused and self.getGlobalPaused() != paused
_playerDiff = abs(self.getPlayerPosition() - position) _playerDiff = abs(self.getPlayerPosition() - position)
@ -171,6 +171,7 @@ class SyncplayClient(object):
pauseChange, seeked = self._determinePlayerStateChange(paused, position) pauseChange, seeked = self._determinePlayerStateChange(paused, position)
self._playerPosition = position self._playerPosition = position
self._playerPaused = paused self._playerPaused = paused
# TODO: if position +- 1s of the end of a file AND has next file in playlist -> rewind to 0 and switch file
if pauseChange and utils.meetsMinVersion(self.serverVersion, constants.USER_READY_MIN_VERSION): if pauseChange and utils.meetsMinVersion(self.serverVersion, constants.USER_READY_MIN_VERSION):
if not self.userlist.currentUser.canControl(): if not self.userlist.currentUser.canControl():
self._player.setPaused(self._globalPaused) self._player.setPaused(self._globalPaused)
@ -410,6 +411,37 @@ class SyncplayClient(object):
self.userlist.currentUser.setFile(filename, duration, size, path) self.userlist.currentUser.setFile(filename, duration, size, path)
self.sendFile() self.sendFile()
# TODO: execute changeToPlaylistIndex if file found in playlist
def changeToPlaylistIndex(self, index, username = None):
if self._playlistIndex == index:
return
self._playlistIndex = index
if username is None and self._protocol and self._protocol.logged:
self._protocol.setPlaylistIndex(index)
elif username != self.getUsername():
# TODO: Display info about playlist file change
if index in self._playlist:
filename = self._playlist[index]
# TODO: Find Path
path = 'https://www.youtube.com/watch?v=0iXX5h6Hxxs'
if path:
self._player.openFile(path)
else:
# TODO: Notify user about file not found
pass
def changePlaylist(self, files, username = None):
self._playlist = files
if username is None and self._protocol and self._protocol.logged:
self._protocol.setPlaylist(files)
elif username != self.getUsername():
pass
# TODO: Display info about playlist change
# TODO: Update UI with new playlist
def __executePrivacySettings(self, filename, size): def __executePrivacySettings(self, filename, size):
if self._config['filenamePrivacyMode'] == PRIVACY_SENDHASHED_MODE: if self._config['filenamePrivacyMode'] == PRIVACY_SENDHASHED_MODE:
filename = utils.hashFilename(filename) filename = utils.hashFilename(filename)

View File

@ -140,6 +140,10 @@ class SyncClientProtocol(JSONCommandProtocol):
user, isReady = values["username"], values["isReady"] user, isReady = values["username"], values["isReady"]
manuallyInitiated = values["manuallyInitiated"] if values.has_key("manuallyInitiated") else True manuallyInitiated = values["manuallyInitiated"] if values.has_key("manuallyInitiated") else True
self._client.setReady(user, isReady, manuallyInitiated) self._client.setReady(user, isReady, manuallyInitiated)
elif command == "playlistIndex":
self._client.changeToPlaylistIndex(values['index'], values['user'])
elif command == "playlistChange":
self._client.changePlaylist(values['files'], values['user'])
def sendSet(self, setting): def sendSet(self, setting):
self.sendMessage({"Set": setting}) self.sendMessage({"Set": setting})
@ -247,6 +251,21 @@ class SyncClientProtocol(JSONCommandProtocol):
} }
}) })
def setPlaylist(self, files):
self.sendSet({
"playlistChange": {
"files": files
}
})
def setPlaylistIndex(self, index):
self.sendSet({
"playlistIndex": {
"index": index
}
})
def handleError(self, error): def handleError(self, error):
self.dropWithError(error["message"]) self.dropWithError(error["message"])
@ -358,6 +377,10 @@ class SyncServerProtocol(JSONCommandProtocol):
elif command == "ready": elif command == "ready":
manuallyInitiated = set_[1]['manuallyInitiated'] if set_[1].has_key("manuallyInitiated") else False manuallyInitiated = set_[1]['manuallyInitiated'] if set_[1].has_key("manuallyInitiated") else False
self._factory.setReady(self._watcher, set_[1]['isReady'], manuallyInitiated=manuallyInitiated) self._factory.setReady(self._watcher, set_[1]['isReady'], manuallyInitiated=manuallyInitiated)
elif command == "playlistChange":
self._factory.setPlaylist(self._watcher, set_[1]['files'])
elif command == "playlistIndex":
self._factory.setPlaylistIndex(self._watcher, set_[1]['index'])
def sendSet(self, setting): def sendSet(self, setting):
self.sendMessage({"Set": setting}) self.sendMessage({"Set": setting})
@ -389,6 +412,22 @@ class SyncServerProtocol(JSONCommandProtocol):
} }
}) })
def setPlaylist(self, username, files):
self.sendSet({
"playlistChange": {
"user": username,
"files": files
}
})
def setPlaylistIndex(self, username, index):
self.sendSet({
"playlistIndex": {
"user": username,
"index": index
}
})
def sendUserSetting(self, username, room, file_, event): def sendUserSetting(self, username, room, file_, event):
room = {"name": room.getName()} room = {"name": room.getName()}
user = {username: {}} user = {username: {}}

View File

@ -72,8 +72,12 @@ class SyncFactory(Factory):
self.sendJoinMessage(watcher) self.sendJoinMessage(watcher)
else: else:
self.sendRoomSwitchMessage(watcher) self.sendRoomSwitchMessage(watcher)
room = watcher.getRoom()
watcher.setPlaylist(room.getSetBy().getName(), room.getPlaylist())
watcher.setPlaylistIndex(room.getSetBy().getName(), room.getPlaylistIndex())
if RoomPasswordProvider.isControlledRoom(roomName): if RoomPasswordProvider.isControlledRoom(roomName):
for controller in watcher.getRoom().getControllers(): for controller in room.getControllers():
watcher.sendControlledRoomAuthStatus(True, controller, roomName) watcher.sendControlledRoomAuthStatus(True, controller, roomName)
def sendRoomSwitchMessage(self, watcher): def sendRoomSwitchMessage(self, watcher):
@ -132,6 +136,14 @@ class SyncFactory(Factory):
watcher.setReady(isReady) watcher.setReady(isReady)
self._roomManager.broadcastRoom(watcher, lambda w: w.sendSetReady(watcher.getName(), watcher.isReady(), manuallyInitiated)) self._roomManager.broadcastRoom(watcher, lambda w: w.sendSetReady(watcher.getName(), watcher.isReady(), manuallyInitiated))
def setPlaylist(self, watcher, files):
watcher.getRoom().setPlaylist(files, watcher)
self._roomManager.broadcastRoom(watcher, lambda w: w.setPlaylist(watcher.getName(), files))
def setPlaylistIndex(self, watcher, index):
watcher.getRoom().setPlaylistIndex(index, watcher)
self._roomManager.broadcastRoom(watcher, lambda w: w.setPlaylistIndex(watcher.getName(), index))
class RoomManager(object): class RoomManager(object):
def __init__(self): def __init__(self):
self._rooms = {} self._rooms = {}
@ -214,6 +226,8 @@ class Room(object):
self._watchers = {} self._watchers = {}
self._playState = self.STATE_PAUSED self._playState = self.STATE_PAUSED
self._setBy = None self._setBy = None
self._playlist = []
self._playlistIndex = None
def __str__(self, *args, **kwargs): def __str__(self, *args, **kwargs):
return self.getName() return self.getName()
@ -268,6 +282,18 @@ class Room(object):
def canControl(self, watcher): def canControl(self, watcher):
return True return True
def setPlaylist(self, files, setBy=None):
self._playlist = files
def setPlaylistIndex(self, index, setBy=None):
self._playlistIndex = index
def getPlaylist(self):
return self._playlist
def getPlaylistIndex(self):
return self._playlistIndex
class ControlledRoom(Room): class ControlledRoom(Room):
def __init__(self, name): def __init__(self, name):
Room.__init__(self, name) Room.__init__(self, name)
@ -297,6 +323,14 @@ class ControlledRoom(Room):
if self.canControl(setBy): if self.canControl(setBy):
Room.setPosition(self, position, setBy) Room.setPosition(self, position, setBy)
def setPlaylist(self, files, setBy=None):
if self.canControl(setBy):
self._playlist = files
def setPlaylistIndex(self, index, setBy=None):
if self.canControl(setBy):
self._playlistIndex = index
def canControl(self, watcher): def canControl(self, watcher):
return watcher.getName() in self._controllers return watcher.getName() in self._controllers
@ -370,6 +404,12 @@ class Watcher(object):
def sendSetReady(self, username, isReady, manuallyInitiated=True): def sendSetReady(self, username, isReady, manuallyInitiated=True):
self._connector.sendSetReady(username, isReady, manuallyInitiated) self._connector.sendSetReady(username, isReady, manuallyInitiated)
def setPlaylistIndex(self, username, index):
self._connector.setPlaylistIndex(username, index)
def setPlaylist(self, username, files):
self._connector.setPlaylist(username, files)
def __lt__(self, b): def __lt__(self, b):
if self.getPosition() is None or self._file is None: if self.getPosition() is None or self._file is None:
return False return False
@ -442,4 +482,4 @@ class ConfigurationGetter(object):
self._argparser.add_argument('--isolate-rooms', action='store_true', help=getMessage("server-isolate-room-argument")) self._argparser.add_argument('--isolate-rooms', action='store_true', help=getMessage("server-isolate-room-argument"))
self._argparser.add_argument('--disable-ready', action='store_true', help=getMessage("server-disable-ready-argument")) self._argparser.add_argument('--disable-ready', action='store_true', help=getMessage("server-disable-ready-argument"))
self._argparser.add_argument('--salt', metavar='salt', type=str, nargs='?', help=getMessage("server-salt-argument")) self._argparser.add_argument('--salt', metavar='salt', type=str, nargs='?', help=getMessage("server-salt-argument"))
self._argparser.add_argument('--motd-file', metavar='file', type=str, nargs='?', help=getMessage("server-motd-argument")) self._argparser.add_argument('--motd-file', metavar='file', type=str, nargs='?', help=getMessage("server-motd-argument"))

View File

@ -807,7 +807,7 @@ class MainWindow(QtGui.QMainWindow):
newPlaylist = self.getPlaylistState() newPlaylist = self.getPlaylistState()
if newPlaylist <> self.playlistState and self._syncplayClient: if newPlaylist <> self.playlistState and self._syncplayClient:
self.playlistState = newPlaylist self.playlistState = newPlaylist
self._syncplayClient.playlistUpdate(newPlaylist) self._syncplayClient.changePlaylist(newPlaylist)
def addTopLayout(self, window): def addTopLayout(self, window):
window.topSplit = self.topSplitter(Qt.Horizontal, self) window.topSplit = self.topSplitter(Qt.Horizontal, self)