1# coding:utf8 2# code needed to get customized constants for different OS 3import sys 4 5OS_WINDOWS = "win" 6OS_LINUX = "linux" 7OS_MACOS = "darwin" 8OS_BSD = "freebsd" 9OS_DRAGONFLY = "dragonfly" 10OS_DEFAULT = "default" 11 12def getValueForOS(constantDict): 13 if sys.platform.startswith(OS_WINDOWS): 14 return constantDict[OS_WINDOWS] if OS_WINDOWS in constantDict else constantDict[OS_DEFAULT] 15 if sys.platform.startswith(OS_LINUX): 16 return constantDict[OS_LINUX] if OS_LINUX in constantDict else constantDict[OS_DEFAULT] 17 if sys.platform.startswith(OS_MACOS): 18 return constantDict[OS_MACOS] if OS_MACOS in constantDict else constantDict[OS_DEFAULT] 19 if OS_BSD in sys.platform or sys.platform.startswith(OS_DRAGONFLY): 20 return constantDict[OS_BSD] if OS_BSD in constantDict else constantDict[OS_DEFAULT] 21 22# You might want to change these 23DEFAULT_PORT = 8999 24OSD_DURATION = 3.0 25OSD_WARNING_MESSAGE_DURATION = 5.0 26NO_ALERT_OSD_WARNING_DURATION = 13.0 27MPC_OSD_POSITION = 1 # Right corner, 1 for left 28MPLAYER_OSD_LEVEL = 1 29UI_TIME_FORMAT = "[%X] " 30CONFIG_NAMES = [".syncplay", "syncplay.ini"] # Syncplay searches first to last 31DEFAULT_CONFIG_NAME = "syncplay.ini" 32RECENT_CLIENT_THRESHOLD = "1.6.4" # This and higher considered 'recent' clients (no warnings) 33WARN_OLD_CLIENTS = True # Use MOTD to inform old clients to upgrade 34LIST_RELATIVE_CONFIGS = True # Print list of relative configs loaded 35SHOW_CONTACT_INFO = True # Displays dev contact details below list in GUI 36SHOW_TOOLTIPS = True 37WARN_ABOUT_MISSING_STRINGS = False # (If debug mode is enabled) 38FALLBACK_INITIAL_LANGUAGE = "en" 39FALLBACK_PUBLIC_SYNCPLAY_SERVERS = [ 40 ['syncplay.pl:8995 (France)', 'syncplay.pl:8995'], 41 ['syncplay.pl:8996 (France)', 'syncplay.pl:8996'], 42 ['syncplay.pl:8997 (France)', 'syncplay.pl:8997'], 43 ['syncplay.pl:8998 (France)', 'syncplay.pl:8998'], 44 ['syncplay.pl:8999 (France)', 'syncplay.pl:8999']] 45PLAYLIST_LOAD_NEXT_FILE_MINIMUM_LENGTH = 10 # Seconds 46PLAYLIST_LOAD_NEXT_FILE_TIME_FROM_END_THRESHOLD = 5 # Seconds (only triggered if file is paused, e.g. due to EOF) 47EXECUTABLE_COMBOBOX_MINIMUM_LENGTH = 30 # Minimum number of characters that the combobox will make visible 48 49# Overriden by config 50SHOW_OSD = True # Sends Syncplay messages to media player OSD 51SHOW_OSD_WARNINGS = True # Show warnings if playing different file, alone in room 52SHOW_SLOWDOWN_OSD = True # Show notifications of slowing down / reverting on time difference 53SHOW_SAME_ROOM_OSD = True # Show OSD notifications for events relating to room user is in 54SHOW_NONCONTROLLER_OSD = False # Show OSD notifications for non-controllers in controlled rooms 55SHOW_DIFFERENT_ROOM_OSD = False # Show OSD notifications for events relating to room user is not in 56SHOW_DURATION_NOTIFICATION = True 57DEBUG_MODE = False 58 59# Changing these might be ok 60AUTOMATIC_UPDATE_CHECK_FREQUENCY = 7 * 86400 # Days converted into seconds 61DEFAULT_REWIND_THRESHOLD = 4 62MINIMUM_REWIND_THRESHOLD = 3 63DEFAULT_FASTFORWARD_THRESHOLD = 5 64MINIMUM_FASTFORWARD_THRESHOLD = 4 65FASTFORWARD_EXTRA_TIME = 0.25 66FASTFORWARD_RESET_THRESHOLD = 3.0 67FASTFORWARD_BEHIND_THRESHOLD = 1.75 68SEEK_THRESHOLD = 1 69SLOWDOWN_RATE = 0.95 70DEFAULT_SLOWDOWN_KICKIN_THRESHOLD = 1.5 71MINIMUM_SLOWDOWN_THRESHOLD = 1.3 72SLOWDOWN_RESET_THRESHOLD = 0.1 73DIFFERENT_DURATION_THRESHOLD = 2.5 74PROTOCOL_TIMEOUT = 12.5 75RECONNECT_RETRIES = 999 76SERVER_STATE_INTERVAL = 1 77SERVER_STATS_SNAPSHOT_INTERVAL = 3600 78WARNING_OSD_MESSAGES_LOOP_INTERVAL = 1 79AUTOPLAY_DELAY = 3.0 80DO_NOT_RESET_POSITION_THRESHOLD = 1.0 81SYNC_ON_PAUSE = True # Client seek to global position - subtitles may disappear on some media players 82PLAYLIST_MAX_CHARACTERS = 10000 83PLAYLIST_MAX_ITEMS = 250 84MAXIMUM_TAB_WIDTH = 350 85TAB_PADDING = 30 86MONOSPACE_FONT = getValueForOS({ 87 OS_DEFAULT: "Monospace", 88 OS_MACOS: "Menlo", 89 OS_WINDOWS: "Consolas"}) 90DEFAULT_CHAT_FONT_SIZE = 24 91DEFAULT_CHAT_INPUT_FONT_COLOR = "#FFFF00" 92DEFAULT_CHAT_OUTPUT_FONT_COLOR = "#FFFF00" 93DEFAULT_CHAT_FONT_WEIGHT = 1 94 95# Max numbers are used by server (and client pre-connection). Once connected client gets values from server featureList (or uses 'fallback' versions for old servers) 96MAX_CHAT_MESSAGE_LENGTH = 150 # Number of displayed characters 97MAX_USERNAME_LENGTH = 150 # Number of displayed characters 98MAX_ROOM_NAME_LENGTH = 35 # Number of displayed characters 99MAX_FILENAME_LENGTH = 250 # Number of displayed characters 100FALLBACK_MAX_CHAT_MESSAGE_LENGTH = 50 # Number of displayed characters 101FALLBACK_MAX_USERNAME_LENGTH = 16 # Number of displayed characters 102FALLBACK_MAX_ROOM_NAME_LENGTH = 35 # Number of displayed characters 103FALLBACK_MAX_FILENAME_LENGTH = 250 # Number of displayed characters 104 105# Options for the File Switch feature: 106FOLDER_SEARCH_FIRST_FILE_TIMEOUT = 25.0 # Secs - How long to wait to find the first file in folder search (to take account of HDD spin up) 107FOLDER_SEARCH_TIMEOUT = 20.0 # Secs - How long to wait until searches in folder to update cache are aborted (after first file is found) 108FOLDER_SEARCH_DOUBLE_CHECK_INTERVAL = 30.0 # Secs - Frequency of updating cache 109 110# Usually there's no need to adjust these 111LAST_PAUSED_DIFF_THRESHOLD = 2 112FILENAME_STRIP_REGEX = "[-~_\.\[\](): ]" 113CONTROL_PASSWORD_STRIP_REGEX = "[^a-zA-Z0-9\-]" 114ROOM_NAME_STRIP_REGEX = "^(\+)(?P<roomnamebase>.*)(:)(\w{12})$" 115COMMANDS_UNDO = ["u", "undo", "revert"] 116COMMANDS_CHAT = ["ch", "chat"] 117COMMANDS_LIST = ["l", "list", "users"] 118COMMANDS_PAUSE = ["p", "play", "pause"] 119COMMANDS_ROOM = ["r", "room"] 120COMMANDS_HELP = ['help', 'h', '?', '/?', r'\?'] 121COMMANDS_CREATE = ['c', 'create'] 122COMMANDS_AUTH = ['a', 'auth'] 123COMMANDS_TOGGLE = ['t', 'toggle'] 124MPC_MIN_VER = "1.6.4" 125MPC_BE_MIN_VER = "1.5.2.3123" 126VLC_MIN_VERSION = "2.2.1" 127VLC_INTERFACE_VERSION = "0.3.5" 128VLC_LATENCY_ERROR_THRESHOLD = 2.0 129MPV_UNRESPONSIVE_THRESHOLD = 60.0 130CONTROLLED_ROOMS_MIN_VERSION = "1.3.0" 131USER_READY_MIN_VERSION = "1.3.0" 132SHARED_PLAYLIST_MIN_VERSION = "1.4.0" 133CHAT_MIN_VERSION = "1.5.0" 134FEATURE_LIST_MIN_VERSION = "1.5.0" 135MPC_PATHS = [ 136 r"c:\program files (x86)\mpc-hc\mpc-hc.exe", 137 r"c:\program files\mpc-hc\mpc-hc.exe", 138 r"c:\program files\mpc-hc\mpc-hc64.exe", 139 r"c:\program files\media player classic - home cinema\mpc-hc.exe", 140 r"c:\program files\media player classic - home cinema\mpc-hc64.exe", 141 r"c:\program files (x86)\media player classic - home cinema\mpc-hc.exe", 142 r"c:\program files (x86)\k-lite codec pack\media player classic\mpc-hc.exe", 143 r"c:\program files\k-lite codec pack\media Player classic\mpc-hc.exe", 144 r"c:\program files (x86)\combined community codec pack\mpc\mpc-hc.exe", 145 r"c:\program files\combined community codec pack\mpc\mpc-hc.exe", 146 r"c:\program files\mpc homecinema (x64)\mpc-hc64.exe", 147] 148MPC_BE_PATHS = [ 149 r"c:\Program Files\MPC-BE x64\mpc-be64.exe", 150 r"c:\Program Files\MPC-BE x64\mpc-be.exe", 151 r"c:\Program Files\MPC-BE\mpc-be64.exe", 152 r"c:\Program Files\MPC-BE\mpc-be.exe" 153] 154MPLAYER_PATHS = ["mplayer2", "mplayer"] 155MPV_PATHS = ["mpv", "/opt/mpv/mpv", r"c:\program files\mpv\mpv.exe", r"c:\program files\mpv-player\mpv.exe", 156 r"c:\program Files (x86)\mpv\mpv.exe", r"c:\program Files (x86)\mpv-player\mpv.exe", 157 "/Applications/mpv.app/Contents/MacOS/mpv"] 158VLC_PATHS = [ 159 r"c:\program files (x86)\videolan\vlc\vlc.exe", 160 r"c:\program files\videolan\vlc\vlc.exe", 161 "/usr/bin/vlc", 162 "/usr/bin/vlc-wrapper", 163 "/Applications/VLC.app/Contents/MacOS/VLC", 164 "/usr/local/bin/vlc", 165 "/usr/local/bin/vlc-wrapper", 166 "/snap/bin/vlc" 167] 168 169VLC_ICONPATH = "vlc.png" 170MPLAYER_ICONPATH = "mplayer.png" 171MPV_ICONPATH = "mpv.png" 172MPC_ICONPATH = "mpc-hc.png" 173MPC64_ICONPATH = "mpc-hc64.png" 174MPC_BE_ICONPATH = "mpc-be.png" 175 176MPV_ERROR_MESSAGES_TO_REPEAT = ['[ytdl_hook] Your version of youtube-dl is too old', '[ytdl_hook] youtube-dl failed', 'Failed to recognize file format.', '[syncplayintf] Lua error'] 177 178# Changing these is usually not something you're looking for 179PLAYER_ASK_DELAY = 0.1 180PING_MOVING_AVERAGE_WEIGHT = 0.85 181MPC_OPEN_MAX_WAIT_TIME = 10 182MPC_LOCK_WAIT_TIME = 0.2 183MPC_RETRY_WAIT_TIME = 0.01 184MPC_MAX_RETRIES = 30 185MPC_PAUSE_TOGGLE_DELAY = 0.05 186MPV_NEWFILE_IGNORE_TIME = 1 187MPV_SENDMESSAGE_COOLDOWN_TIME = 0.05 188MPV_MAX_NEWFILE_COOLDOWN_TIME = 3 189STREAM_ADDITIONAL_IGNORE_TIME = 10 190MPV_LOCK_WAIT_TIME = 0.05 191VLC_OPEN_MAX_WAIT_TIME = 20 192VLC_MIN_PORT = 10000 193VLC_MAX_PORT = 55000 194 195# These are not changes you're looking for 196STYLE_TABLIST = "QListWidget::item { border-style: solid; border-width: 1px; border-radius: 2px; } QListWidget::item:selected { color: black; background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(242, 248, 255, 255), stop:1 rgba(208, 229, 255, 255)); border-color: #84ACDD; } QListWidget::item:!selected { border-color: transparent; } QListWidget::item:!selected:hover { color: black; background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(248, 248, 248, 255), stop:1 rgba(229, 229, 229, 255)); border-color: silver; }" 197STYLE_SUBCHECKBOX = "QCheckBox, QLabel, QRadioButton {{ margin-left: 6px; padding-left: 21px; background:url('{}') left no-repeat }}" # Graphic path 198STYLE_SUBLABEL = "QCheckBox, QLabel {{ margin-left: 6px; padding-left: 16px; background:url('{}') left no-repeat }}" # Graphic path 199STYLE_ERRORLABEL = "QLabel { color : black; border-style: outset; border-width: 2px; border-radius: 7px; border-color: red; padding: 2px; background: #FFAAAA; }" 200STYLE_SUCCESSLABEL = "QLabel { color : black; border-style: outset; border-width: 2px; border-radius: 7px; border-color: green; padding: 2px; background: #AAFFAA; }" 201STYLE_READY_PUSHBUTTON = getValueForOS({ 202 OS_DEFAULT: "QPushButton { text-align: left; padding: 10px 5px 10px 5px;}", 203 OS_MACOS: "QPushButton { text-align: left; padding: 10px 5px 10px 15px; margin: 0px 3px 0px 2px}"}) 204STYLE_AUTO_PLAY_PUSHBUTTON = getValueForOS({ 205 OS_DEFAULT: "QPushButton { text-align: left; padding: 5px 5px 5px 5px; }", 206 OS_MACOS: "QPushButton { text-align: left; padding: 10px 5px 10px 15px; margin: 0px 0px 0px -4px}"}) 207STYLE_NOTIFICATIONBOX = "Username { color: #367AA9; font-weight:bold; }" 208STYLE_CONTACT_INFO = "<span style=\"color: grey\"><strong><small>{}</span><br /><br />" # Contact info message 209STYLE_USER_MESSAGE = "<span style=\"{}\"><{}></span> {}" 210STYLE_USERNAME = "color: #367AA9; font-weight:bold;" 211STYLE_ERRORNOTIFICATION = "color: red;" 212STYLE_DIFFERENTITEM_COLOR = 'red' 213STYLE_NOFILEITEM_COLOR = 'blue' 214STYLE_NOTCONTROLLER_COLOR = 'grey' 215STYLE_UNTRUSTEDITEM_COLOR = 'purple' 216 217STYLE_DARK_LINKS_COLOR = "a {color: #1A78D5; }" 218STYLE_DARK_ABOUT_LINK_COLOR = "color: #1A78D5;" 219STYLE_DARK_ERRORNOTIFICATION = "color: #E94F64;" 220STYLE_DARK_DIFFERENTITEM_COLOR = '#E94F64' 221STYLE_DARK_NOFILEITEM_COLOR = '#1A78D5' 222STYLE_DARK_NOTCONTROLLER_COLOR = 'grey' 223STYLE_DARK_UNTRUSTEDITEM_COLOR = '#882fbc' 224 225TLS_CERT_ROTATION_MAX_RETRIES = 10 226 227USERLIST_GUI_USERNAME_OFFSET = getValueForOS({ 228 OS_DEFAULT: 21, 229 OS_MACOS: 26}) # Pixels 230USERLIST_GUI_USERNAME_COLUMN = 0 231USERLIST_GUI_FILENAME_COLUMN = 3 232 233MPLAYER_SLAVE_ARGS = ['-slave', '--hr-seek=always', '-nomsgcolor', '-msglevel', 'all=1:global=4:cplayer=4', '-af-add', 'scaletempo'] 234MPV_ARGS = ['--force-window', '--idle', '--hr-seek=always', '--keep-open'] 235MPV_SLAVE_ARGS = ['--msg-level=all=error,cplayer=info,term-msg=info', '--input-terminal=no', '--input-file=/dev/stdin'] 236MPV_SLAVE_ARGS_NEW = ['--term-playing-msg=<SyncplayUpdateFile>\nANS_filename=${filename}\nANS_length=${=duration:${=length:0}}\nANS_path=${path}\n</SyncplayUpdateFile>', '--terminal=yes'] 237MPV_NEW_VERSION = False 238MPV_OSC_VISIBILITY_CHANGE_VERSION = False 239MPV_INPUT_PROMPT_START_CHARACTER = "〉" 240MPV_INPUT_PROMPT_END_CHARACTER = " 〈" 241MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER = "\" 242MPV_SYNCPLAYINTF_OPTIONS_TO_SEND = ["chatInputEnabled", "chatInputFontFamily", "chatInputRelativeFontSize", "chatInputFontWeight", "chatInputFontUnderline", 243 "chatInputFontColor", "chatInputPosition", "chatOutputFontFamily", "chatOutputRelativeFontSize", 244 "chatOutputFontWeight", "chatOutputFontUnderline", "chatOutputMode", "chatMaxLines", 245 "chatTopMargin", "chatLeftMargin", "chatBottomMargin", "chatDirectInput", 246 "notificationTimeout", "alertTimeout", "chatTimeout", "chatOutputEnabled"] 247 248MPV_SYNCPLAYINTF_CONSTANTS_TO_SEND = [ 249 "MaxChatMessageLength={}".format(MAX_CHAT_MESSAGE_LENGTH), 250 "inputPromptStartCharacter={}".format(MPV_INPUT_PROMPT_START_CHARACTER), 251 "inputPromptEndCharacter={}".format(MPV_INPUT_PROMPT_END_CHARACTER), 252 "backslashSubstituteCharacter={}".format(MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER)] 253# Note: Constants updated in client.py->checkForFeatureSupport 254MPV_SYNCPLAYINTF_LANGUAGE_TO_SEND = ["mpv-key-tab-hint", "mpv-key-hint", "alphakey-mode-warning-first-line", "alphakey-mode-warning-second-line"] 255VLC_SLAVE_ARGS = ['--extraintf=luaintf', '--lua-intf=syncplay', '--no-quiet', '--no-input-fast-seek', 256 '--play-and-pause', '--start-time=0'] 257VLC_SLAVE_EXTRA_ARGS = getValueForOS({ 258 OS_DEFAULT: ['--no-one-instance', '--no-one-instance-when-started-from-file'], 259 OS_MACOS: ['--verbose=2', '--no-file-logging']}) 260MPV_SUPERSEDE_IF_DUPLICATE_COMMANDS = ["no-osd set time-pos ", "loadfile "] 261MPV_REMOVE_BOTH_IF_DUPLICATE_COMMANDS = ["cycle pause"] 262MPLAYER_ANSWER_REGEX = "^ANS_([a-zA-Z_-]+)=(.+)$|^(Exiting)\.\.\. \((.+)\)$" 263VLC_ANSWER_REGEX = r"(?:^(?P<command>[a-zA-Z_]+)(?:\: )?(?P<argument>.*))" 264UI_COMMAND_REGEX = r"^(?P<command>[^\ ]+)(?:\ (?P<parameter>.+))?" 265UI_OFFSET_REGEX = r"^(?:o|offset)\ ?(?P<sign>[/+-])?(?P<time>\d{1,9}(?:[^\d\.](?:\d{1,9})){0,2}(?:\.(?:\d{1,3}))?)$" 266UI_SEEK_REGEX = r"^(?:s|seek)?\ ?(?P<sign>[+-])?(?P<time>\d{1,4}(?:[^\d\.](?:\d{1,6})){0,2}(?:\.(?:\d{1,3}))?)$" 267PARSE_TIME_REGEX = r'(:?(?:(?P<hours>\d+?)[^\d\.])?(?:(?P<minutes>\d+?))?[^\d\.])?(?P<seconds>\d+?)(?:\.(?P<miliseconds>\d+?))?$' 268MESSAGE_WITH_USERNAME_REGEX = "^(<(?P<username>[^<>]+)>)(?P<message>.*)" 269SERVER_MAX_TEMPLATE_LENGTH = 10000 270PRIVACY_SENDRAW_MODE = "SendRaw" 271PRIVACY_SENDHASHED_MODE = "SendHashed" 272PRIVACY_DONTSEND_MODE = "DoNotSend" 273UNPAUSE_IFALREADYREADY_MODE = "IfAlreadyReady" 274UNPAUSE_IFOTHERSREADY_MODE = "IfOthersReady" 275UNPAUSE_IFMINUSERSREADY_MODE = "IfMinUsersReady" 276UNPAUSE_ALWAYS_MODE = "Always" 277INPUT_POSITION_TOP = "Top" 278INPUT_POSITION_MIDDLE = "Middle" 279INPUT_POSITION_BOTTOM = "Bottom" 280 281VLC_EOF_DURATION_THRESHOLD = 2.0 282 283PRIVACY_HIDDENFILENAME = "**Hidden filename**" 284INVERTED_STATE_MARKER = "*" 285ERROR_MESSAGE_MARKER = "*" 286LOAD_SAVE_MANUALLY_MARKER = "!" 287CONFIG_NAME_MARKER = ":" 288CONFIG_VALUE_MARKER = "=" 289USERITEM_CONTROLLER_ROLE = 0 290USERITEM_READY_ROLE = 1 291FILEITEM_SWITCH_ROLE = 1 292FILEITEM_SWITCH_NO_SWITCH = 0 293FILEITEM_SWITCH_FILE_SWITCH = 1 294FILEITEM_SWITCH_STREAM_SWITCH = 2 295PLAYLISTITEM_CURRENTLYPLAYING_ROLE = 3 296 297MESSAGE_NEUTRAL = "neutral" 298MESSAGE_BADNEWS = "bad" 299MESSAGE_GOODNEWS = "good" 300 301OSD_NOTIFICATION = "notification" # Also known as PrimaryOSD 302OSD_ALERT = "alert" # Also known as SecondaryOSD 303OSD_CHAT = "chat" 304 305CHATROOM_MODE = "Chatroom" 306SCROLLING_MODE = "Scrolling" 307 308SYNCPLAY_UPDATE_URL = "https://syncplay.pl/checkforupdate?{}" # Params 309SYNCPLAY_DOWNLOAD_URL = "https://syncplay.pl/download/" 310SYNCPLAY_PUBLIC_SERVER_LIST_URL = "https://syncplay.pl/listpublicservers?{}" # Params 311 312DEFAULT_TRUSTED_DOMAINS = ["youtube.com", "youtu.be"] 313TRUSTABLE_WEB_PROTOCOLS = ["http://www.", "https://www.", "http://", "https://"] 314 315PRIVATE_FILE_FIELDS = ["path"] 316