mirror of
https://github.com/Stremio/stremio-shell-ng.git
synced 2026-01-11 22:40:32 +00:00
Compare commits
4 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f1aeb06c0f | ||
|
|
29ae6ed80d | ||
|
|
b8a0345b0d | ||
|
|
0a08fed2cb |
13 changed files with 1393 additions and 1141 deletions
|
|
@ -1,4 +0,0 @@
|
|||
[target.x86_64-pc-windows-msvc]
|
||||
rustflags = ["-C", "link-args=/LIBPATH:.\\mpv-x64"]
|
||||
[target.aarch64-pc-windows-msvc]
|
||||
rustflags = ["-C", "link-args=/LIBPATH:.\\mpv-arm64"]
|
||||
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -1598,7 +1598,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "stremio-shell-ng"
|
||||
version = "5.0.15"
|
||||
version = "5.0.16"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags 2.4.2",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "stremio-shell-ng"
|
||||
version = "5.0.15"
|
||||
version = "5.0.16"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
|
|
|
|||
BIN
bin-arm64/ffmpeg.exe
Normal file
BIN
bin-arm64/ffmpeg.exe
Normal file
Binary file not shown.
BIN
bin-arm64/ffprobe.exe
Normal file
BIN
bin-arm64/ffprobe.exe
Normal file
Binary file not shown.
BIN
bin-arm64/stremio-runtime.exe
Normal file
BIN
bin-arm64/stremio-runtime.exe
Normal file
Binary file not shown.
21
build-arm64.ps1
Normal file
21
build-arm64.ps1
Normal file
|
|
@ -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
|
||||
9
build.rs
9
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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,10 @@ const DOWNLOAD_ENDPOINT = "https://dl.strem.io/stremio-shell-ng/";
|
|||
const OS_EXT = {
|
||||
".exe": "windows",
|
||||
};
|
||||
const ARCH = [
|
||||
"x64",
|
||||
"arm64",
|
||||
];
|
||||
const VERSION_REGEX = /^v(\d+\.\d+\.\d+).*$/;
|
||||
|
||||
const supportedArguments = Object.freeze({
|
||||
|
|
@ -99,7 +103,7 @@ const parseArguments = () => {
|
|||
return acc;
|
||||
}, {});
|
||||
try {
|
||||
for (let i = 2; i < process.argv.length; i++) {
|
||||
for (let i = 2;i < process.argv.length;i++) {
|
||||
const arg = process.argv[i];
|
||||
if (arg.startsWith("--")) {
|
||||
// Stop processing arguments after --
|
||||
|
|
@ -146,6 +150,7 @@ const s3Cp = (src, dest) => s3Cmd(`cp --acl public-read ${src} ${dest}`);
|
|||
|
||||
// Downloads a file from S3 and returns a hash of it
|
||||
const s3Hash = (path) => {
|
||||
log("Downloading ", path)
|
||||
return new Promise((resolve, reject) => {
|
||||
const hash = createHash("sha256");
|
||||
https
|
||||
|
|
@ -167,12 +172,17 @@ const parseS3Listing = (tag) => (line) => {
|
|||
) || {}
|
||||
).groups;
|
||||
if (!path) return;
|
||||
const os = OS_EXT[posix.extname(path.name)];
|
||||
const ext = posix.extname(path.name);
|
||||
const os = OS_EXT[ext];
|
||||
const fn = posix.basename(path.name, ext)
|
||||
if (!os) return;
|
||||
const arch = ARCH.find(s => fn.endsWith('_' + s))
|
||||
return {
|
||||
name: path.name,
|
||||
url: `${DOWNLOAD_ENDPOINT + tag}/${path.name}`,
|
||||
os,
|
||||
arch,
|
||||
tag,
|
||||
date: new Date(path.date),
|
||||
};
|
||||
};
|
||||
|
|
@ -185,6 +195,12 @@ const getFilesForTag = async (tag) =>
|
|||
})
|
||||
).filter((file) => file);
|
||||
|
||||
const groupBy = (prop, groups, item) => {
|
||||
Array.isArray(groups[item[prop]]) ? groups[item[prop]].push(item) : groups[item[prop]] = [item]
|
||||
return groups
|
||||
}
|
||||
|
||||
|
||||
const calculateFileChecksums = async (files) =>
|
||||
Promise.all(
|
||||
files.map(async (file) => {
|
||||
|
|
@ -197,6 +213,50 @@ const calculateFileChecksums = async (files) =>
|
|||
})
|
||||
);
|
||||
|
||||
const uploadDescriptor = async (descriptor, release, force, dry_run) => {
|
||||
const suffix = descriptor.arch ? '_' + descriptor.arch : ''
|
||||
const desc_name = descriptor.tag + suffix + ".json";
|
||||
const s3_rc_desc_path = S3_VERSIONS_RC_PATH + desc_name;
|
||||
const s3_dest_path = release
|
||||
? S3_VERSIONS_PATH + desc_name
|
||||
: s3_rc_desc_path;
|
||||
const rc_uploaded = await s3Ls(s3_dest_path).then((listing) => !!listing)
|
||||
if (!force && rc_uploaded) {
|
||||
log(`${descriptor.arch || 'noarch'} ${args.release ? "" : "RC "}escriptor for tag ${descriptor.tag} already exists. Skipping upload.`)
|
||||
return
|
||||
}
|
||||
if (
|
||||
release &&
|
||||
!force &&
|
||||
rc_uploaded
|
||||
) {
|
||||
log(
|
||||
"Descriptor for tag",
|
||||
tag,
|
||||
"already exists in the RC folder. Moving it to the releases folder"
|
||||
);
|
||||
if (!dry_run) await s3Cp(s3_rc_desc_path, s3_dest_path);
|
||||
log("Done");
|
||||
return;
|
||||
}
|
||||
|
||||
const descriptor_path = `${tmpdir()}/${desc_name}`;
|
||||
const descriptor_text = JSON.stringify(descriptor, null, 2) + "\n";
|
||||
log("Writting descriptor to", descriptor_path);
|
||||
if (dry_run) log(descriptor_text)
|
||||
else fs.writeFileSync(descriptor_path, descriptor_text);
|
||||
|
||||
log(`Uploading ${descriptor.arch || 'noarch'} ${release ? "" : "RC "}descriptor to S3`);
|
||||
try {
|
||||
if (!dry_run) await s3Cp(descriptor_path, s3_dest_path);
|
||||
} finally {
|
||||
// Clean up the temporary file even if the upload fails
|
||||
log("Cleaning up", descriptor_path);
|
||||
if (!dry_run) fs.unlinkSync(descriptor_path);
|
||||
}
|
||||
log("Done uploading", descriptor_path, "to", s3_dest_path);
|
||||
};
|
||||
|
||||
// Generates the descriptor for a given tag
|
||||
// If no tag is provided, it will get the latest tag
|
||||
// An example descriptor:
|
||||
|
|
@ -208,92 +268,58 @@ const calculateFileChecksums = async (files) =>
|
|||
// "files": [
|
||||
// {
|
||||
// "name": "StremioSetup.exe",
|
||||
// "url": "https://s3-eu-west-1.amazonaws.com/stremio-artifacts/stremio-shell-ng/v0.1.0-new-setup/StremioSetup.exe",
|
||||
// "url": "https://s3-eu-west-1.amazonaws.com/stremio-artifacts/stremio-shell-ng/v0.1.0-new-setup/Stremio.exe",
|
||||
// "checksum": "0ff94905df4d94233d14f48ed68e31664a478a29204be4c7867c2389929c6ac3",
|
||||
// "os": "windows"
|
||||
// "os": "macos"
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
|
||||
const generateDescriptor = async (args) => {
|
||||
const generateDescriptors = async (args) => {
|
||||
let tag = args.tag;
|
||||
if (!tag) {
|
||||
log("Obtaining the latest tag");
|
||||
tag = await s3Ls(S3_BUCKET_PATH).then((listing) => {
|
||||
// get the first line, remove the DIR prefix, and get the basename
|
||||
// get the last line, remove the DIR prefix, and get the basename
|
||||
// which is the tag
|
||||
const first_path = listing.replace(/^\s+\w+\s+/gm, '').split('\n').find(line => line.match(VERSION_REGEX));
|
||||
return posix.basename(first_path);
|
||||
const ver_path = listing.replace(/^\s+\w+\s+/gm, '').split('\n').reverse().find(line => line.match(VERSION_REGEX));
|
||||
return posix.basename(ver_path);
|
||||
});
|
||||
}
|
||||
const desc_name = tag + ".json";
|
||||
const s3_rc_desc_path = S3_VERSIONS_RC_PATH + desc_name;
|
||||
const s3_dest_path = args.release
|
||||
? S3_VERSIONS_PATH + desc_name
|
||||
: s3_rc_desc_path;
|
||||
if (!args.force && await s3Ls(s3_dest_path).then((listing) => !!listing)) {
|
||||
throw new Error(
|
||||
`${args.release ? "" : "RC "}Descriptor for tag ${tag} already exists`
|
||||
);
|
||||
}
|
||||
if (
|
||||
args.release &&
|
||||
!args.force &&
|
||||
(await s3Ls(s3_rc_desc_path).then((listing) => !!listing))
|
||||
) {
|
||||
log(
|
||||
"Descriptor for tag",
|
||||
tag,
|
||||
"already exists in the RC folder. Moving it to the releases folder"
|
||||
);
|
||||
if (!args.dry_run) await s3Cp(s3_rc_desc_path, s3_dest_path);
|
||||
log("Done");
|
||||
return;
|
||||
}
|
||||
|
||||
log("Getting files for tag", tag);
|
||||
if (!tag) throw new Error("No tag found");
|
||||
const version = (tag.match(VERSION_REGEX) || [])[1];
|
||||
if (!version) throw new Error("No valid version found");
|
||||
const file_listing = await getFilesForTag(tag);
|
||||
// We need at least one file to extract the release date
|
||||
if (!file_listing.length) throw new Error("No files found");
|
||||
if (args.wait_all && file_listing.length < Object.keys(OS_EXT).length) {
|
||||
log(
|
||||
`Not all files are uploaded yet. Rerun this script after ${Object.keys(OS_EXT).length - file_listing.length
|
||||
} more are uploaded`
|
||||
);
|
||||
return;
|
||||
}
|
||||
const files = await calculateFileChecksums(file_listing);
|
||||
const descriptor = {
|
||||
version,
|
||||
tag,
|
||||
released: file_listing[0].date.toISOString(),
|
||||
files,
|
||||
};
|
||||
const descriptor_text = JSON.stringify(descriptor, null, 2) + "\n";
|
||||
if (args.dry_run) {
|
||||
process.stdout.write(descriptor_text);
|
||||
return;
|
||||
}
|
||||
const arch_listing = (await getFilesForTag(tag)).reduce(groupBy.bind(null, 'arch'), {});
|
||||
(await Promise.all(Object.keys(arch_listing).map(async arch => {
|
||||
const file_listing = arch_listing[arch]
|
||||
// We need at least one file to extract the release date
|
||||
if (!file_listing.length) throw new Error("No files found");
|
||||
|
||||
const descriptor_path = `${tmpdir()}/${desc_name}`;
|
||||
log("Writting descriptor to", descriptor_path);
|
||||
fs.writeFileSync(descriptor_path, descriptor_text);
|
||||
|
||||
log(`Uploading ${args.release ? "" : "RC "}descriptor to S3`);
|
||||
try {
|
||||
await s3Cp(descriptor_path, s3_dest_path);
|
||||
} finally {
|
||||
// Clean up the temporary file even if the upload fails
|
||||
log("Cleaning up");
|
||||
fs.unlinkSync(descriptor_path);
|
||||
}
|
||||
log("Done");
|
||||
const files = await calculateFileChecksums(file_listing);
|
||||
const descriptor = {
|
||||
version,
|
||||
tag,
|
||||
released: file_listing[0].date.toISOString(),
|
||||
arch: file_listing[0].arch,
|
||||
files: files.map(f => ({
|
||||
url: f.url,
|
||||
checksum: f.checksum,
|
||||
os: f.os,
|
||||
date: f.date.toISOString(),
|
||||
})),
|
||||
};
|
||||
uploadDescriptor(descriptor, args.release, args.force, args.dry_run);
|
||||
if (descriptor.arch == 'x64') {
|
||||
descriptor.arch = '';
|
||||
uploadDescriptor(descriptor, args.release, args.force, args.dry_run);
|
||||
}
|
||||
return descriptor
|
||||
})));
|
||||
};
|
||||
|
||||
generateDescriptor(args).catch((err) => {
|
||||
generateDescriptors(args).catch((err) => {
|
||||
console.error(err.message);
|
||||
process.exit(1);
|
||||
});
|
||||
|
|
|
|||
BIN
images/StremioRuntime.ico
Normal file
BIN
images/StremioRuntime.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 105 KiB |
215
setup/Stremio-arm64.iss
Normal file
215
setup/Stremio-arm64.iss
Normal file
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue