diff --git a/bin-arm64/ffmpeg.exe b/bin-arm64/ffmpeg.exe new file mode 100644 index 0000000..fc5e61d Binary files /dev/null and b/bin-arm64/ffmpeg.exe differ diff --git a/bin-arm64/ffprobe.exe b/bin-arm64/ffprobe.exe new file mode 100644 index 0000000..cafed81 Binary files /dev/null and b/bin-arm64/ffprobe.exe differ diff --git a/bin-arm64/stremio-runtime.exe b/bin-arm64/stremio-runtime.exe new file mode 100644 index 0000000..825d98a Binary files /dev/null and b/bin-arm64/stremio-runtime.exe differ diff --git a/build-arm64.ps1 b/build-arm64.ps1 new file mode 100644 index 0000000..ec16187 --- /dev/null +++ b/build-arm64.ps1 @@ -0,0 +1,21 @@ +param ( + [String]$pw = $( Read-Host "Password" ) +) + +$thread = Start-ThreadJob -InputObject ($pw) -ScriptBlock { + $wshell = New-Object -ComObject wscript.shell; + $pw = "$($input)~" + while ($true) { + while ( -not $wshell.AppActivate("Token Logon")) { + Start-Sleep 1 + } + Start-Sleep 1 + $wshell.SendKeys($pw, $true) + Start-Sleep 1 + } +} + +cargo build --release --target aarch64-pc-windows-msvc +& "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" /DSIGN "/Sstremiosign=`$qsigntool.exe`$q sign /fd SHA256 /t http://timestamp.digicert.com /n `$qSmart Code OOD`$q `$f" "setup\Stremio-arm64.iss" + +Stop-Job -Job $thread diff --git a/build.rs b/build.rs index 445ee93..65bec33 100644 --- a/build.rs +++ b/build.rs @@ -42,10 +42,7 @@ fn main() { }; println!("cargo:rustc-env=ARCH={}", arch); println!("cargo:rustc-link-arg={}", flags); - println!("cargo:rerun-if-changed={}", archive); - { - let archive = fs::read(archive).unwrap(); - let target_dir = PathBuf::from("."); - zip_extract::extract(Cursor::new(archive), &target_dir, true).ok(); - } + let archive = fs::read(archive).unwrap(); + let target_dir = PathBuf::from("."); + zip_extract::extract(Cursor::new(archive), &target_dir, true).ok(); } diff --git a/images/StremioRuntime.ico b/images/StremioRuntime.ico new file mode 100644 index 0000000..1fe8434 Binary files /dev/null and b/images/StremioRuntime.ico differ diff --git a/setup/Stremio-arm64.iss b/setup/Stremio-arm64.iss new file mode 100644 index 0000000..9619984 --- /dev/null +++ b/setup/Stremio-arm64.iss @@ -0,0 +1,215 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +#define MyAppName "Stremio" +#define MyAppExeName "stremio-shell-ng.exe" +#define MyAppExeLocation SourcePath + "..\target\aarch64-pc-windows-msvc\release\" + MyAppExeName +#define MyAppVersion() GetVersionComponents(MyAppExeLocation, Local[0], Local[1], Local[2], Local[3]), \ + Str(Local[0]) + "." + Str(Local[1]) + "." + Str(Local[2]) + +#define MyAppPublisher "Smart Code OOD" +#define MyAppCopyright "Copyright © " + GetDateTimeString('yyyy', '', '') + " " + MyAppPublisher +#define MyAppURL "https://www.stremio.com/" +#define MyAppGoodbyeURL "https://www.strem.io/goodbye" +#define AssocTorrentExt ".torrent" +#define AssocTorrentKey StringChange(MyAppName, " ", "") + AssocTorrentExt +#define AssocTorrentDesc "Bittorrent seed file" + +#define public Dependency_NoExampleSetup +#include "CodeDependencies.iss" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{DD3870DA-AF3C-4C73-B010-72944AB610C6} +ArchitecturesAllowed=arm64 +AppName={#MyAppName} +AppVersion={#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppCopyright={#MyAppCopyright} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={autopf}\{#MyAppName} +SetupMutex=StremioShellNgSetupsMutex,Global\StremioShellNgSetupsMutex +; Remove the following line to run in administrative install mode (install for all users.) +PrivilegesRequired=lowest +DisableReadyPage=yes +DisableDirPage=yes +DisableProgramGroupPage=yes +; DisableFinishedPage=yes +ChangesAssociations=yes +OutputBaseFilename={#MyAppName}Setup-v{#MyAppVersion}_arm64 +OutputDir=.. +Compression=lzma +SolidCompression=yes +WizardStyle=modern +LanguageDetectionMethod=uilanguage +ShowLanguageDialog=auto +CloseApplications=yes +WizardImageFile={#SourcePath}..\images\windows-installer.bmp +WizardSmallImageFile={#SourcePath}..\images\windows-installer-header.bmp +SetupIconFile={#SourcePath}..\images\stremio.ico +UninstallDisplayIcon={app}\{#MyAppExeName},0 +#ifdef SIGN +SignTool=stremiosign +SignedUninstaller=yes +#endif + +[Code] +function InitializeSetup: Boolean; +begin + Dependency_AddWebView2; + Result := True; +end; + +function ShouldSkipPage(PageID: Integer): Boolean; +begin + { Hide finish page if run app is selected } + if (PageID = wpFinished) and WizardIsTaskSelected('runapp') then + Result := True + else + Result := False; +end; + +procedure CurPageChanged(CurPageID: Integer); +begin + case (CurPageID) of + wpSelectTasks: WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall); + wpFinished: WizardForm.NextButton.Caption := SetupMessage(msgButtonFinish); + else + WizardForm.NextButton.Caption := SetupMessage(msgButtonNext); + end; +end; + +procedure CurStepChanged(CurStep: TSetupStep); +var + ResultCode: Integer; +begin + if (CurStep = ssDone) and WizardIsTaskSelected('runapp') then + ExecAsOriginalUser(ExpandConstant('{app}\{#MyAppExeName}'), '', '', SW_SHOW, ewNoWait, ResultCode); +end; + +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +var + ErrorCode: Integer; +begin + case (CurUninstallStep) of + usPostUninstall: if MsgBox(ExpandConstant('{cm:RemoveDataFolder}'), mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES then + DelTree(ExpandConstant('{app}'), True, True, True); + usDone: ShellExec('', ExpandConstant('{#MyAppGoodbyeURL}'), '', '', SW_SHOW, ewNoWait, ErrorCode); + end; +end; + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" +Name: "armenian"; MessagesFile: "compiler:Languages\Armenian.isl" +Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" +Name: "bulgarian"; MessagesFile: "compiler:Languages\Bulgarian.isl" +Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl" +Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl" +Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" +Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl" +Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" +Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" +Name: "french"; MessagesFile: "compiler:Languages\French.isl" +Name: "german"; MessagesFile: "compiler:Languages\German.isl" +Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" +Name: "icelandic"; MessagesFile: "compiler:Languages\Icelandic.isl" +Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" +Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" +Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" +Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" +Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" +Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" +Name: "slovak"; MessagesFile: "compiler:Languages\Slovak.isl" +Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" +Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" +Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl" +Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl" + +[CustomMessages] +RemoveDataFolder=Remove all data and configuration? +english.RemoveDataFolder=Remove all data and configuration? +armenian.RemoveDataFolder=Հեռացնե՞լ բոլոր տվյալները և կոնֆիգուրացիան: +brazilianportuguese.RemoveDataFolder=Remover todos os dados e configuração? +bulgarian.RemoveDataFolder=Премахване на всички данни и конфигурация? +catalan.RemoveDataFolder=Vols suprimir totes les dades i la configuració? +corsican.RemoveDataFolder=Eliminate tutti i dati è a cunfigurazione? +czech.RemoveDataFolder=Odebrat všechna data a konfiguraci? +danish.RemoveDataFolder=Remove all data and configuration? +dutch.RemoveDataFolder=Remove all data and configuration? +finnish.RemoveDataFolder=Poistetaanko kaikki tiedot ja asetukset? +french.RemoveDataFolder=Supprimer toutes les données et la configuration ? +german.RemoveDataFolder=Alle Daten und Konfiguration entfernen? +hebrew.RemoveDataFolder=Remove all data and configuration? +icelandic.RemoveDataFolder=Fjarlægja öll gögn og stillingar? +italian.RemoveDataFolder=Rimuovere tutti i dati e la configurazione? +japanese.RemoveDataFolder=すべてのデータと構成を削除しますか? +norwegian.RemoveDataFolder=Vil du fjerne all data og konfigurasjon? +polish.RemoveDataFolder=Usunąć wszystkie dane i konfigurację? +portuguese.RemoveDataFolder=Remover todos os dados e configuração? +russian.RemoveDataFolder=Удалить все данные и конфигурацию? +slovak.RemoveDataFolder=Chcete odstrániť všetky údaje a konfiguráciu? +slovenian.RemoveDataFolder=Želite odstraniti vse podatke in konfiguracijo? +spanish.RemoveDataFolder=¿Eliminar todos los datos y la configuración? +turkish.RemoveDataFolder=Tüm veriler ve yapılandırma kaldırılsın mı? +ukrainian.RemoveDataFolder=Видалити всі дані та конфігурацію? + +[Tasks] +Name: "runapp"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}" +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}" +;Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked +Name: "assoctorrent"; Description: "Associate {#MyAppName} with .torrent files" + +[Files] +; NOTE: Don't use "Flags: ignoreversion" on any shared system files +Source: "{#MyAppExeLocation}"; DestDir: "{app}"; Flags: ignoreversion signonce +Source: "{#SourcePath}..\libmpv-2.dll"; DestDir: "{app}"; Flags: ignoreversion signonce +Source: "{#SourcePath}..\bin-arm64\ffmpeg.exe"; DestDir: "{app}"; Flags: ignoreversion signonce +Source: "{#SourcePath}..\bin-arm64\ffprobe.exe"; DestDir: "{app}"; Flags: ignoreversion signonce +Source: "{#SourcePath}..\bin-arm64\stremio-runtime.exe"; DestDir: "{app}"; Flags: ignoreversion signonce +Source: "{#SourcePath}..\server.js"; DestDir: "{app}"; Flags: ignoreversion + +[Registry] +; Associate .torrent files if assoctorrent task is selected +Root: HKA; Subkey: "Software\Classes\{#AssocTorrentExt}}\OpenWithProgids"; ValueType: string; ValueName: "{#AssocTorrentKey}"; ValueData: ""; Flags: uninsdeletevalue; Tasks: assoctorrent +Root: HKA; Subkey: "Software\Classes\{#AssocTorrentKey}"; ValueType: string; ValueName: ""; ValueData: "{#AssocTorrentDesc}"; Flags: uninsdeletekey; Tasks: assoctorrent +Root: HKA; Subkey: "Software\Classes\{#AssocTorrentKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Flags: uninsdeletekey; Tasks: assoctorrent +Root: HKA; Subkey: "Software\Classes\{#AssocTorrentKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Flags: uninsdeletekey; Tasks: assoctorrent + +; stremio: protocol +Root: HKA; Subkey: "Software\Classes\stremio"; ValueType: string; ValueName: ""; ValueData: "URL:Stremio Protocol"; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\stremio"; ValueType: string; ValueName: "URL Protocol"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\stremio\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\stremio\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Flags: uninsdeletekey + +; magnet: protocol +Root: HKA; Subkey: "Software\Classes\magnet"; ValueType: string; ValueName: ""; ValueData: "URL:BitTorrent magnet"; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\magnet"; ValueType: string; ValueName: "URL Protocol"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\magnet\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\magnet\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Flags: uninsdeletekey + +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".torrent"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".avi"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".asf"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".mkv"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".mp4"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".mov"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".ogg"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".ogv"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".wmv"; ValueData: ""; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".srt"; ValueData: ""; Flags: uninsdeletekey + +[Icons] +Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +; This is used if the desktop shortcut is created by the [run] section. +; [UninstallDelete] +; Type: files; Name: "{autodesktop}\{#MyAppName}.lnk" + +; We don't use the run section as the .torrent association is very hard to handle +; [Run] +; Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent +; Filename: "cmd"; Parameters: "/c copy ""{autoprograms}\{#MyAppName}.lnk"" ""{autodesktop}"""; Description: "{cm:CreateDesktopIcon}"; Flags: postinstall skipifsilent shellexec runhidden waituntilterminated runascurrentuser diff --git a/setup/Stremio.iss b/setup/Stremio.iss index 884b68e..999c29a 100644 --- a/setup/Stremio.iss +++ b/setup/Stremio.iss @@ -38,7 +38,7 @@ DisableDirPage=yes DisableProgramGroupPage=yes ; DisableFinishedPage=yes ChangesAssociations=yes -OutputBaseFilename={#MyAppName}Setup-v{#MyAppVersion} +OutputBaseFilename={#MyAppName}Setup-v{#MyAppVersion}_x64 OutputDir=.. Compression=lzma SolidCompression=yes