diff --git a/buildPy2exe.py b/buildPy2exe.py index 24175c1..a4e7da3 100644 --- a/buildPy2exe.py +++ b/buildPy2exe.py @@ -654,7 +654,7 @@ guiIcons = ['resources/accept.png', 'resources/arrow_undo.png', 'resources/clock 'resources/user_key.png', 'resources/lock.png', 'resources/key_go.png', 'resources/page_white_key.png', 'resources/tick.png', 'resources/lock_open.png', 'resources/empty_checkbox.png', 'resources/tick_checkbox.png', 'resources/world_explore.png', 'resources/application_get.png', 'resources/cog.png', - 'resources/film_go.png', 'resources/world_go.png', 'resources/report_magnify.png' + 'resources/film_go.png', 'resources/world_go.png', 'resources/arrow_refresh.png' ] resources = ["resources/icon.ico", "resources/syncplay.png"] resources.extend(guiIcons) diff --git a/resources/arrow_refresh.png b/resources/arrow_refresh.png new file mode 100644 index 0000000..0de2656 Binary files /dev/null and b/resources/arrow_refresh.png differ diff --git a/resources/report_magnify.png b/resources/report_magnify.png deleted file mode 100644 index aeaa889..0000000 Binary files a/resources/report_magnify.png and /dev/null differ diff --git a/syncplay/client.py b/syncplay/client.py index 7ac9b56..41c6acd 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -3,6 +3,7 @@ import os.path import time import re import sys +import ast from twisted.internet.protocol import ClientFactory from twisted.internet import reactor, task from functools import wraps @@ -676,9 +677,14 @@ class SyncplayClient(object): response = f.read() response = response.replace("

","").replace("

","").replace("
","").replace("“","\"").replace("”","\"") # Fix Wordpress response = json.loads(response) - return response["version-status"], response["version-message"] if response.has_key("version-message") else None, response["version-url"] if response.has_key("version-url") else None + publicServers = None + if response["public-servers"]: + publicServers = response["public-servers"].replace("”","'").replace(":’","'").replace("’","'").replace("′","'").replace("\n","").replace("\r","") + print publicServers + publicServers = ast.literal_eval(publicServers) + return response["version-status"], response["version-message"] if response.has_key("version-message") else None, response["version-url"] if response.has_key("version-url") else None, publicServers except: - return "failed", getMessage("update-check-failed-notification").format(syncplay.version), constants.SYNCPLAY_DOWNLOAD_URL + return "failed", getMessage("update-check-failed-notification").format(syncplay.version), constants.SYNCPLAY_DOWNLOAD_URL, None class _WarningManager(object): def __init__(self, player, userlist, ui, client): diff --git a/syncplay/constants.py b/syncplay/constants.py index 52d8977..e0abbe5 100644 --- a/syncplay/constants.py +++ b/syncplay/constants.py @@ -16,7 +16,7 @@ SHOW_CONTACT_INFO = True # Displays dev contact details below list in GUI SHOW_TOOLTIPS = True WARN_ABOUT_MISSING_STRINGS = False # (If debug mode is enabled) FALLBACK_INITIAL_LANGUAGE = "en" -PUBLIC_SYNCPLAY_SERVERS = ["syncplay.pl:8995","syncplay.pl:8996","syncplay.pl:8997","syncplay.pl:8998","syncplay.pl:8999"] +FALLBACK_PUBLIC_SYNCPLAY_SERVERS = ["syncplay.pl:8995","syncplay.pl:8996","syncplay.pl:8997","syncplay.pl:8998","syncplay.pl:8999"] #Overriden by config SHOW_OSD = True # Sends Syncplay messages to media player OSD diff --git a/syncplay/messages.py b/syncplay/messages.py index ef0efd3..14f9afe 100755 --- a/syncplay/messages.py +++ b/syncplay/messages.py @@ -173,7 +173,7 @@ en = { "media-path-label" : "Path to media file:", "player-arguments-label" : "Player arguments (if any):", "browse-label" : "Browse", - "list-servers-label" : u"Find public server", + "update-server-list-label" : u"Update list", "more-title" : "Show more settings", "never-rewind-value" : "Never", @@ -541,7 +541,7 @@ ru = { "media-path-label" : u"Путь к видеофайлу:", "player-arguments-label" : u"Аргументы для запуска проигрывателя:", "browse-label" : u"Выбрать", - "list-servers-label" : u"Find public server", # TODO: Translate into Russian + "update-server-list-label" : u"Update list", # TODO: Translate into Russian "more-title" : u"Больше настроек", "never-rewind-value" : u"Никогда", @@ -909,7 +909,7 @@ de = { "media-path-label" : u"Pfad zur Datei:", "player-arguments-label" : u"Player arguments:", # TODO: Translate into German "browse-label" : u"Durchsuchen", - "list-servers-label" : u"Find public server", # TODO: Translate into German + "update-server-list-label" : u"Update list", # TODO: Translate into German "more-title" : u"Mehr Einstellungen zeigen", "never-rewind-value" : u"Niemals", diff --git a/syncplay/ui/GuiConfiguration.py b/syncplay/ui/GuiConfiguration.py index 0895434..c4586c6 100644 --- a/syncplay/ui/GuiConfiguration.py +++ b/syncplay/ui/GuiConfiguration.py @@ -202,6 +202,13 @@ class ConfigDialog(QtGui.QDialog): else: self.config["lastCheckedForUpdates"] = str(self.lastCheckedForUpdates) + def loadSavedPublicServerList(self): + settings = QSettings("Syncplay", "Interface") + settings.beginGroup("PublicServerList") + self.publicServers = settings.value("publicServers", constants.FALLBACK_PUBLIC_SYNCPLAY_SERVERS) + if self.publicServers is None: + self.publicServers = constants.FALLBACK_PUBLIC_SYNCPLAY_SERVERS + def loadMediaBrowseSettings(self): settings = QSettings("Syncplay", "MediaBrowseDialog") settings.beginGroup("MediaBrowseDialog") @@ -231,26 +238,24 @@ class ConfigDialog(QtGui.QDialog): settings.endGroup() - def findPublicServer(self): + def updateServerList(self): try: servers = utils.getListOfPublicServers() except IOError as e: self.showErrorMessage(unicode(e)) return - dialog = QtGui.QInputDialog() - dialog.setWindowTitle(getMessage("list-servers-label")) - dialog.setLabelText(getMessage("public-server-msgbox-label")) - serverTitles = [] - serverDict = {} - for server in servers: - serverTitle = server[0] - serverAddress = server[1] - serverTitles.append(serverTitle) - serverDict[serverTitle]=serverAddress - dialog.setComboBoxItems(serverTitles) - ok = dialog.exec_() - if ok: - self.hostCombobox.setEditText(serverDict[dialog.textValue()]) + currentServer = self.hostCombobox.currentText() + self.hostCombobox.clear() + if servers: + i = 0 + for server in servers: + self.hostCombobox.addItem(server[1]) + self.hostCombobox.setItemData(i, server[0], Qt.ToolTipRole) + i += 1 + settings = QSettings("Syncplay", "Interface") + settings.beginGroup("PublicServerList") + settings.setValue("publicServers", servers) + self.hostCombobox.setEditText(currentServer) def showErrorMessage(self, errorMessage): QtGui.QMessageBox.warning(self, "Syncplay", errorMessage) @@ -416,14 +421,20 @@ class ConfigDialog(QtGui.QDialog): self.mediaSearchDirectories = self.config["mediaSearchDirectories"] self.connectionSettingsGroup = QtGui.QGroupBox(getMessage("connection-group-title")) + self.loadSavedPublicServerList() self.hostCombobox = QtGui.QComboBox(self) - self.hostCombobox.addItems(constants.PUBLIC_SYNCPLAY_SERVERS) + if self.publicServers: + i = 0 + for publicServer in self.publicServers: + self.hostCombobox.addItem(publicServer[1]) + self.hostCombobox.setItemData(i, publicServer[0], Qt.ToolTipRole) + i += 1 self.hostCombobox.setEditable(True) self.hostCombobox.setEditText(host) self.hostCombobox.setFixedWidth(165) self.hostLabel = QLabel(getMessage("host-label"), self) - self.findServerButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'report_magnify.png'), getMessage("list-servers-label")) - self.findServerButton.clicked.connect(self.findPublicServer) + self.findServerButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'arrow_refresh.png'), getMessage("update-server-list-label")) + self.findServerButton.clicked.connect(self.updateServerList) self.usernameTextbox = QLineEdit(self) self.usernameTextbox.setObjectName("name") @@ -881,6 +892,8 @@ class ConfigDialog(QtGui.QDialog): def clearGUIData(self, leaveMore=False): settings = QSettings("Syncplay", "PlayerList") settings.clear() + settings = QSettings("Syncplay", "PublicServerList") + settings.clear() settings = QSettings("Syncplay", "MediaBrowseDialog") settings.clear() settings = QSettings("Syncplay", "MainWindow") @@ -902,6 +915,7 @@ class ConfigDialog(QtGui.QDialog): self.datacleared = False self.config['resetConfig'] = False self.subitems = {} + self.publicServers = None if self.config['clearGUIData'] == True: self.config['clearGUIData'] = False diff --git a/syncplay/ui/gui.py b/syncplay/ui/gui.py index cc001fd..23f43da 100644 --- a/syncplay/ui/gui.py +++ b/syncplay/ui/gui.py @@ -841,7 +841,8 @@ class MainWindow(QtGui.QMainWindow): @needsClient def checkForUpdates(self, userInitiated=False): self.lastCheckedForUpdates = datetime.utcnow() - updateStatus, updateMessage, updateURL = self._syncplayClient.checkForUpdate(userInitiated) + updateStatus, updateMessage, updateURL, self.publicServerList = self._syncplayClient.checkForUpdate(userInitiated) + if updateMessage is None: if updateStatus == "uptodate": updateMessage = getMessage("syncplay-uptodate-notification") @@ -898,6 +899,10 @@ class MainWindow(QtGui.QMainWindow): settings.beginGroup("Update") settings.setValue("lastChecked", self.lastCheckedForUpdates) settings.endGroup() + settings.beginGroup("PublicServerList") + if self.publicServerList: + settings.setValue("publicServers", self.publicServerList) + settings.endGroup() def loadSettings(self): settings = QSettings("Syncplay", "MainWindow") @@ -920,9 +925,14 @@ class MainWindow(QtGui.QMainWindow): settings = QSettings("Syncplay", "Interface") settings.beginGroup("Update") self.lastCheckedForUpdates = settings.value("lastChecked", None) + settings.endGroup() + settings.beginGroup("PublicServerList") + self.publicServerList = settings.value("publicServers", None) def __init__(self): super(MainWindow, self).__init__() + self.publicServerList = [] + self.lastCheckedForUpdates = None self._syncplayClient = None self.folderSearchEnabled = True self.QtGui = QtGui