Add automatic update system

This commit is contained in:
Et0h 2015-01-03 13:58:18 +00:00
parent 79e28d03f6
commit f3c3028dfd
9 changed files with 192 additions and 23 deletions

View File

@ -68,6 +68,7 @@ NSIS_SCRIPT_TEMPLATE = r"""
LangString ^StartMenu $${LANG_ENGLISH} "Start Menu" LangString ^StartMenu $${LANG_ENGLISH} "Start Menu"
LangString ^Desktop $${LANG_ENGLISH} "Desktop" LangString ^Desktop $${LANG_ENGLISH} "Desktop"
LangString ^QuickLaunchBar $${LANG_ENGLISH} "Quick Launch Bar" LangString ^QuickLaunchBar $${LANG_ENGLISH} "Quick Launch Bar"
LangString ^AutomaticUpdates $${LANG_ENGLISH} "Check for updates automatically"
LangString ^UninstConfig $${LANG_ENGLISH} "Delete configuration file." LangString ^UninstConfig $${LANG_ENGLISH} "Delete configuration file."
LangString ^SyncplayLanguage $${LANG_POLISH} "pl" LangString ^SyncplayLanguage $${LANG_POLISH} "pl"
@ -88,6 +89,7 @@ NSIS_SCRIPT_TEMPLATE = r"""
LangString ^StartMenu $${LANG_RUSSIAN} "в меню Пуск" LangString ^StartMenu $${LANG_RUSSIAN} "в меню Пуск"
LangString ^Desktop $${LANG_RUSSIAN} "на рабочем столе" LangString ^Desktop $${LANG_RUSSIAN} "на рабочем столе"
LangString ^QuickLaunchBar $${LANG_RUSSIAN} "в меню быстрого запуска" LangString ^QuickLaunchBar $${LANG_RUSSIAN} "в меню быстрого запуска"
LangString ^AutomaticUpdates $${LANG_RUSSIAN} "Проверять обновления автоматически"; TODO: Confirm Russian translation ("Check for updates automatically")
LangString ^UninstConfig $${LANG_RUSSIAN} "Удалить файл настроек." LangString ^UninstConfig $${LANG_RUSSIAN} "Удалить файл настроек."
LangString ^SyncplayLanguage $${LANG_GERMAN} "de" LangString ^SyncplayLanguage $${LANG_GERMAN} "de"
@ -98,6 +100,7 @@ NSIS_SCRIPT_TEMPLATE = r"""
LangString ^StartMenu $${LANG_GERMAN} "Startmenü" LangString ^StartMenu $${LANG_GERMAN} "Startmenü"
LangString ^Desktop $${LANG_GERMAN} "Desktop" LangString ^Desktop $${LANG_GERMAN} "Desktop"
LangString ^QuickLaunchBar $${LANG_GERMAN} "Schnellstartleiste" LangString ^QuickLaunchBar $${LANG_GERMAN} "Schnellstartleiste"
LangString ^AutomaticUpdates $${LANG_GERMAN} "Automatisch nach Updates suchen"; TODO: Confirm German translation ("Check for updates automatically")
LangString ^UninstConfig $${LANG_GERMAN} "Konfigurationsdatei löschen." LangString ^UninstConfig $${LANG_GERMAN} "Konfigurationsdatei löschen."
; Remove text to save space ; Remove text to save space
@ -117,11 +120,13 @@ NSIS_SCRIPT_TEMPLATE = r"""
Var Icon_Syncplay_Handle Var Icon_Syncplay_Handle
Var CheckBox_Associate Var CheckBox_Associate
Var CheckBox_VLC Var CheckBox_VLC
Var CheckBox_AutomaticUpdates
Var CheckBox_StartMenuShortcut Var CheckBox_StartMenuShortcut
Var CheckBox_DesktopShortcut Var CheckBox_DesktopShortcut
Var CheckBox_QuickLaunchShortcut Var CheckBox_QuickLaunchShortcut
Var CheckBox_Associate_State Var CheckBox_Associate_State
Var CheckBox_VLC_State Var CheckBox_VLC_State
Var CheckBox_AutomaticUpdates_State
Var CheckBox_StartMenuShortcut_State Var CheckBox_StartMenuShortcut_State
Var CheckBox_DesktopShortcut_State Var CheckBox_DesktopShortcut_State
Var CheckBox_QuickLaunchShortcut_State Var CheckBox_QuickLaunchShortcut_State
@ -237,10 +242,10 @@ NSIS_SCRIPT_TEMPLATE = r"""
$${NSD_CreateGroupBox} 1u 27u 264u 30u "$$(^DirSubText)" $${NSD_CreateGroupBox} 1u 27u 264u 30u "$$(^DirSubText)"
Pop $$GroupBox_DirSub Pop $$GroupBox_DirSub
$${NSD_CreateLabel} 0u 111u 265u 8u "$$(^SpaceRequired)$$SizeMB" $${NSD_CreateLabel} 0u 122u 132 8u "$$(^SpaceRequired)$$SizeMB"
Pop $$Label_Size Pop $$Label_Size
$${NSD_CreateLabel} 0u 122u 265u 8u "$$(^SpaceAvailable)$$AvailibleSpaceGiB.$$AvailibleSpaceGB" $${NSD_CreateLabel} 321u 122u 132 8u "$$(^SpaceAvailable)$$AvailibleSpaceGiB.$$AvailibleSpaceGB"
Pop $$Label_Space Pop $$Label_Space
$${NSD_CreateCheckBox} 8u 59u 187u 10u "$$(^Associate)" $${NSD_CreateCheckBox} 8u 59u 187u 10u "$$(^Associate)"
@ -253,16 +258,20 @@ NSIS_SCRIPT_TEMPLATE = r"""
$${NSD_CreateCheckBox} 8u 72u 250u 10u "$$(^VLC)" $${NSD_CreateCheckBox} 8u 72u 250u 10u "$$(^VLC)"
Pop $$CheckBox_VLC Pop $$CheckBox_VLC
$${NSD_CreateLabel} 8u 85u 187u 10u "$$(^Shortcut)" $${NSD_CreateCheckBox} 8u 85u 250u 10u "$$(^AutomaticUpdates)"
Pop $$CheckBox_AutomaticUpdates
$${NSD_Check} $$CheckBox_AutomaticUpdates
$${NSD_CreateLabel} 8u 98u 187u 10u "$$(^Shortcut)"
Pop $$Label_Shortcut Pop $$Label_Shortcut
$${NSD_CreateCheckbox} 8u 98u 60u 10u "$$(^StartMenu)" $${NSD_CreateCheckbox} 8u 111u 60u 10u "$$(^StartMenu)"
Pop $$CheckBox_StartMenuShortcut Pop $$CheckBox_StartMenuShortcut
$${NSD_CreateCheckbox} 78u 98u 70u 10u "$$(^Desktop)" $${NSD_CreateCheckbox} 78u 111u 70u 10u "$$(^Desktop)"
Pop $$CheckBox_DesktopShortcut Pop $$CheckBox_DesktopShortcut
$${NSD_CreateCheckbox} 158u 98u 130u 10u "$$(^QuickLaunchBar)" $${NSD_CreateCheckbox} 158u 111u 130u 10u "$$(^QuickLaunchBar)"
Pop $$CheckBox_QuickLaunchShortcut Pop $$CheckBox_QuickLaunchShortcut
$${If} $$CheckBox_Associate_State == $${BST_CHECKED} $${If} $$CheckBox_Associate_State == $${BST_CHECKED}
@ -287,6 +296,10 @@ NSIS_SCRIPT_TEMPLATE = r"""
$${NSD_Check} $$CheckBox_QuickLaunchShortcut $${NSD_Check} $$CheckBox_QuickLaunchShortcut
$${EndIf} $${EndIf}
$${If} $$CheckBox_AutomaticUpdates_State == $${BST_CHECKED}
$${NSD_Check} $$CheckBox_AutomaticUpdates
$${EndIf}
nsDialogs::Show nsDialogs::Show
$${NSD_FreeIcon} $$Icon_Syncplay_Handle $${NSD_FreeIcon} $$Icon_Syncplay_Handle
@ -297,6 +310,7 @@ NSIS_SCRIPT_TEMPLATE = r"""
$${NSD_GetText} $$Text_Directory $$INSTDIR $${NSD_GetText} $$Text_Directory $$INSTDIR
$${NSD_GetState} $$CheckBox_Associate $$CheckBox_Associate_State $${NSD_GetState} $$CheckBox_Associate $$CheckBox_Associate_State
$${NSD_GetState} $$CheckBox_VLC $$CheckBox_VLC_State $${NSD_GetState} $$CheckBox_VLC $$CheckBox_VLC_State
$${NSD_GetState} $$CheckBox_AutomaticUpdates $$CheckBox_AutomaticUpdates_State
$${NSD_GetState} $$CheckBox_StartMenuShortcut $$CheckBox_StartMenuShortcut_State $${NSD_GetState} $$CheckBox_StartMenuShortcut $$CheckBox_StartMenuShortcut_State
$${NSD_GetState} $$CheckBox_DesktopShortcut $$CheckBox_DesktopShortcut_State $${NSD_GetState} $$CheckBox_DesktopShortcut $$CheckBox_DesktopShortcut_State
$${NSD_GetState} $$CheckBox_QuickLaunchShortcut $$CheckBox_QuickLaunchShortcut_State $${NSD_GetState} $$CheckBox_QuickLaunchShortcut $$CheckBox_QuickLaunchShortcut_State
@ -444,6 +458,11 @@ NSIS_SCRIPT_TEMPLATE = r"""
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "NoRepair" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "NoRepair" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "EstimatedSize" "$$SizeHex" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "EstimatedSize" "$$SizeHex"
WriteINIStr $$APPDATA\syncplay.ini general language $$(^SyncplayLanguage) WriteINIStr $$APPDATA\syncplay.ini general language $$(^SyncplayLanguage)
$${If} $$CheckBox_AutomaticUpdates_State == $${BST_CHECKED}
WriteINIStr $$APPDATA\syncplay.ini general CheckForUpdatesAutomatically "True"
$${Else}
WriteINIStr $$APPDATA\syncplay.ini general CheckForUpdatesAutomatically "False"
$${EndIf}
FunctionEnd FunctionEnd
Function un.installConfirm Function un.installConfirm
@ -625,7 +644,7 @@ guiIcons = ['resources/accept.png', 'resources/arrow_undo.png', 'resources/clock
'resources/eye.png', 'resources/comments.png', 'resources/cog_delete.png', 'resources/chevrons_right.png', 'resources/eye.png', 'resources/comments.png', 'resources/cog_delete.png', 'resources/chevrons_right.png',
'resources/user_key.png', 'resources/lock.png', 'resources/key_go.png', 'resources/page_white_key.png', 'resources/user_key.png', 'resources/lock.png', 'resources/key_go.png', 'resources/page_white_key.png',
'resources/tick.png', 'resources/lock_open.png', 'resources/cross_checkbox.png', 'resources/tick_checkbox.png', 'resources/tick.png', 'resources/lock_open.png', 'resources/cross_checkbox.png', 'resources/tick_checkbox.png',
'resources/world_explore.png' 'resources/world_explore.png', 'resources/application_get.png'
] ]
resources = ["resources/icon.ico", "resources/syncplay.png"] resources = ["resources/icon.ico", "resources/syncplay.png"]
resources.extend(guiIcons) resources.extend(guiIcons)

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

View File

@ -1,3 +1,4 @@
version = '1.3.0' version = '1.3.0'
milestone = 'Chami' milestone = 'Chami'
release_number = '1'
projectURL = 'http://syncplay.pl/' projectURL = 'http://syncplay.pl/'

View File

@ -548,6 +548,21 @@ class SyncplayClient(object):
if self.controlpasswords.has_key(room): if self.controlpasswords.has_key(room):
return self.controlpasswords[room] return self.controlpasswords[room]
def checkForUpdate(self):
try:
import urllib, syncplay, sys, messages, json
params = urllib.urlencode({'version': syncplay.version, 'milestone': syncplay.milestone, 'release_number': syncplay.release_number,
'language': messages.messages["CURRENT"], 'platform': sys.platform})
print params
f = urllib.urlopen(constants.SYNCPLAY_UPDATE_URL.format(params))
response = f.read()
response = response.replace("<p>","").replace("</p>","").replace("<br />","").replace("&#8220;","\"").replace("&#8221;","\"") # 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
except:
return "failed", getMessage("update-check-failed-notification").format(syncplay.version), constants.SYNCPLAY_DOWNLOAD_URL
class _WarningManager(object): class _WarningManager(object):
def __init__(self, player, userlist, ui, client): def __init__(self, player, userlist, ui, client):
self._client = client self._client = client

View File

@ -29,6 +29,7 @@ SHOW_DURATION_NOTIFICATION = True
DEBUG_MODE = False DEBUG_MODE = False
#Changing these might be ok #Changing these might be ok
AUTOMATIC_UPDATE_CHECK_FREQUENCY = 7 * 86400 # Days converted into seconds
DEFAULT_REWIND_THRESHOLD = 4 DEFAULT_REWIND_THRESHOLD = 4
MINIMUM_REWIND_THRESHOLD = 3 MINIMUM_REWIND_THRESHOLD = 3
DEFAULT_FASTFORWARD_THRESHOLD = 5 DEFAULT_FASTFORWARD_THRESHOLD = 5
@ -157,3 +158,6 @@ CONFIG_NAME_MARKER = ":"
CONFIG_VALUE_MARKER = "=" CONFIG_VALUE_MARKER = "="
USERITEM_CONTROLLER_ROLE = 0 USERITEM_CONTROLLER_ROLE = 0
USERITEM_READY_ROLE = 1 USERITEM_READY_ROLE = 1
SYNCPLAY_UPDATE_URL = u"http://syncplay.pl/checkforupdate?{}" # Params
SYNCPLAY_DOWNLOAD_URL = "http://syncplay.pl/download/"

View File

@ -58,6 +58,10 @@ en = {
"controller-userlist-userflag" : "Controller", "controller-userlist-userflag" : "Controller",
"ready-userlist-userflag" : "Ready", "ready-userlist-userflag" : "Ready",
"update-check-failed-notification" : u"Could not automatically check whether Syncplay {} is up to date. Want to visit http://syncplay.pl/ to manually check for updates?", #Syncplay version
"syncplay-uptodate-notification" : u"Syncplay is up to date",
"syncplay-updateavailable-notification" : u"A new version of Syncplay is available. Do you want to download it?",
"mplayer-file-required-notification" : "Syncplay using mplayer requires you to provide file when starting", "mplayer-file-required-notification" : "Syncplay using mplayer requires you to provide file when starting",
"mplayer-file-required-notification/example" : "Usage example: syncplay [options] [url|path/]filename", "mplayer-file-required-notification/example" : "Usage example: syncplay [options] [url|path/]filename",
"mplayer2-required" : "Syncplay is incompatible with MPlayer 1.x, please use mplayer2 or mpv", "mplayer2-required" : "Syncplay is incompatible with MPlayer 1.x, please use mplayer2 or mpv",
@ -78,6 +82,7 @@ en = {
"gui-data-cleared-notification" : "Syncplay has cleared the path and window state data used by the GUI.", "gui-data-cleared-notification" : "Syncplay has cleared the path and window state data used by the GUI.",
"language-changed-msgbox-label" : "Language will be changed when you run Syncplay.", "language-changed-msgbox-label" : "Language will be changed when you run Syncplay.",
"promptforupdate-label" : u"Is it okay for Syncplay to automatically check for updates from time to time?",
"vlc-version-mismatch": "Warning: You are running VLC version {}, but Syncplay is designed to run on VLC {} and above.", # VLC version, VLC min version "vlc-version-mismatch": "Warning: You are running VLC version {}, but Syncplay is designed to run on VLC {} and above.", # VLC version, VLC min version
"vlc-interface-version-mismatch": "Warning: You are running version {} of the Syncplay interface module for VLC, but Syncplay is designed to run with version {} and above.", # VLC interface version, VLC interface min version "vlc-interface-version-mismatch": "Warning: You are running version {} of the Syncplay interface module for VLC, but Syncplay is designed to run with version {} and above.", # VLC interface version, VLC interface min version
@ -163,6 +168,7 @@ en = {
"privacy-dontsend-option" : "Don't send", "privacy-dontsend-option" : "Don't send",
"filename-privacy-label" : "Filename information:", "filename-privacy-label" : "Filename information:",
"filesize-privacy-label" : "File size information:", "filesize-privacy-label" : "File size information:",
"checkforupdatesautomatically-label" : "Check for updates automatically",
"slowondesync-label" : "Slow down on minor desync (not supported on MPC-HC)", "slowondesync-label" : "Slow down on minor desync (not supported on MPC-HC)",
"rewindondesync-label" : "Rewind on major desync (highly recommended)", "rewindondesync-label" : "Rewind on major desync (highly recommended)",
"fastforwardondesync-label" : "Fast-forward if lagging behind (recommended)", "fastforwardondesync-label" : "Fast-forward if lagging behind (recommended)",
@ -231,6 +237,7 @@ en = {
"help-menu-label" : "&Help", "help-menu-label" : "&Help",
"userguide-menu-label" : "Open user &guide", "userguide-menu-label" : "Open user &guide",
"update-menu-label" : "Check for &update",
"setoffset-msgbox-label" : "Set offset", "setoffset-msgbox-label" : "Set offset",
"offsetinfo-msgbox-label" : "Offset (see http://syncplay.pl/guide/ for usage instructions):", "offsetinfo-msgbox-label" : "Offset (see http://syncplay.pl/guide/ for usage instructions):",
@ -265,6 +272,7 @@ en = {
"privacy-sendraw-tooltip" : "Send this information without obfuscation. This is the default option with most functionality.", "privacy-sendraw-tooltip" : "Send this information without obfuscation. This is the default option with most functionality.",
"privacy-sendhashed-tooltip" : "Send a hashed version of the information, making it less visible to other clients.", "privacy-sendhashed-tooltip" : "Send a hashed version of the information, making it less visible to other clients.",
"privacy-dontsend-tooltip" : "Do not send this information to the server. This provides for maximum privacy.", "privacy-dontsend-tooltip" : "Do not send this information to the server. This provides for maximum privacy.",
"checkforupdatesautomatically-tooltip" : "Regularly check with the Syncplay website to see whether a new version of Syncplay is available.",
"slowondesync-tooltip" : "Reduce playback rate temporarily when needed to bring you back in sync with other viewers. Not supported on MPC-HC.", "slowondesync-tooltip" : "Reduce playback rate temporarily when needed to bring you back in sync with other viewers. Not supported on MPC-HC.",
"dontslowdownwithme-tooltip" : "Means others do not get slowed down or rewinded if your playback is lagging. Useful for room controllers.", "dontslowdownwithme-tooltip" : "Means others do not get slowed down or rewinded if your playback is lagging. Useful for room controllers.",
"pauseonleave-tooltip" : "Pause playback if you get disconnected or someone leaves from your room.", "pauseonleave-tooltip" : "Pause playback if you get disconnected or someone leaves from your room.",
@ -387,6 +395,10 @@ ru = {
"controller-userlist-userflag" : u"Controller", # TODO: Translate into Russian (this is to indicate a user is a controller in the ConsoleUI userlist) "controller-userlist-userflag" : u"Controller", # TODO: Translate into Russian (this is to indicate a user is a controller in the ConsoleUI userlist)
"ready-userlist-userflag" : u"Ready", # TODO: Translate into Russian (this is to indicate a user is ready to watch in the ConsoleUI userlist) "ready-userlist-userflag" : u"Ready", # TODO: Translate into Russian (this is to indicate a user is ready to watch in the ConsoleUI userlist)
"update-check-failed-notification" : u"Could not automatically check whether Syncplay {} is up to date. Want to visit http://syncplay.pl/ to manually check for updates?", #Syncplay version # TODO: Translate into Russian
"syncplay-uptodate-notification" : u"Syncplay is up to date", # TODO: Translate into Russian
"syncplay-updateavailable-notification" : u"A new version of Syncplay is available. Do you want to download it?", # TODO: Translate into Russian
"mplayer-file-required-notification" : u"Для использования Syncplay с mplayer необходимо передать файл в качестве параметра", "mplayer-file-required-notification" : u"Для использования Syncplay с mplayer необходимо передать файл в качестве параметра",
"mplayer-file-required-notification/example" : u"Пример использования: syncplay [options] [url|path/]filename", "mplayer-file-required-notification/example" : u"Пример использования: syncplay [options] [url|path/]filename",
"mplayer2-required" : u"Syncplay не совместим с MPlayer 1.x, пожалуйста, используйте mplayer2 или mpv", "mplayer2-required" : u"Syncplay не совместим с MPlayer 1.x, пожалуйста, используйте mplayer2 или mpv",
@ -406,7 +418,8 @@ ru = {
"more-info-notification" : u"Больше информации на {}", # projectURL "more-info-notification" : u"Больше информации на {}", # projectURL
"gui-data-cleared-notification" : u"Syncplay очистил путь и информацию о состоянии окна, использованного GUI.", "gui-data-cleared-notification" : u"Syncplay очистил путь и информацию о состоянии окна, использованного GUI.",
"language-changed-msgbox-label" : u"Language will be changed when you run Syncplay.", "language-changed-msgbox-label" : u"Language will be changed when you run Syncplay.", # TODO: Translate into Russian
"promptforupdate-label" : u"Is it okay for Syncplay to automatically check for updates from time to time?", # TODO: Translate into Russian
"vlc-version-mismatch" : u"Внимание: Вы используете VLC устаревшей версии {}. К сожалению, Syncplay способен работать с VLC {} и выше.", # VLC version, VLC min version "vlc-version-mismatch" : u"Внимание: Вы используете VLC устаревшей версии {}. К сожалению, Syncplay способен работать с VLC {} и выше.", # VLC version, VLC min version
"vlc-interface-version-mismatch" : u"Внимание: В используете модуль интерфейса Syncplay устаревшей версии {} для VLC. К сожалению, Syncplay способен работать с версией {} и выше.", # VLC interface version, VLC interface min version "vlc-interface-version-mismatch" : u"Внимание: В используете модуль интерфейса Syncplay устаревшей версии {} для VLC. К сожалению, Syncplay способен работать с версией {} и выше.", # VLC interface version, VLC interface min version
@ -492,6 +505,7 @@ ru = {
"privacy-dontsend-option" : u"не отпр.", "privacy-dontsend-option" : u"не отпр.",
"filename-privacy-label" : u"Имя файла:", "filename-privacy-label" : u"Имя файла:",
"filesize-privacy-label" : u"Размер файла:", "filesize-privacy-label" : u"Размер файла:",
"checkforupdatesautomatically-label" : u"Проверять обновления автоматически", # TODO: Confirm Russian translation
"slowondesync-label" : u"Замедлять при небольших рассинхронизациях (не поддерживаетя в MPC-HC)", "slowondesync-label" : u"Замедлять при небольших рассинхронизациях (не поддерживаетя в MPC-HC)",
"rewindondesync-label" : u"Перемотка при больших рассинхронизациях (настоятельно рекомендуется)", "rewindondesync-label" : u"Перемотка при больших рассинхронизациях (настоятельно рекомендуется)",
"dontslowdownwithme-label" : u"Никогда не замедлять или перематывать видео другим", # TODO: Update new wording into Russian (should state "Experimental" in brackets at the end) "dontslowdownwithme-label" : u"Никогда не замедлять или перематывать видео другим", # TODO: Update new wording into Russian (should state "Experimental" in brackets at the end)
@ -560,6 +574,7 @@ ru = {
"help-menu-label" : u"&Помощь", "help-menu-label" : u"&Помощь",
"userguide-menu-label" : u"&Руководство Пользователя", "userguide-menu-label" : u"&Руководство Пользователя",
"update-menu-label" : u"Check for &update", # TODO: Translate into Russian
"setoffset-msgbox-label" : u"Установить смещение", "setoffset-msgbox-label" : u"Установить смещение",
"offsetinfo-msgbox-label" : u"Смещение (см. как использовать на http://syncplay.pl/guide/):", "offsetinfo-msgbox-label" : u"Смещение (см. как использовать на http://syncplay.pl/guide/):",
@ -594,6 +609,7 @@ ru = {
"privacy-sendraw-tooltip" : u"Отправляет эту информацию без шифрования. Рекомендуемая опция с наибольшей функциональностью.", "privacy-sendraw-tooltip" : u"Отправляет эту информацию без шифрования. Рекомендуемая опция с наибольшей функциональностью.",
"privacy-sendhashed-tooltip" : u"Отправляет хэш-сумму этой информации, делая ее невидимой для других пользователей.", "privacy-sendhashed-tooltip" : u"Отправляет хэш-сумму этой информации, делая ее невидимой для других пользователей.",
"privacy-dontsend-tooltip" : u"Не отправлять эту информацию на сервер. Предоставляет наибольшую приватность.", "privacy-dontsend-tooltip" : u"Не отправлять эту информацию на сервер. Предоставляет наибольшую приватность.",
"checkforupdatesautomatically-tooltip" : u"Regularly check with the Syncplay website to see whether a new version of Syncplay is available.", # TODO: Translate into Russian
"slowondesync-tooltip" : u"Временно уменьшить скорость воспроизведения в целях синхронизации с другими зрителями. Не поддерживается в MPC-HC.", "slowondesync-tooltip" : u"Временно уменьшить скорость воспроизведения в целях синхронизации с другими зрителями. Не поддерживается в MPC-HC.",
"dontslowdownwithme-tooltip" : u"Ваши лаги не будут влиять на других зрителей.", "dontslowdownwithme-tooltip" : u"Ваши лаги не будут влиять на других зрителей.",
"pauseonleave-tooltip" : u"Приостановить воспроизведение, если Вы покинули комнату или кто-то из зрителей отключился от сервера.", "pauseonleave-tooltip" : u"Приостановить воспроизведение, если Вы покинули комнату или кто-то из зрителей отключился от сервера.",
@ -714,7 +730,11 @@ de = {
"userlist-room-notification" : u"In Raum '{}':", # Room "userlist-room-notification" : u"In Raum '{}':", # Room
"userlist-file-notification" : u"File", # TODO: Translate into German (Datei?) "userlist-file-notification" : u"File", # TODO: Translate into German (Datei?)
"controller-userlist-userflag" : u"Controller", # TODO: Translate into German (this is to indicate a user is a controller in the ConsoleUI userlist) "controller-userlist-userflag" : u"Controller", # TODO: Translate into German (this is to indicate a user is a controller in the ConsoleUI userlist)
"ready-userlist-userflag" : u"Ready", # TODO: Translate into Germany (this is to indicate a user is ready to watch in the ConsoleUI userlist) "ready-userlist-userflag" : u"Ready", # TODO: Translate into German (this is to indicate a user is ready to watch in the ConsoleUI userlist)
"update-check-failed-notification" : u"Could not automatically check whether Syncplay {} is up to date. Want to visit http://syncplay.pl/ to manually check for updates?", #Syncplay version # TODO: Translate into German
"syncplay-uptodate-notification" : u"Syncplay is up to date", # TODO: Translate into German
"syncplay-updateavailable-notification" : u"A new version of Syncplay is available. Do you want to download it?", # TODO: Translate into German
"mplayer-file-required-notification" : u"Syncplay für mplayer benötigt eine Datei-Angabe beim Start", "mplayer-file-required-notification" : u"Syncplay für mplayer benötigt eine Datei-Angabe beim Start",
"mplayer-file-required-notification/example" : u"Anwendungsbeispiel: syncplay [optionen] [url|pfad/]Dateiname", "mplayer-file-required-notification/example" : u"Anwendungsbeispiel: syncplay [optionen] [url|pfad/]Dateiname",
@ -736,6 +756,7 @@ de = {
"gui-data-cleared-notification" : u"Syncplay hat die Pfad und Fensterdaten der Syncplay-GUI zurückgesetzt.", "gui-data-cleared-notification" : u"Syncplay hat die Pfad und Fensterdaten der Syncplay-GUI zurückgesetzt.",
"language-changed-msgbox-label" : u"Die Sprache wird geändert, wenn du Syncplay neu startest.", "language-changed-msgbox-label" : u"Die Sprache wird geändert, wenn du Syncplay neu startest.",
"promptforupdate-label" : u"Is it okay for Syncplay to automatically check for updates from time to time?", # TODO: Translate into German
"vlc-version-mismatch": u"Warnung: Du nutzt VLC Version {}, aber Syncplay wurde für VLC ab Version {} entwickelt.", # VLC version, VLC min version "vlc-version-mismatch": u"Warnung: Du nutzt VLC Version {}, aber Syncplay wurde für VLC ab Version {} entwickelt.", # VLC version, VLC min version
"vlc-interface-version-mismatch": u"Warnung: Du nutzt Version {} des VLC-Syncplay Interface-Moduls, Syncplay benötigt aber mindestens Version {}.", # VLC interface version, VLC interface min version "vlc-interface-version-mismatch": u"Warnung: Du nutzt Version {} des VLC-Syncplay Interface-Moduls, Syncplay benötigt aber mindestens Version {}.", # VLC interface version, VLC interface min version
@ -821,6 +842,7 @@ de = {
"privacy-dontsend-option" : u"Nicht senden", "privacy-dontsend-option" : u"Nicht senden",
"filename-privacy-label" : u"Dateiname:", "filename-privacy-label" : u"Dateiname:",
"filesize-privacy-label" : u"Dateigröße:", "filesize-privacy-label" : u"Dateigröße:",
"checkforupdatesautomatically-label" : u"Automatisch nach Updates suche", # TODO: Confirm German translation
"slowondesync-label" : u"Verlangsamen wenn nicht synchron (nicht unterstützt mit MPC-HC)", "slowondesync-label" : u"Verlangsamen wenn nicht synchron (nicht unterstützt mit MPC-HC)",
"dontslowdownwithme-label" : u"Nie verlangsamen oder andere zurückspulen (Experimentell)", "dontslowdownwithme-label" : u"Nie verlangsamen oder andere zurückspulen (Experimentell)",
"pauseonleave-label" : u"Pausieren wenn ein Benutzer austritt", "pauseonleave-label" : u"Pausieren wenn ein Benutzer austritt",
@ -887,6 +909,7 @@ de = {
"help-menu-label" : u"&Hilfe", "help-menu-label" : u"&Hilfe",
"userguide-menu-label" : u"&Benutzerhandbuch öffnen", "userguide-menu-label" : u"&Benutzerhandbuch öffnen",
"update-menu-label" : u"Check for &update", # TODO: Translate into Russian
"setoffset-msgbox-label" : u"Offset einstellen", "setoffset-msgbox-label" : u"Offset einstellen",
"offsetinfo-msgbox-label" : u"Offset (siehe http://syncplay.pl/guide/ für eine Anleitung [Englisch]):", "offsetinfo-msgbox-label" : u"Offset (siehe http://syncplay.pl/guide/ für eine Anleitung [Englisch]):",
@ -921,6 +944,7 @@ de = {
"privacy-sendraw-tooltip" : u"Die Information im Klartext übertragen. Dies ist die Standard-Einstellung mit der besten Funktionalität.", "privacy-sendraw-tooltip" : u"Die Information im Klartext übertragen. Dies ist die Standard-Einstellung mit der besten Funktionalität.",
"privacy-sendhashed-tooltip" : u"Die Informationen gehasht übertragen, um sie für andere Clients schwerer lesbar zu machen.", "privacy-sendhashed-tooltip" : u"Die Informationen gehasht übertragen, um sie für andere Clients schwerer lesbar zu machen.",
"privacy-dontsend-tooltip" : u"Diese Information nicht übertragen. Dies garantiert den größtmöglichen Datanschutz.", "privacy-dontsend-tooltip" : u"Diese Information nicht übertragen. Dies garantiert den größtmöglichen Datanschutz.",
"checkforupdatesautomatically-tooltip" : u"Regularly check with the Syncplay website to see whether a new version of Syncplay is available.", # TODO: Translate into German
"slowondesync-tooltip" : u"Reduziert die Abspielgeschwindigkeit zeitweise, um die Synchronität zu den anderen Clients wiederherzustellen.", "slowondesync-tooltip" : u"Reduziert die Abspielgeschwindigkeit zeitweise, um die Synchronität zu den anderen Clients wiederherzustellen.",
"rewindondesync-label" : u"Zurückspulen bei großer Zeitdifferenz (empfohlen)", "rewindondesync-label" : u"Zurückspulen bei großer Zeitdifferenz (empfohlen)",
"fastforwardondesync-label" : u"Vorspulen wenn das Video lagt (empfohlen)", "fastforwardondesync-label" : u"Vorspulen wenn das Video lagt (empfohlen)",

View File

@ -47,6 +47,8 @@ class ConfigurationGetter(object):
"readyAtStart": False, "readyAtStart": False,
"clearGUIData": False, "clearGUIData": False,
"language" : "", "language" : "",
"checkForUpdatesAutomatically" : None,
"lastCheckedForUpdates" : "",
"resetConfig" : False, "resetConfig" : False,
"showOSD" : True, "showOSD" : True,
"showOSDWarnings" : True, "showOSDWarnings" : True,
@ -95,6 +97,9 @@ class ConfigurationGetter(object):
"showContactInfo" , "showContactInfo" ,
"showDurationNotification" "showDurationNotification"
] ]
self._tristate = [
"checkForUpdatesAutomatically"
]
self._numeric = [ self._numeric = [
"slowdownThreshold", "slowdownThreshold",
@ -106,7 +111,7 @@ class ConfigurationGetter(object):
"server_data": ["host", "port", "password"], "server_data": ["host", "port", "password"],
"client_settings": ["name", "room", "playerPath", "slowdownThreshold", "rewindThreshold", "fastforwardThreshold", "slowOnDesync", "rewindOnDesync", "fastforwardOnDesync", "dontSlowDownWithMe", "forceGuiPrompt", "filenamePrivacyMode", "filesizePrivacyMode", "pauseOnLeave", "readyAtStart"], "client_settings": ["name", "room", "playerPath", "slowdownThreshold", "rewindThreshold", "fastforwardThreshold", "slowOnDesync", "rewindOnDesync", "fastforwardOnDesync", "dontSlowDownWithMe", "forceGuiPrompt", "filenamePrivacyMode", "filesizePrivacyMode", "pauseOnLeave", "readyAtStart"],
"gui": ["showOSD", "showOSDWarnings", "showSlowdownOSD", "showDifferentRoomOSD", "showSameRoomOSD", "showNonControllerOSD", "showContactInfo" , "showDurationNotification"], "gui": ["showOSD", "showOSDWarnings", "showSlowdownOSD", "showDifferentRoomOSD", "showSameRoomOSD", "showNonControllerOSD", "showContactInfo" , "showDurationNotification"],
"general": ["language"] "general": ["language", "checkForUpdatesAutomatically", "lastCheckedForUpdates"]
} }
self._playerFactory = PlayerFactory() self._playerFactory = PlayerFactory()
@ -139,6 +144,14 @@ class ConfigurationGetter(object):
elif self._config[key] == "False": elif self._config[key] == "False":
self._config[key] = False self._config[key] = False
for key in self._tristate:
if self._config[key] == "True":
self._config[key] = True
elif self._config[key] == "False":
self._config[key] = False
elif self._config[key] == "None":
self._config[key] = None
for key in self._numeric: for key in self._numeric:
self._config[key] = float(self._config[key]) self._config[key] = float(self._config[key])

View File

@ -1,8 +1,8 @@
from PySide import QtCore, QtGui from PySide import QtCore, QtGui
from PySide.QtCore import QSettings, Qt, QCoreApplication from PySide.QtCore import QSettings, Qt, QCoreApplication, QUrl
from PySide.QtGui import QApplication, QLineEdit, QCursor, QLabel, QCheckBox, QDesktopServices, QIcon, QImage, QButtonGroup, QRadioButton, QDoubleSpinBox from PySide.QtGui import QApplication, QLineEdit, QCursor, QLabel, QCheckBox, QDesktopServices, QIcon, QImage, QButtonGroup, QRadioButton, QDoubleSpinBox
from syncplay.players.playerFactory import PlayerFactory from syncplay.players.playerFactory import PlayerFactory
from datetime import datetime
import os import os
import sys import sys
from syncplay.messages import getMessage, getLanguages, setLanguage, getInitialLanguage from syncplay.messages import getMessage, getLanguages, setLanguage, getInitialLanguage
@ -35,6 +35,15 @@ class ConfigDialog(QtGui.QDialog):
pressedclosebutton = False pressedclosebutton = False
moreToggling = False moreToggling = False
def automaticUpdatePromptCheck(self):
if self.automaticupdatesCheckbox.checkState() == Qt.PartiallyChecked and not self.nostoreCheckbox.isChecked():
reply = QtGui.QMessageBox.question(self, "Syncplay",
getMessage("promptforupdate-label"), QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No)
if reply == QtGui.QMessageBox.Yes:
self.automaticupdatesCheckbox.setChecked(True)
else:
self.automaticupdatesCheckbox.setChecked(False)
def moreToggled(self): def moreToggled(self):
if self.moreToggling == False: if self.moreToggling == False:
self.moreToggling = True self.moreToggling = True
@ -68,7 +77,7 @@ class ConfigDialog(QtGui.QDialog):
self.runButton.setText(getMessage("storeandrun-label")) self.runButton.setText(getMessage("storeandrun-label"))
def openHelp(self): def openHelp(self):
self.QtGui.QDesktopServices.openUrl("http://syncplay.pl/guide/client/") self.QtGui.QDesktopServices.openUrl(QUrl("http://syncplay.pl/guide/client/"))
def _isURL(self, path): def _isURL(self, path):
if path is None: if path is None:
@ -170,6 +179,17 @@ class ConfigDialog(QtGui.QDialog):
if fileName: if fileName:
self.executablepathCombobox.setEditText(os.path.normpath(fileName)) self.executablepathCombobox.setEditText(os.path.normpath(fileName))
def loadLastUpdateCheckDate(self):
settings = QSettings("Syncplay", "Interface")
settings.beginGroup("Update")
self.lastCheckedForUpdates = settings.value("lastChecked", None)
if self.lastCheckedForUpdates:
if self.config["lastCheckedForUpdates"] is not None and self.config["lastCheckedForUpdates"] is not "":
if self.lastCheckedForUpdates > datetime.strptime(self.config["lastCheckedForUpdates"], "%Y-%m-%d %H:%M:%S.%f"):
self.config["lastCheckedForUpdates"] = str(self.lastCheckedForUpdates)
else:
self.config["lastCheckedForUpdates"] = str(self.lastCheckedForUpdates)
def loadMediaBrowseSettings(self): def loadMediaBrowseSettings(self):
settings = QSettings("Syncplay", "MediaBrowseDialog") settings = QSettings("Syncplay", "MediaBrowseDialog")
settings.beginGroup("MediaBrowseDialog") settings.beginGroup("MediaBrowseDialog")
@ -218,6 +238,9 @@ class ConfigDialog(QtGui.QDialog):
self.saveMediaBrowseSettings() self.saveMediaBrowseSettings()
def _saveDataAndLeave(self): def _saveDataAndLeave(self):
self.automaticUpdatePromptCheck()
self.loadLastUpdateCheckDate()
self.processWidget(self, lambda w: self.saveValues(w)) self.processWidget(self, lambda w: self.saveValues(w))
if self.hostTextbox.text(): if self.hostTextbox.text():
self.config['host'] = self.hostTextbox.text() if ":" in self.hostTextbox.text() else self.hostTextbox.text() + ":" + unicode(constants.DEFAULT_PORT) self.config['host'] = self.hostTextbox.text() if ":" in self.hostTextbox.text() else self.hostTextbox.text() + ":" + unicode(constants.DEFAULT_PORT)
@ -293,6 +316,11 @@ class ConfigDialog(QtGui.QDialog):
inverted = True inverted = True
else: else:
inverted = False inverted = False
if self.config[valueName] is None:
widget.setTristate(True)
widget.setCheckState(Qt.PartiallyChecked)
widget.stateChanged.connect(lambda: widget.setTristate(False))
else:
widget.setChecked(self.config[valueName] != inverted) widget.setChecked(self.config[valueName] != inverted)
elif isinstance(widget, QRadioButton): elif isinstance(widget, QRadioButton):
radioName, radioValue = valueName.split(constants.CONFIG_NAME_MARKER)[1].split(constants.CONFIG_VALUE_MARKER) radioName, radioValue = valueName.split(constants.CONFIG_NAME_MARKER)[1].split(constants.CONFIG_VALUE_MARKER)
@ -307,6 +335,9 @@ class ConfigDialog(QtGui.QDialog):
return return
if isinstance(widget, QCheckBox) and widget.objectName(): if isinstance(widget, QCheckBox) and widget.objectName():
if widget.checkState() == Qt.PartiallyChecked:
self.config[valueName] = None
else:
if valueName[:1] == constants.INVERTED_STATE_MARKER: if valueName[:1] == constants.INVERTED_STATE_MARKER:
valueName = valueName[1:] valueName = valueName[1:]
inverted = True inverted = True
@ -691,6 +722,9 @@ class ConfigDialog(QtGui.QDialog):
self.filesizeprivacySendHashedOption.setObjectName("privacy-sendhashed" + constants.CONFIG_NAME_MARKER + "filesizePrivacyMode" + constants.CONFIG_VALUE_MARKER + constants.PRIVACY_SENDHASHED_MODE) self.filesizeprivacySendHashedOption.setObjectName("privacy-sendhashed" + constants.CONFIG_NAME_MARKER + "filesizePrivacyMode" + constants.CONFIG_VALUE_MARKER + constants.PRIVACY_SENDHASHED_MODE)
self.filesizeprivacyDontSendOption.setObjectName("privacy-dontsend" + constants.CONFIG_NAME_MARKER + "filesizePrivacyMode" + constants.CONFIG_VALUE_MARKER + constants.PRIVACY_DONTSEND_MODE) self.filesizeprivacyDontSendOption.setObjectName("privacy-dontsend" + constants.CONFIG_NAME_MARKER + "filesizePrivacyMode" + constants.CONFIG_VALUE_MARKER + constants.PRIVACY_DONTSEND_MODE)
self.automaticupdatesCheckbox = QCheckBox(getMessage("checkforupdatesautomatically-label"))
self.automaticupdatesCheckbox.setObjectName("checkForUpdatesAutomatically")
self.privacyLayout.addWidget(self.filenameprivacyLabel, 1, 0) self.privacyLayout.addWidget(self.filenameprivacyLabel, 1, 0)
self.privacyLayout.addWidget(self.filenameprivacySendRawOption, 1, 1, Qt.AlignLeft) self.privacyLayout.addWidget(self.filenameprivacySendRawOption, 1, 1, Qt.AlignLeft)
self.privacyLayout.addWidget(self.filenameprivacySendHashedOption, 1, 2, Qt.AlignLeft) self.privacyLayout.addWidget(self.filenameprivacySendHashedOption, 1, 2, Qt.AlignLeft)
@ -699,6 +733,7 @@ class ConfigDialog(QtGui.QDialog):
self.privacyLayout.addWidget(self.filesizeprivacySendRawOption, 2, 1, Qt.AlignLeft) self.privacyLayout.addWidget(self.filesizeprivacySendRawOption, 2, 1, Qt.AlignLeft)
self.privacyLayout.addWidget(self.filesizeprivacySendHashedOption, 2, 2, Qt.AlignLeft) self.privacyLayout.addWidget(self.filesizeprivacySendHashedOption, 2, 2, Qt.AlignLeft)
self.privacyLayout.addWidget(self.filesizeprivacyDontSendOption, 2, 3, Qt.AlignLeft) self.privacyLayout.addWidget(self.filesizeprivacyDontSendOption, 2, 3, Qt.AlignLeft)
self.privacyLayout.addWidget(self.automaticupdatesCheckbox, 3, 0, 1, 3, Qt.AlignLeft)
self.privacyFrame.setLayout(self.privacyLayout) self.privacyFrame.setLayout(self.privacyLayout)
self.privacySettingsGroup.setLayout(self.privacyLayout) self.privacySettingsGroup.setLayout(self.privacyLayout)
@ -796,6 +831,10 @@ class ConfigDialog(QtGui.QDialog):
settings.clear() settings.clear()
settings = QSettings("Syncplay", "MainWindow") settings = QSettings("Syncplay", "MainWindow")
settings.clear() settings.clear()
settings = QSettings("Syncplay", "Interface")
settings.beginGroup("Update")
settings.setValue("lastChecked", None)
settings.endGroup()
if not leaveMore: if not leaveMore:
settings = QSettings("Syncplay", "MoreSettings") settings = QSettings("Syncplay", "MoreSettings")
settings.clear() settings.clear()

View File

@ -1,12 +1,14 @@
from PySide import QtGui from PySide import QtGui
from PySide.QtCore import Qt, QSettings, QSize, QPoint from PySide.QtCore import Qt, QSettings, QSize, QPoint, QUrl
from syncplay import utils, constants, version from syncplay import utils, constants, version
from syncplay.messages import getMessage from syncplay.messages import getMessage
import sys import sys
import time import time
from datetime import datetime
import re import re
import os import os
from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration, RoomPasswordProvider, formatSize from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration, RoomPasswordProvider, formatSize
lastCheckedForUpdates = None
class UserlistItemDelegate(QtGui.QStyledItemDelegate): class UserlistItemDelegate(QtGui.QStyledItemDelegate):
def __init__(self): def __init__(self):
@ -81,6 +83,7 @@ class MainWindow(QtGui.QMainWindow):
self.hideMiscLabels() self.hideMiscLabels()
except (): except ():
pass pass
self.automaticUpdateCheck()
def promptFor(self, prompt=">", message=""): def promptFor(self, prompt=">", message=""):
# TODO: Prompt user # TODO: Prompt user
@ -428,11 +431,11 @@ class MainWindow(QtGui.QMainWindow):
def openUserGuide(self): def openUserGuide(self):
if sys.platform.startswith('linux'): if sys.platform.startswith('linux'):
self.QtGui.QDesktopServices.openUrl("http://syncplay.pl/guide/linux/") self.QtGui.QDesktopServices.openUrl(QUrl("http://syncplay.pl/guide/linux/"))
elif sys.platform.startswith('win'): elif sys.platform.startswith('win'):
self.QtGui.QDesktopServices.openUrl("http://syncplay.pl/guide/windows/") self.QtGui.QDesktopServices.openUrl(QUrl("http://syncplay.pl/guide/windows/"))
else: else:
self.QtGui.QDesktopServices.openUrl("http://syncplay.pl/guide/") self.QtGui.QDesktopServices.openUrl(QUrl("http://syncplay.pl/guide/"))
def drop(self): def drop(self):
self.close() self.close()
@ -613,6 +616,9 @@ class MainWindow(QtGui.QMainWindow):
window.userguideAction = window.helpMenu.addAction(QtGui.QIcon(self.resourcespath + 'help.png'), window.userguideAction = window.helpMenu.addAction(QtGui.QIcon(self.resourcespath + 'help.png'),
getMessage("userguide-menu-label")) getMessage("userguide-menu-label"))
window.userguideAction.triggered.connect(self.openUserGuide) window.userguideAction.triggered.connect(self.openUserGuide)
window.updateAction = window.helpMenu.addAction(QtGui.QIcon(self.resourcespath + 'application_get.png'),
getMessage("update-menu-label"))
window.updateAction.triggered.connect(self.userCheckForUpdates)
window.menuBar.addMenu(window.helpMenu) window.menuBar.addMenu(window.helpMenu)
window.mainLayout.setMenuBar(window.menuBar) window.mainLayout.setMenuBar(window.menuBar)
@ -652,6 +658,47 @@ class MainWindow(QtGui.QMainWindow):
self.readyPushButton.setIcon(QtGui.QIcon(self.resourcespath + 'cross_checkbox.png')) self.readyPushButton.setIcon(QtGui.QIcon(self.resourcespath + 'cross_checkbox.png'))
self.readyPushButton.setText(getMessage("notready-guipushbuttonlabel")) self.readyPushButton.setText(getMessage("notready-guipushbuttonlabel"))
def automaticUpdateCheck(self):
if not self.config['checkForUpdatesAutomatically']:
return
if self.config['lastCheckedForUpdates']:
configLastChecked = datetime.strptime(self.config["lastCheckedForUpdates"], "%Y-%m-%d %H:%M:%S.%f")
if self.lastCheckedForUpdates is None or configLastChecked > self.lastCheckedForUpdates:
self.lastCheckedForUpdates = configLastChecked
currentDateTime = datetime.utcnow()
if self.lastCheckedForUpdates is None:
self.checkForUpdates()
else:
timeDelta = currentDateTime - self.lastCheckedForUpdates
if timeDelta.total_seconds() > constants.AUTOMATIC_UPDATE_CHECK_FREQUENCY:
self.checkForUpdates()
def userCheckForUpdates(self):
self.checkForUpdates(userInitiated=True)
def checkForUpdates(self, userInitiated=False):
self.lastCheckedForUpdates = datetime.utcnow()
updateStatus, updateMessage, updateURL = self._syncplayClient.checkForUpdate()
if updateMessage is None:
if updateStatus == "uptodate":
updateMessage = getMessage("syncplay-uptodate-notification")
elif updateStatus == "updateavailale":
updateMessage = getMessage("syncplay-updateavailable-notification")
else:
import syncplay
updateMessage = getMessage("update-check-failed-notification").format(syncplay.version)
if userInitiated == True:
updateURL = constants.SYNCPLAY_DOWNLOAD_URL
if updateURL is not None:
reply = QtGui.QMessageBox.question(self, "Syncplay",
updateMessage, QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No)
if reply == QtGui.QMessageBox.Yes:
self.QtGui.QDesktopServices.openUrl(QUrl(updateURL))
elif userInitiated:
QtGui.QMessageBox.information(self, "Syncplay", updateMessage)
else:
self.showMessage(updateMessage)
def dragEnterEvent(self, event): def dragEnterEvent(self, event):
data = event.mimeData() data = event.mimeData()
urls = data.urls() urls = data.urls()
@ -680,6 +727,10 @@ class MainWindow(QtGui.QMainWindow):
settings.setValue("size", self.size()) settings.setValue("size", self.size())
settings.setValue("pos", self.pos()) settings.setValue("pos", self.pos())
settings.endGroup() settings.endGroup()
settings = QSettings("Syncplay", "Interface")
settings.beginGroup("Update")
settings.setValue("lastChecked", self.lastCheckedForUpdates)
settings.endGroup()
def loadSettings(self): def loadSettings(self):
settings = QSettings("Syncplay", "MainWindow") settings = QSettings("Syncplay", "MainWindow")
@ -687,6 +738,9 @@ class MainWindow(QtGui.QMainWindow):
self.resize(settings.value("size", QSize(700, 500))) self.resize(settings.value("size", QSize(700, 500)))
self.move(settings.value("pos", QPoint(200, 200))) self.move(settings.value("pos", QPoint(200, 200)))
settings.endGroup() settings.endGroup()
settings = QSettings("Syncplay", "Interface")
settings.beginGroup("Update")
self.lastCheckedForUpdates = settings.value("lastChecked", None)
def __init__(self): def __init__(self):
super(MainWindow, self).__init__() super(MainWindow, self).__init__()