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

View File

@ -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: {}}

View File

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