Impose maximum character/line limits on playlist (server-side)

This commit is contained in:
Et0h 2016-11-14 16:25:31 +00:00
parent 1af4d69fbd
commit c6818f660a
3 changed files with 12 additions and 4 deletions

View File

@ -52,6 +52,8 @@ WARNING_OSD_MESSAGES_LOOP_INTERVAL = 1
AUTOPLAY_DELAY = 3.0 AUTOPLAY_DELAY = 3.0
DO_NOT_RESET_POSITION_THRESHOLD = 1.0 DO_NOT_RESET_POSITION_THRESHOLD = 1.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
PLAYLIST_MAX_CHARACTERS = 10000
PLAYLIST_MAX_ITEMS = 250
# Options for the File Switch feature: # Options for the File Switch feature:
FOLDER_SEARCH_FIRST_FILE_TIMEOUT = 15.0 # Secs - How long to wait to find the first file in folder search (to take account of HDD spin up) FOLDER_SEARCH_FIRST_FILE_TIMEOUT = 15.0 # Secs - How long to wait to find the first file in folder search (to take account of HDD spin up)

View File

@ -11,7 +11,7 @@ import codecs
import os import os
from string import Template from string import Template
import argparse import argparse
from syncplay.utils import RoomPasswordProvider, NotControlledRoom, RandomStringGenerator, meetsMinVersion from syncplay.utils import RoomPasswordProvider, NotControlledRoom, RandomStringGenerator, meetsMinVersion, playlistIsValid
class SyncFactory(Factory): class SyncFactory(Factory):
def __init__(self, password='', motdFilePath=None, isolateRooms=False, salt=None, disableReady=False): def __init__(self, password='', motdFilePath=None, isolateRooms=False, salt=None, disableReady=False):
@ -139,14 +139,13 @@ class SyncFactory(Factory):
def setPlaylist(self, watcher, files): def setPlaylist(self, watcher, files):
room = watcher.getRoom() room = watcher.getRoom()
if room.canControl(watcher): if room.canControl(watcher) and playlistIsValid(files):
watcher.getRoom().setPlaylist(files, watcher) watcher.getRoom().setPlaylist(files, watcher)
self._roomManager.broadcastRoom(watcher, lambda w: w.setPlaylist(watcher.getName(), files)) self._roomManager.broadcastRoom(watcher, lambda w: w.setPlaylist(watcher.getName(), files))
else: else:
watcher.setPlaylist(room.getName(), room.getPlaylist()) watcher.setPlaylist(room.getName(), room.getPlaylist())
watcher.setPlaylistIndex(room.getName(), room.getPlaylistIndex()) watcher.setPlaylistIndex(room.getName(), room.getPlaylistIndex())
def setPlaylistIndex(self, watcher, index): def setPlaylistIndex(self, watcher, index):
room = watcher.getRoom() room = watcher.getRoom()
if room.canControl(watcher): if room.canControl(watcher):
@ -350,7 +349,7 @@ class ControlledRoom(Room):
Room.setPosition(self, position, setBy) Room.setPosition(self, position, setBy)
def setPlaylist(self, files, setBy=None): def setPlaylist(self, files, setBy=None):
if self.canControl(setBy): if self.canControl(setBy) and playlistIsValid(files):
self._playlist = files self._playlist = files
def setPlaylistIndex(self, index, setBy=None): def setPlaylistIndex(self, index, setBy=None):

View File

@ -250,6 +250,13 @@ def getListAsMultilineString(pathArray):
def convertMultilineStringToList(multilineString): def convertMultilineStringToList(multilineString):
return unicode.split(multilineString,u"\n") if multilineString else "" return unicode.split(multilineString,u"\n") if multilineString else ""
def playlistIsValid(files):
if len(files) > constants.PLAYLIST_MAX_ITEMS:
return False
elif sum(map(len, files)) > constants.PLAYLIST_MAX_CHARACTERS:
return False
return True
def getDomainFromURL(URL): def getDomainFromURL(URL):
try: try:
URL = URL.split("//")[-1].split("/")[0] URL = URL.split("//")[-1].split("/")[0]