diff --git a/.appveyor.yml b/.appveyor.yml index aaffc53..0ae9d30 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -22,10 +22,13 @@ install: - cd %APPVEYOR_BUILD_FOLDER% - for /F "tokens=2 delims='" %%a in ('findstr version syncplay\__init__.py') do @set ver=%%a - pyinstaller pyinstaller-onefile.spec - - move dist\Syncplay.exe Syncplay-%ver%-win-Py3-PySide2.exe + - move dist\Syncplay.exe Syncplay-%ver%-win-Py35-PySide2.exe - del build /s /Q - del dist /s /Q - pyinstaller pyinstaller-onedir.spec + - cd dist + - python buildInstaller.py + - cd .. # Not a project with an msbuild file, build done at install. build: off @@ -33,14 +36,17 @@ build: off artifacts: - path: 'dist' type: zip - name: Syncplay-$(ver)-win-py3-pyside2 + name: Syncplay-$(ver)-win-py35-pyside2 - - path: Syncplay-$(ver)-win-Py3-PySide2.exe - name: Syncplay-$(ver)-win-py3-pyside2 + - path: Syncplay-$(ver)-win-Py35-PySide2.exe + name: Syncplay-$(ver)-win-py35-pyside2 # Push artefact to S3 bucket and list all before_deploy: - dir + - cd dist + - dir + - cd .. #- python -c "from PySide2 import QtCore; print QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.PluginsPath)" diff --git a/buildInstaller.py b/buildInstaller.py new file mode 100644 index 0000000..bd9215f --- /dev/null +++ b/buildInstaller.py @@ -0,0 +1,705 @@ +#!/usr/bin/env python +#coding:utf8 + + +#*** TROUBLESHOOTING *** +#1) If you get the error "ImportError: No module named zope.interface" then add an empty __init__.py file to the PYTHONDIR/Lib/site-packages/zope directory +#2) It is expected that you will have NSIS 3 NSIS from http://nsis.sourceforge.net installed. + +import sys, codecs +# try: +# if (sys.version_info.major != 2) or (sys.version_info.minor < 7): +# raise Exception("You must build Syncplay with Python 2.7!") +# except AttributeError: +# import warnings +# warnings.warn("You must build Syncplay with Python 2.7!") + +from string import Template + +import syncplay +import os +import subprocess + +from syncplay.messages import getMissingStrings +missingStrings = getMissingStrings() +if missingStrings is not None and missingStrings is not "": + import warnings + warnings.warn("MISSING/UNUSED STRINGS DETECTED:\n{}".format(missingStrings)) + +def get_nsis_path(): + bin_name = "makensis.exe" + from winreg import HKEY_LOCAL_MACHINE as HKLM + from winreg import KEY_READ, KEY_WOW64_32KEY, OpenKey, QueryValueEx + + try: + nsisreg = OpenKey(HKLM, "Software\\NSIS", 0, KEY_READ | KEY_WOW64_32KEY) + if QueryValueEx(nsisreg, "VersionMajor")[0] >= 3: + return "{}\\{}".format(QueryValueEx(nsisreg, "")[0], bin_name) + else: + raise Exception("You must install NSIS 3 or later.") + except WindowsError: + return bin_name +NSIS_COMPILE = get_nsis_path() + +OUT_DIR = "syncplay_v{}".format(syncplay.version) +SETUP_SCRIPT_PATH = "syncplay_setup.nsi" +NSIS_SCRIPT_TEMPLATE = r""" + !include LogicLib.nsh + !include nsDialogs.nsh + !include FileFunc.nsh + + LoadLanguageFile "$${NSISDIR}\Contrib\Language files\English.nlf" + LoadLanguageFile "$${NSISDIR}\Contrib\Language files\Polish.nlf" + LoadLanguageFile "$${NSISDIR}\Contrib\Language files\Russian.nlf" + LoadLanguageFile "$${NSISDIR}\Contrib\Language files\German.nlf" + LoadLanguageFile "$${NSISDIR}\Contrib\Language files\Italian.nlf" + + Unicode true + + Name "Syncplay $version" + OutFile "Syncplay-$version-Setup.exe" + InstallDir $$PROGRAMFILES\Syncplay + RequestExecutionLevel admin + XPStyle on + Icon resources\icon.ico ;Change DIR + SetCompressor /SOLID lzma + + VIProductVersion "$version.0" + VIAddVersionKey /LANG=$${LANG_ENGLISH} "ProductName" "Syncplay" + VIAddVersionKey /LANG=$${LANG_ENGLISH} "FileVersion" "$version.0" + VIAddVersionKey /LANG=$${LANG_ENGLISH} "LegalCopyright" "Syncplay" + VIAddVersionKey /LANG=$${LANG_ENGLISH} "FileDescription" "Syncplay" + + VIAddVersionKey /LANG=$${LANG_POLISH} "ProductName" "Syncplay" + VIAddVersionKey /LANG=$${LANG_POLISH} "FileVersion" "$version.0" + VIAddVersionKey /LANG=$${LANG_POLISH} "LegalCopyright" "Syncplay" + VIAddVersionKey /LANG=$${LANG_POLISH} "FileDescription" "Syncplay" + + VIAddVersionKey /LANG=$${LANG_RUSSIAN} "ProductName" "Syncplay" + VIAddVersionKey /LANG=$${LANG_RUSSIAN} "FileVersion" "$version.0" + VIAddVersionKey /LANG=$${LANG_RUSSIAN} "LegalCopyright" "Syncplay" + VIAddVersionKey /LANG=$${LANG_RUSSIAN} "FileDescription" "Syncplay" + + VIAddVersionKey /LANG=$${LANG_ITALIAN} "ProductName" "Syncplay" + VIAddVersionKey /LANG=$${LANG_ITALIAN} "FileVersion" "$version.0" + VIAddVersionKey /LANG=$${LANG_ITALIAN} "LegalCopyright" "Syncplay" + VIAddVersionKey /LANG=$${LANG_ITALIAN} "FileDescription" "Syncplay" + + LangString ^SyncplayLanguage $${LANG_ENGLISH} "en" + LangString ^Associate $${LANG_ENGLISH} "Associate Syncplay with multimedia files." + LangString ^VLC $${LANG_ENGLISH} "Install Syncplay interface for VLC 2 and above" + LangString ^BrowseVLCBtn $${LANG_ENGLISH} "Select VLC folder" + LangString ^Shortcut $${LANG_ENGLISH} "Create Shortcuts in following locations:" + LangString ^StartMenu $${LANG_ENGLISH} "Start Menu" + LangString ^Desktop $${LANG_ENGLISH} "Desktop" + LangString ^QuickLaunchBar $${LANG_ENGLISH} "Quick Launch Bar" + LangString ^AutomaticUpdates $${LANG_ENGLISH} "Check for updates automatically" + LangString ^UninstConfig $${LANG_ENGLISH} "Delete configuration file." + + LangString ^SyncplayLanguage $${LANG_POLISH} "pl" + LangString ^Associate $${LANG_POLISH} "Skojarz Syncplaya z multimediami" + LangString ^VLC $${LANG_POLISH} "Zainstaluj interface Syncplaya dla VLC 2+" + LangString ^BrowseVLCBtn $${LANG_POLISH} "Określ folder VLC" + LangString ^Shortcut $${LANG_POLISH} "Utworz skroty w nastepujacych miejscach:" + LangString ^StartMenu $${LANG_POLISH} "Menu Start" + LangString ^Desktop $${LANG_POLISH} "Pulpit" + LangString ^QuickLaunchBar $${LANG_POLISH} "Pasek szybkiego uruchamiania" + LangString ^UninstConfig $${LANG_POLISH} "Usun plik konfiguracyjny." + + LangString ^SyncplayLanguage $${LANG_RUSSIAN} "ru" + LangString ^Associate $${LANG_RUSSIAN} "Ассоциировать Syncplay с видеофайлами" + LangString ^VLC $${LANG_RUSSIAN} "Установить интерфейс Syncplay для VLC 2+" + LangString ^BrowseVLCBtn $${LANG_RUSSIAN} "Укажите папку VLC" + LangString ^Shortcut $${LANG_RUSSIAN} "Создать ярлыки:" + LangString ^StartMenu $${LANG_RUSSIAN} "в меню Пуск" + LangString ^Desktop $${LANG_RUSSIAN} "на рабочем столе" + LangString ^QuickLaunchBar $${LANG_RUSSIAN} "в меню быстрого запуска" + LangString ^AutomaticUpdates $${LANG_RUSSIAN} "Проверять обновления автоматически"; TODO: Confirm Russian translation ("Check for updates automatically") + LangString ^UninstConfig $${LANG_RUSSIAN} "Удалить файл настроек." + + LangString ^SyncplayLanguage $${LANG_GERMAN} "de" + LangString ^Associate $${LANG_GERMAN} "Syncplay als Standardprogramm für Multimedia-Dateien verwenden." + LangString ^VLC $${LANG_GERMAN} "Syncplay-Interface für VLC installieren (ab VLC 2+)" + LangString ^Shortcut $${LANG_GERMAN} "Erstelle Verknüpfungen an folgenden Orten:" + LangString ^BrowseVLCBtn $${LANG_GERMAN} "VLC-Ordner wählen" + LangString ^StartMenu $${LANG_GERMAN} "Startmenü" + LangString ^Desktop $${LANG_GERMAN} "Desktop" + LangString ^QuickLaunchBar $${LANG_GERMAN} "Schnellstartleiste" + LangString ^AutomaticUpdates $${LANG_GERMAN} "Automatisch nach Updates suchen"; + LangString ^UninstConfig $${LANG_GERMAN} "Konfigurationsdatei löschen." + + LangString ^SyncplayLanguage $${LANG_ITALIAN} "it" + LangString ^Associate $${LANG_ITALIAN} "Associa Syncplay con i file multimediali." + LangString ^VLC $${LANG_ITALIAN} "Installa l'interfaccia di Syncplay per VLC 2+" + LangString ^BrowseVLCBtn $${LANG_ITALIAN} "Cartella di VLC" + LangString ^Shortcut $${LANG_ITALIAN} "Crea i collegamenti nei percorsi seguenti:" + LangString ^StartMenu $${LANG_ITALIAN} "Menu Start" + LangString ^Desktop $${LANG_ITALIAN} "Desktop" + LangString ^QuickLaunchBar $${LANG_ITALIAN} "Barra di avvio rapido" + LangString ^AutomaticUpdates $${LANG_ITALIAN} "Controllo automatico degli aggiornamenti" + LangString ^UninstConfig $${LANG_ITALIAN} "Cancella i file di configurazione." + + ; Remove text to save space + LangString ^ClickInstall $${LANG_GERMAN} " " + + PageEx license + LicenseData resources\license.rtf + PageExEnd + Page custom DirectoryCustom DirectoryCustomLeave + Page instFiles + + UninstPage custom un.installConfirm un.installConfirmLeave + UninstPage instFiles + + Var Dialog + Var Icon_Syncplay + Var Icon_Syncplay_Handle + ;Var CheckBox_Associate + Var CheckBox_VLC + Var CheckBox_AutomaticUpdates + Var CheckBox_StartMenuShortcut + Var CheckBox_DesktopShortcut + Var CheckBox_QuickLaunchShortcut + ;Var CheckBox_Associate_State + Var CheckBox_VLC_State + Var CheckBox_AutomaticUpdates_State + Var CheckBox_StartMenuShortcut_State + Var CheckBox_DesktopShortcut_State + Var CheckBox_QuickLaunchShortcut_State + Var Button_Browse + Var Button_Browse_VLC + Var Directory + Var GroupBox_DirSub + Var Label_Text + Var Label_Shortcut + Var Label_Size + Var Label_Space + Var Text_Directory + + Var Uninst_Dialog + Var Uninst_Icon + Var Uninst_Icon_Handle + Var Uninst_Label_Directory + Var Uninst_Label_Text + Var Uninst_Text_Directory + Var Uninst_CheckBox_Config + Var Uninst_CheckBox_Config_State + + Var Size + Var SizeHex + Var AvailibleSpace + Var AvailibleSpaceGiB + Var Drive + Var VLC_Directory + + ;!macro APP_ASSOCIATE EXT FileCLASS DESCRIPTION COMMANDTEXT COMMAND + ; WriteRegStr HKCR ".$${EXT}" "" "$${FileCLASS}" + ; WriteRegStr HKCR "$${FileCLASS}" "" `$${DESCRIPTION}` + ; WriteRegStr HKCR "$${FileCLASS}\shell" "" "open" + ; WriteRegStr HKCR "$${FileCLASS}\shell\open" "" `$${COMMANDTEXT}` + ; WriteRegStr HKCR "$${FileCLASS}\shell\open\command" "" `$${COMMAND}` + ;!macroend + + !macro APP_UNASSOCIATE EXT FileCLASS + ; Backup the previously associated File class + ReadRegStr $$R0 HKCR ".$${EXT}" `$${FileCLASS}_backup` + WriteRegStr HKCR ".$${EXT}" "" "$$R0" + DeleteRegKey HKCR `$${FileCLASS}` + !macroend + + ;!macro ASSOCIATE EXT + ; !insertmacro APP_ASSOCIATE "$${EXT}" "Syncplay.$${EXT}" "$$INSTDIR\Syncplay.exe,%1%" \ + ; "Open with Syncplay" "$$INSTDIR\Syncplay.exe $$\"%1$$\"" + ;!macroend + + !macro UNASSOCIATE EXT + !insertmacro APP_UNASSOCIATE "$${EXT}" "Syncplay.$${EXT}" + !macroend + + ;Prevents from running more than one instance of installer and sets default state of checkboxes + Function .onInit + System::Call 'kernel32::CreateMutexA(i 0, i 0, t "SyncplayMutex") i .r1 ?e' + Pop $$R0 + StrCmp $$R0 0 +3 + MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running." + Abort + + ;StrCpy $$CheckBox_Associate_State $${BST_CHECKED} + StrCpy $$CheckBox_StartMenuShortcut_State $${BST_CHECKED} + Call GetVLCDir + Call UpdateVLCCheckbox + + Call GetSize + Call DriveSpace + Call Language + FunctionEnd + + ;Language selection dialog + Function Language + Push "" + Push $${LANG_ENGLISH} + Push English + Push $${LANG_POLISH} + Push Polski + Push $${LANG_RUSSIAN} + Push Русский + Push $${LANG_GERMAN} + Push Deutsch + Push $${LANG_ITALIAN} + Push Italiano + Push A ; A means auto count languages + LangDLL::LangDialog "Language Selection" "Please select the language of Syncplay and the installer" + Pop $$LANGUAGE + StrCmp $$LANGUAGE "cancel" 0 +2 + Abort + FunctionEnd + + Function DirectoryCustom + + nsDialogs::Create 1018 + Pop $$Dialog + + GetFunctionAddress $$R8 DirectoryCustomLeave + nsDialogs::OnBack $$R8 + + $${NSD_CreateIcon} 0u 0u 22u 20u "" + Pop $$Icon_Syncplay + $${NSD_SetIconFromInstaller} $$Icon_Syncplay $$Icon_Syncplay_Handle + + $${NSD_CreateLabel} 25u 0u 241u 34u "$$(^DirText)" + Pop $$Label_Text + + $${NSD_CreateText} 8u 38u 187u 12u "$$INSTDIR" + Pop $$Text_Directory + $${NSD_SetFocus} $$Text_Directory + + $${NSD_CreateBrowseButton} 202u 37u 55u 14u "$$(^BrowseBtn)" + Pop $$Button_Browse + $${NSD_OnClick} $$Button_Browse DirectoryBrowseDialog + + $${NSD_CreateGroupBox} 1u 27u 264u 30u "$$(^DirSubText)" + Pop $$GroupBox_DirSub + + $${NSD_CreateLabel} 0u 122u 132 8u "$$(^SpaceRequired)$$SizeMB" + Pop $$Label_Size + + $${NSD_CreateLabel} 321u 122u 132 8u "$$(^SpaceAvailable)$$AvailibleSpaceGiB.$$AvailibleSpaceGB" + Pop $$Label_Space + + ;$${NSD_CreateCheckBox} 8u 59u 187u 10u "$$(^Associate)" + ;Pop $$CheckBox_Associate + + $${NSD_CreateBrowseButton} 185u 70u 70u 14u "$$(^BrowseVLCBtn)" + Pop $$Button_Browse_VLC + $${NSD_OnClick} $$Button_Browse_VLC DirectoryBrowseDialogVLC + + $${NSD_CreateCheckBox} 8u 72u 250u 10u "$$(^VLC)" + Pop $$CheckBox_VLC + + $${NSD_CreateCheckBox} 8u 85u 250u 10u "$$(^AutomaticUpdates)" + Pop $$CheckBox_AutomaticUpdates + $${NSD_Check} $$CheckBox_AutomaticUpdates + + $${NSD_CreateLabel} 8u 98u 187u 10u "$$(^Shortcut)" + Pop $$Label_Shortcut + + $${NSD_CreateCheckbox} 8u 111u 60u 10u "$$(^StartMenu)" + Pop $$CheckBox_StartMenuShortcut + + $${NSD_CreateCheckbox} 78u 111u 70u 10u "$$(^Desktop)" + Pop $$CheckBox_DesktopShortcut + + $${NSD_CreateCheckbox} 158u 111u 130u 10u "$$(^QuickLaunchBar)" + Pop $$CheckBox_QuickLaunchShortcut + + ;$${If} $$CheckBox_Associate_State == $${BST_CHECKED} + ; $${NSD_Check} $$CheckBox_Associate + ;$${EndIf} + + $${If} $$CheckBox_VLC_State == $${BST_CHECKED} + $${NSD_Check} $$CheckBox_VLC + $${EndIf} + + Call UpdateVLCCheckbox + + $${If} $$CheckBox_StartMenuShortcut_State == $${BST_CHECKED} + $${NSD_Check} $$CheckBox_StartMenuShortcut + $${EndIf} + + $${If} $$CheckBox_DesktopShortcut_State == $${BST_CHECKED} + $${NSD_Check} $$CheckBox_DesktopShortcut + $${EndIf} + + $${If} $$CheckBox_QuickLaunchShortcut_State == $${BST_CHECKED} + $${NSD_Check} $$CheckBox_QuickLaunchShortcut + $${EndIf} + + $${If} $$CheckBox_AutomaticUpdates_State == $${BST_CHECKED} + $${NSD_Check} $$CheckBox_AutomaticUpdates + $${EndIf} + + nsDialogs::Show + + $${NSD_FreeIcon} $$Icon_Syncplay_Handle + + FunctionEnd + + Function DirectoryCustomLeave + $${NSD_GetText} $$Text_Directory $$INSTDIR + ;$${NSD_GetState} $$CheckBox_Associate $$CheckBox_Associate_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_DesktopShortcut $$CheckBox_DesktopShortcut_State + $${NSD_GetState} $$CheckBox_QuickLaunchShortcut $$CheckBox_QuickLaunchShortcut_State + FunctionEnd + + Function DirectoryBrowseDialog + nsDialogs::SelectFolderDialog $$(^DirBrowseText) + Pop $$Directory + $${If} $$Directory != error + StrCpy $$INSTDIR $$Directory + $${NSD_SetText} $$Text_Directory $$INSTDIR + Call DriveSpace + $${NSD_SetText} $$Label_Space "$$(^SpaceAvailable)$$AvailibleSpaceGiB.$$AvailibleSpaceGB" + $${EndIf} + Abort + FunctionEnd + + Function GetVLCDir + IfFileExists "$$VLC_Directory\vlc.exe" VLCFound 0 + ReadRegStr $$VLC_Directory HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "VLCInstallLocation" + IfFileExists "$$VLC_Directory\vlc.exe" VLCFound 0 + ReadRegStr $$VLC_Directory HKLM "Software\VideoLAN\VLC" "InstallDir" + IfFileExists "$$VLC_Directory\vlc.exe" VLCFound 0 + StrCpy $$VLC_Directory "c:\program files (x86)\videolan\vlc" + IfFileExists "$$VLC_Directory\vlc.exe" VLCFound 0 + StrCpy $$VLC_Directory "c:\program files\videolan\vlc" + IfFileExists "$$VLC_Directory\vlc.exe" VLCFound 0 + StrCpy $$VLC_Directory "" + VLCFound: + FunctionEnd + + Function UpdateVLCCheckbox + IfFileExists "$$VLC_Directory\vlc.exe" VLC_Enabled VLC_Disabled + + VLC_Enabled: + EnableWindow $$CheckBox_VLC 1 + StrCpy $$CheckBox_VLC_State $${BST_CHECKED} + $${NSD_SetState} $$CheckBox_VLC $$CheckBox_VLC_State + goto CheckboxUpdated + + VLC_Disabled: + EnableWindow $$CheckBox_VLC 0 + StrCpy $$CheckBox_VLC_State $${BST_UNCHECKED} + $${NSD_SetState} $$CheckBox_VLC $$CheckBox_VLC_State + + CheckboxUpdated: + FunctionEnd + + Function DirectoryBrowseDialogVLC + nsDialogs::SelectFolderDialog $$(^BrowseVLCBtn) $$VLC_Directory + Pop $$Directory + $${If} $$Directory != error + StrCpy $$VLC_Directory $$Directory + Call UpdateVLCCheckbox + $${EndIf} + Abort + FunctionEnd + + Function GetSize + StrCpy $$Size "$totalSize" + IntOp $$Size $$Size / 1024 + IntFmt $$SizeHex "0x%08X" $$Size + IntOp $$Size $$Size / 1024 + FunctionEnd + + ;Calculates Free Space on HDD + Function DriveSpace + StrCpy $$Drive $$INSTDIR 1 + $${DriveSpace} "$$Drive:\" "/D=F /S=M" $$AvailibleSpace + IntOp $$AvailibleSpaceGiB $$AvailibleSpace / 1024 + IntOp $$AvailibleSpace $$AvailibleSpace % 1024 + IntOp $$AvailibleSpace $$AvailibleSpace / 102 + FunctionEnd + + Function InstallOptions + ;$${If} $$CheckBox_Associate_State == $${BST_CHECKED} + ; Call Associate + ; DetailPrint "Associated Syncplay with multimedia files" + ;$${EndIf} + + $${If} $$CheckBox_StartMenuShortcut_State == $${BST_CHECKED} + CreateDirectory $$SMPROGRAMS\Syncplay + CreateShortCut "$$SMPROGRAMS\Syncplay\Syncplay.lnk" "$$INSTDIR\Syncplay.exe" "" + CreateShortCut "$$SMPROGRAMS\Syncplay\Syncplay Server.lnk" "$$INSTDIR\syncplayServer.exe" "" + CreateShortCut "$$SMPROGRAMS\Syncplay\Uninstall.lnk" "$$INSTDIR\Uninstall.exe" "" + WriteINIStr "$$SMPROGRAMS\Syncplay\SyncplayWebsite.url" "InternetShortcut" "URL" "http://syncplay.pl" + $${EndIf} + + $${If} $$CheckBox_DesktopShortcut_State == $${BST_CHECKED} + CreateShortCut "$$DESKTOP\Syncplay.lnk" "$$INSTDIR\Syncplay.exe" "" + $${EndIf} + + $${If} $$CheckBox_QuickLaunchShortcut_State == $${BST_CHECKED} + CreateShortCut "$$QUICKLAUNCH\Syncplay.lnk" "$$INSTDIR\Syncplay.exe" "" + $${EndIf} + + $${If} $$CheckBox_VLC_State == $${BST_CHECKED} + IfFileExists "$$VLC_Directory\vlc.exe" 0 EndOfVLC + SetOutPath $$VLC_Directory\lua\intf + File resources\lua\intf\syncplay.lua + EndOfVLC: + $${EndIf} + FunctionEnd + + ;Associates extensions with Syncplay + ;Function Associate + ; !insertmacro ASSOCIATE avi + ; !insertmacro ASSOCIATE mpg + ; !insertmacro ASSOCIATE mpeg + ; !insertmacro ASSOCIATE mpe + ; !insertmacro ASSOCIATE m1v + ; !insertmacro ASSOCIATE m2v + ; !insertmacro ASSOCIATE mpv2 + ; !insertmacro ASSOCIATE mp2v + ; !insertmacro ASSOCIATE mkv + ; !insertmacro ASSOCIATE mp4 + ; !insertmacro ASSOCIATE m4v + ; !insertmacro ASSOCIATE mp4v + ; !insertmacro ASSOCIATE 3gp + ; !insertmacro ASSOCIATE 3gpp + ; !insertmacro ASSOCIATE 3g2 + ; !insertmacro ASSOCIATE 3pg2 + ; !insertmacro ASSOCIATE flv + ; !insertmacro ASSOCIATE f4v + ; !insertmacro ASSOCIATE rm + ; !insertmacro ASSOCIATE wmv + ; !insertmacro ASSOCIATE swf + ; !insertmacro ASSOCIATE rmvb + ; !insertmacro ASSOCIATE divx + ; !insertmacro ASSOCIATE amv + ;FunctionEnd + + Function WriteRegistry + Call GetSize + WriteRegStr HKLM SOFTWARE\Syncplay "Install_Dir" "$$INSTDIR" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "DisplayName" "Syncplay" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "InstallLocation" "$$INSTDIR" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "VLCInstallLocation" "$$VLC_Directory" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "UninstallString" '"$$INSTDIR\uninstall.exe"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "DisplayIcon" "$$INSTDIR\resources\icon.ico" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "Publisher" "Syncplay" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "DisplayVersion" "$version" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "URLInfoAbout" "http://syncplay.pl/" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "NoModify" 1 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "NoRepair" 1 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "EstimatedSize" "$$SizeHex" + 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 + + Function un.installConfirm + nsDialogs::Create 1018 + Pop $$Uninst_Dialog + + $${NSD_CreateIcon} 0u 1u 22u 20u "" + Pop $$Uninst_Icon + $${NSD_SetIconFromInstaller} $$Uninst_Icon $$Uninst_Icon_Handle + + $${NSD_CreateLabel} 0u 45u 55u 8u "$$(^UninstallingSubText)" + Pop $$Uninst_Label_Directory + + $${NSD_CreateLabel} 25u 0u 241u 34u "$$(^UninstallingText)" + Pop $$Uninst_Label_Text + + ReadRegStr $$INSTDIR HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "InstallLocation" + $${NSD_CreateText} 56u 43u 209u 12u "$$INSTDIR" + Pop $$Uninst_Text_Directory + EnableWindow $$Uninst_Text_Directory 0 + + $${NSD_CreateCheckBox} 0u 60u 250u 10u "$$(^UninstConfig)" + Pop $$Uninst_CheckBox_Config + + + nsDialogs::Show + $${NSD_FreeIcon} $$Uninst_Icon_Handle + FunctionEnd + + Function un.installConfirmLeave + $${NSD_GetState} $$Uninst_CheckBox_Config $$Uninst_CheckBox_Config_State + FunctionEnd + + Function un.AssociateDel + !insertmacro UNASSOCIATE avi + !insertmacro UNASSOCIATE mpg + !insertmacro UNASSOCIATE mpeg + !insertmacro UNASSOCIATE mpe + !insertmacro UNASSOCIATE m1v + !insertmacro UNASSOCIATE m2v + !insertmacro UNASSOCIATE mpv2 + !insertmacro UNASSOCIATE mp2v + !insertmacro UNASSOCIATE mkv + !insertmacro UNASSOCIATE mp4 + !insertmacro UNASSOCIATE m4v + !insertmacro UNASSOCIATE mp4v + !insertmacro UNASSOCIATE 3gp + !insertmacro UNASSOCIATE 3gpp + !insertmacro UNASSOCIATE 3g2 + !insertmacro UNASSOCIATE 3pg2 + !insertmacro UNASSOCIATE flv + !insertmacro UNASSOCIATE f4v + !insertmacro UNASSOCIATE rm + !insertmacro UNASSOCIATE wmv + !insertmacro UNASSOCIATE swf + !insertmacro UNASSOCIATE rmvb + !insertmacro UNASSOCIATE divx + !insertmacro UNASSOCIATE amv + FunctionEnd + + Function un.InstallOptions + Delete $$SMPROGRAMS\Syncplay\Syncplay.lnk + Delete "$$SMPROGRAMS\Syncplay\Syncplay Server.lnk" + Delete $$SMPROGRAMS\Syncplay\Uninstall.lnk + Delete $$SMPROGRAMS\Syncplay\SyncplayWebsite.url + RMDir $$SMPROGRAMS\Syncplay + Delete $$DESKTOP\Syncplay.lnk + Delete $$QUICKLAUNCH\Syncplay.lnk + ReadRegStr $$VLC_Directory HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" "VLCInstallLocation" + IfFileExists "$$VLC_Directory\lua\intf\syncplay.lua" 0 +2 + Delete $$VLC_Directory\lua\intf\syncplay.lua + FunctionEnd + + Section "Install" + SetOverwrite on + SetOutPath $$INSTDIR + WriteUninstaller uninstall.exe + + $installFiles + + Call InstallOptions + Call WriteRegistry + SectionEnd + + Section "Uninstall" + Call un.AssociateDel + Call un.InstallOptions + $uninstallFiles + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Syncplay" + DeleteRegKey HKLM SOFTWARE\Syncplay + Delete $$INSTDIR\uninstall.exe + RMDir $$INSTDIR\Syncplay\\resources\lua\intf + RMDir $$INSTDIR\Syncplay\\resources\lua + RMDir $$INSTDIR\Syncplay\\resources + RMDir $$INSTDIR\resources + RMDir $$INSTDIR\lib + RMDir $$INSTDIR + + $${If} $$Uninst_CheckBox_Config_State == $${BST_CHECKED} + IfFileExists "$$APPDATA\.syncplay" 0 +2 + Delete $$APPDATA\.syncplay + IfFileExists "$$APPDATA\syncplay.ini" 0 +2 + Delete $$APPDATA\syncplay.ini + $${EndIf} + SectionEnd +""" + +class NSISScript(object): + def create(self): + fileList, totalSize = self.getBuildDirContents(OUT_DIR) + print("Total size eq: {}".format(totalSize)) + installFiles = self.prepareInstallListTemplate(fileList) + uninstallFiles = self.prepareDeleteListTemplate(fileList) + + if os.path.isfile(SETUP_SCRIPT_PATH): + raise RuntimeError("Cannot create setup script, file exists at {}".format(SETUP_SCRIPT_PATH)) + contents = Template(NSIS_SCRIPT_TEMPLATE).substitute( + version = syncplay.version, + uninstallFiles = uninstallFiles, + installFiles = installFiles, + totalSize = totalSize, + ) + with codecs.open(SETUP_SCRIPT_PATH, "w", "utf-8-sig") as outfile: + outfile.write(contents.decode('utf-8')) + + def compile(self): + if not os.path.isfile(NSIS_COMPILE): + return "makensis.exe not found, won't create the installer" + subproc = subprocess.Popen([NSIS_COMPILE, SETUP_SCRIPT_PATH], env=os.environ) + subproc.communicate() + retcode = subproc.returncode + os.remove(SETUP_SCRIPT_PATH) + if retcode: + raise RuntimeError("NSIS compilation return code: %d" % retcode) + + def getBuildDirContents(self, path): + fileList = {} + totalSize = 0 + for root, _, files in os.walk(path): + totalSize += sum(os.path.getsize(os.path.join(root, file_)) for file_ in files) + for file_ in files: + new_root = root.replace(OUT_DIR, "").strip("\\") + if new_root not in fileList: + fileList[new_root] = [] + fileList[new_root].append(file_) + return fileList, totalSize + + def prepareInstallListTemplate(self, fileList): + create = [] + for dir_ in fileList.keys(): + create.append('SetOutPath "$INSTDIR\\{}"'.format(dir_)) + for file_ in fileList[dir_]: + create.append('FILE "{}\\{}\\{}"'.format(OUT_DIR, dir_, file_)) + return "\n".join(create) + + def prepareDeleteListTemplate(self, fileList): + delete = [] + for dir_ in fileList.keys(): + for file_ in fileList[dir_]: + delete.append('DELETE "$INSTDIR\\{}\\{}"'.format(dir_, file_)) + delete.append('RMdir "$INSTDIR\\{}"'.format(file_)) + return "\n".join(delete) + +guiIcons = ['resources/accept.png', 'resources/arrow_undo.png', 'resources/clock_go.png', + 'resources/control_pause_blue.png', 'resources/cross.png', 'resources/door_in.png', + 'resources/folder_explore.png', 'resources/help.png', 'resources/table_refresh.png', + 'resources/timeline_marker.png','resources/control_play_blue.png', + 'resources/mpc-hc.png','resources/mpc-hc64.png','resources/mplayer.png', + 'resources/mpc-be.png', + 'resources/mpv.png','resources/vlc.png', 'resources/house.png', 'resources/film_link.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/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/arrow_switch.png', + 'resources/film_go.png', 'resources/world_go.png', 'resources/arrow_refresh.png', 'resources/bullet_right_grey.png', + 'resources/user_comment.png', + 'resources/error.png', + 'resources/film_folder_edit.png', + 'resources/film_edit.png', + 'resources/folder_film.png', + 'resources/shield_edit.png', + 'resources/shield_add.png', + 'resources/email_go.png', + 'resources/world_add.png', 'resources/film_add.png', 'resources/delete.png', 'resources/spinner.mng' + ] +resources = ["resources/icon.ico", "resources/syncplay.png", "resources/syncplayintf.lua", "resources/license.rtf", "resources/third-party-notices.rtf"] +resources.extend(guiIcons) +intf_resources = ["resources/lua/intf/syncplay.lua"] + +common_info = dict( + name='Syncplay', + version=syncplay.version, + author='Uriziel', + author_email='dev@syncplay.pl', + description='Syncplay', +) + +script = NSISScript() +script.create() +print("*** compiling the NSIS setup script***") +script.compile() +print("*** DONE ***") diff --git a/pyinstaller-onedir.spec b/pyinstaller-onedir.spec index cfc0c1c..5fced31 100755 --- a/pyinstaller-onedir.spec +++ b/pyinstaller-onedir.spec @@ -3,6 +3,8 @@ import os workdir = os.getcwd() +import syncplay + block_cipher = None @@ -34,4 +36,4 @@ coll = COLLECT(exe, a.datas, strip=False, upx=True, - name='Syncplay') + name="syncplay_v{}".format(syncplay.version))