diff --git a/deployment/windows/jellyfin.nsi b/deployment/windows/jellyfin.nsi new file mode 100644 index 0000000000..b4a927610a --- /dev/null +++ b/deployment/windows/jellyfin.nsi @@ -0,0 +1,185 @@ +!verbose 4 +;-------------------------------- +;Include Modern UI + + !include "MUI2.nsh" + Var JellyfinVersion + Var defaultEmbyDataDir + Var JELLYFINDATADIR + Var ServiceInstalled +;-------------------------------- +;General + + ;Name and file + !getdllversion "$%InstallLocation%\jellyfin.dll" expv_ + !echo "jellyfin.dll version is ${expv_1}.${expv_2}.${expv_3}.${expv_4}" + Name "Jellyfin ${expv_1}.${expv_2}.${expv_3}.${expv_4}" + OutFile "Jellyfin.Installer.${expv_1}.${expv_2}.${expv_3}.${expv_4}.exe" + BrandingText "Jellyfin ${expv_1}.${expv_2}.${expv_3}.${expv_4} Installer" + VIProductVersion "${expv_1}.${expv_2}.${expv_3}.${expv_4}" + VIFileVersion "${expv_1}.${expv_2}.${expv_3}.${expv_4}" + VIAddVersionKey "ProductName" "Jellyfin" + VIAddVersionKey "FileVersion" "${expv_1}.${expv_2}.${expv_3}.${expv_4}" + + ;Default installation folder + InstallDir "$APPDATA\Jellyfin" + + ;Get installation folder from registry if available + InstallDirRegKey HKLM "Software\Jellyfin" "InstallLocation" + + ;Request application privileges for Windows Vista + RequestExecutionLevel admin + CRCCheck on + !define MUI_ABORTWARNING + +;-------------------------------- +;Pages + +; !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_DIRECTORY + + !define MUI_PAGE_HEADER_TEXT "MUI_PAGE_HEADER_TEXT" + !define MUI_PAGE_HEADER_SUBTEXT "MUI_PAGE_HEADER_SUBTEXT" + !define MUI_DIRECTORYPAGE_TEXT_TOP "MUI_DIRECTORYPAGE_TEXT_TOP" + !define MUI_DIRECTORYPAGE_TEXT_DESTINATION "APP Folder" + !define MUI_PAGE_CUSTOMFUNCTION_PRE ShowEmbyLibraryPage + !define MUI_DIRECTORYPAGE_VARIABLE $defaultEmbyDataDir + !insertmacro MUI_PAGE_DIRECTORY + + + !insertmacro MUI_PAGE_INSTFILES + + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Install Jellyfin (required)" InstallJellyfin + SetOutPath "$INSTDIR" +;Create uninstaller + + File /r $%InstallLocation%\* +; Write the installation path into the registry + WriteRegStr HKLM "Software\Jellyfin" "InstallLocation" "$INSTDIR" + +; Write the uninstall keys for Windows + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Jellyfin" "DisplayName" "Jellyfin $JellyfinVersion" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Jellyfin" "UninstallString" '"$INSTDIR\Uninstall.exe"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Jellyfin" "DisplayIcon" '"$INSTDIR\Jellyfin.exe",0' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Jellyfin" "Publisher" "The Jellyfin project" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Jellyfin" "URLInfoAbout" "https://jellyfin.github.io/" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Jellyfin" "DisplayVersion" "$JellyfinVersion" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Jellyfin" "NoModify" 1 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Jellyfin" "NoRepair" 1 + WriteUninstaller "$INSTDIR\Uninstall.exe" + +SectionEnd + + +Section "Jellyfin Service" InstallService + ExecWait '"$INSTDIR"\nssm.exe install Jellyfin "$INSTDIR"\jellyfin.exe --datadir "$JELLYFINDATADIR"' $0 + MessageBox MB_OK "Service install Error : $0" + Sleep 3000 + ExecWait '"$INSTDIR"\nssm.exe set Jellyfin Start SERVICE_DELAYED_AUTO_START' $0 + MessageBox MB_OK "Service setting Error : $0" + StrCpy $ServiceInstalled "YES" +SectionEnd + +Section "Desktop shortcut" DesktopShortcut + SetShellVarContext current + CreateShortCut "$DESKTOP\Jellyfin.lnk" "$INSTDIR\jellyfin.exe" +SectionEnd + +;TODO +Section "Launch Jellyfin" LaunchJellyfin + !echo "Binaries at : $%InstallLocation%" +; either start the service or launch jellyfin standalone + StrCmp $ServiceInstalled "YES" ServiceStart Standalone + + ServiceStart: + ExecWait 'C:\Windows\System32\sc.exe start Jellyfin' $0 + MessageBox MB_OK "Service start Error : $0" + Return + + Standalone: + ExecWait '"$INSTDIR"\jellyfin.exe' $0 + MessageBox MB_OK "start Error : $0" + +SectionEnd + +;TODO +Section "Migrate Emby Library" MigrateEmbyLibrary + + CopyFiles $defaultEmbyDataDir/config $JELLYFINDATADIR + CopyFiles $defaultEmbyDataDir/cache $JELLYFINDATADIR + CopyFiles $defaultEmbyDataDir/data $JELLYFINDATADIR + CopyFiles $defaultEmbyDataDir/metadata $JELLYFINDATADIR + CopyFiles $defaultEmbyDataDir/root $JELLYFINDATADIR + +SectionEnd + + +;-------------------------------- +;Descriptions + + ;Language strings + LangString DESC_InstallJellyfin ${LANG_ENGLISH} "Install Jellyfin" + LangString DESC_InstallService ${LANG_ENGLISH} "Install As a Service" + LangString DESC_DesktopShortcut ${LANG_ENGLISH} "Create a desktop shortcut" + LangString DESC_LaunchJellyfin ${LANG_ENGLISH} "Start Jellyfin after Install" + LangString DESC_MigrateEmbyLibrary ${LANG_ENGLISH} "Migrate existing Emby Library" + + ;Assign language strings to sections + !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${InstallJellyfin} $(DESC_InstallJellyfin) + !insertmacro MUI_DESCRIPTION_TEXT ${InstallService} $(DESC_InstallService) + !insertmacro MUI_DESCRIPTION_TEXT ${LaunchJellyfin} $(DESC_LaunchJellyfin) + !insertmacro MUI_DESCRIPTION_TEXT ${MigrateEmbyLibrary} $(DESC_MigrateEmbyLibrary) + !insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + + +;TODO +; stop service or running instance + MessageBox MB_OK "uninstall $INSTDIR, $JELLYFINDATADIR" + + Delete "$INSTDIR\Uninstall.exe" + RMDir /r "$INSTDIR" + RMDir /r "$JELLYFINDATADIR" + DeleteRegKey HKLM "Software\Jellyfin" + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Jellyfin" + Delete "$DESKTOP\Jellyfin.lnk" + +SectionEnd + + +Function .onInit + SetShellVarContext all + !getdllversion "$%InstallLocation%\jellyfin.dll" expv_ + StrCpy $JellyfinVersion "${expv_1}.${expv_2}.${expv_3}.${expv_4}" + StrCpy $JELLYFINDATADIR "$LOCALAPPDATA\jellyfin\" + StrCpy $ServiceInstalled "NO" + SectionSetFlags ${InstallJellyfin} 17 +FunctionEnd + +Function ShowEmbyLibraryPage + SectionGetFlags ${MigrateEmbyLibrary} $R0 + IntOp $R0 $R0 & ${SF_SELECTED} + IntCmp $R0 ${SF_SELECTED} show + + Abort ; Dont show the Emby folder selection window if Emby migrartion is not selected + + show: +FunctionEnd