From efe32b406e0b1f9cfe2bebd91b7fd49fcaff2f6c Mon Sep 17 00:00:00 2001 From: Uriziel Date: Thu, 1 Oct 2015 23:30:15 +0200 Subject: [PATCH] Added method stubs for sharedplaylists --- syncplay/client.py | 38 ++++++++++++++++++++++++++++++++++--- syncplay/protocols.py | 39 ++++++++++++++++++++++++++++++++++++++ syncplay/server.py | 44 +++++++++++++++++++++++++++++++++++++++++-- syncplay/ui/gui.py | 2 +- 4 files changed, 117 insertions(+), 6 deletions(-) diff --git a/syncplay/client.py b/syncplay/client.py index aa5a7f3..83f1dfb 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -113,6 +113,9 @@ class SyncplayClient(object): self.autoplayTimer = task.LoopingCall(self.autoplayCountdown) self.autoplayTimeLeft = constants.AUTOPLAY_DELAY + self._playlist = [] + self._playlistIndex = None + 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']: paths = "; ".join(self._config['loadedRelativePaths']) @@ -156,9 +159,6 @@ class SyncplayClient(object): return False return True - def playlistUpdate(self, newPlaylist): - print newPlaylist - def _determinePlayerStateChange(self, paused, position): pauseChange = self.getPlayerPaused() != paused and self.getGlobalPaused() != paused _playerDiff = abs(self.getPlayerPosition() - position) @@ -171,6 +171,7 @@ class SyncplayClient(object): pauseChange, seeked = self._determinePlayerStateChange(paused, position) self._playerPosition = position 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 not self.userlist.currentUser.canControl(): self._player.setPaused(self._globalPaused) @@ -410,6 +411,37 @@ class SyncplayClient(object): self.userlist.currentUser.setFile(filename, duration, size, path) 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): if self._config['filenamePrivacyMode'] == PRIVACY_SENDHASHED_MODE: filename = utils.hashFilename(filename) diff --git a/syncplay/protocols.py b/syncplay/protocols.py index a91d429..04fe7cc 100644 --- a/syncplay/protocols.py +++ b/syncplay/protocols.py @@ -140,6 +140,10 @@ class SyncClientProtocol(JSONCommandProtocol): user, isReady = values["username"], values["isReady"] manuallyInitiated = values["manuallyInitiated"] if values.has_key("manuallyInitiated") else True 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): 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): self.dropWithError(error["message"]) @@ -358,6 +377,10 @@ class SyncServerProtocol(JSONCommandProtocol): elif command == "ready": manuallyInitiated = set_[1]['manuallyInitiated'] if set_[1].has_key("manuallyInitiated") else False 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): 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): room = {"name": room.getName()} user = {username: {}} diff --git a/syncplay/server.py b/syncplay/server.py index 3996311..93aceeb 100644 --- a/syncplay/server.py +++ b/syncplay/server.py @@ -72,8 +72,12 @@ class SyncFactory(Factory): self.sendJoinMessage(watcher) else: self.sendRoomSwitchMessage(watcher) + + room = watcher.getRoom() + watcher.setPlaylist(room.getSetBy().getName(), room.getPlaylist()) + watcher.setPlaylistIndex(room.getSetBy().getName(), room.getPlaylistIndex()) if RoomPasswordProvider.isControlledRoom(roomName): - for controller in watcher.getRoom().getControllers(): + for controller in room.getControllers(): watcher.sendControlledRoomAuthStatus(True, controller, roomName) def sendRoomSwitchMessage(self, watcher): @@ -132,6 +136,14 @@ class SyncFactory(Factory): watcher.setReady(isReady) 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): def __init__(self): self._rooms = {} @@ -214,6 +226,8 @@ class Room(object): self._watchers = {} self._playState = self.STATE_PAUSED self._setBy = None + self._playlist = [] + self._playlistIndex = None def __str__(self, *args, **kwargs): return self.getName() @@ -268,6 +282,18 @@ class Room(object): def canControl(self, watcher): 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): def __init__(self, name): Room.__init__(self, name) @@ -297,6 +323,14 @@ class ControlledRoom(Room): if self.canControl(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): return watcher.getName() in self._controllers @@ -370,6 +404,12 @@ class Watcher(object): def sendSetReady(self, username, isReady, manuallyInitiated=True): 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): if self.getPosition() is None or self._file is None: 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('--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('--motd-file', metavar='file', type=str, nargs='?', help=getMessage("server-motd-argument")) \ No newline at end of file + self._argparser.add_argument('--motd-file', metavar='file', type=str, nargs='?', help=getMessage("server-motd-argument")) diff --git a/syncplay/ui/gui.py b/syncplay/ui/gui.py index 529862c..377f19b 100644 --- a/syncplay/ui/gui.py +++ b/syncplay/ui/gui.py @@ -807,7 +807,7 @@ class MainWindow(QtGui.QMainWindow): newPlaylist = self.getPlaylistState() if newPlaylist <> self.playlistState and self._syncplayClient: self.playlistState = newPlaylist - self._syncplayClient.playlistUpdate(newPlaylist) + self._syncplayClient.changePlaylist(newPlaylist) def addTopLayout(self, window): window.topSplit = self.topSplitter(Qt.Horizontal, self)