From 0adf4b32644bdfd95047e7879c578bed4e45b008 Mon Sep 17 00:00:00 2001 From: neoapps-dev Date: Tue, 11 Aug 2026 02:10:11 +0300 Subject: [PATCH] feat: android! --- .github/workflows/experimental.yml | 3 + .github/workflows/publish.yml | 3 + package.json | 1 + scripts/download-android-assets.mjs | 87 +++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 scripts/download-android-assets.mjs diff --git a/.github/workflows/experimental.yml b/.github/workflows/experimental.yml index 36879a7..3a8bb8d 100644 --- a/.github/workflows/experimental.yml +++ b/.github/workflows/experimental.yml @@ -208,6 +208,9 @@ jobs: - name: install frontend dependencies run: pnpm install + - name: download android bundled assets + run: pnpm android:assets + - name: restore gradle wrapper jar run: | VER=$(sed -n 's/.*gradle-\([0-9][0-9.]*\)-bin\.zip.*/\1/p' src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9513ea8..6b48f19 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -180,6 +180,9 @@ jobs: - name: install frontend dependencies run: pnpm install + - name: download android bundled assets + run: pnpm android:assets + - name: restore gradle wrapper jar run: | VER=$(sed -n 's/.*gradle-\([0-9][0-9.]*\)-bin\.zip.*/\1/p' src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties) diff --git a/package.json b/package.json index 86f812c..e4f62a2 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "tauri": "tauri", "tauri:build": "tauri build && pnpm run post-build:macos", "post-build:macos": "bash src-tauri/scripts/post-build-macos.sh", + "android:assets": "node scripts/download-android-assets.mjs", "flatpak": "flatpak-builder --user --install-deps-from=flathub --repo=emerald-repo --force-clean build-flatpak flatpak/io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher.yml && flatpak build-bundle emerald-repo emerald.flatpak io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher" }, "dependencies": { diff --git a/scripts/download-android-assets.mjs b/scripts/download-android-assets.mjs new file mode 100644 index 0000000..49ef2bb --- /dev/null +++ b/scripts/download-android-assets.mjs @@ -0,0 +1,87 @@ +#!/usr/bin/env node +import { + createWriteStream, + createReadStream, + existsSync, + rename, +} from "node:fs"; +import { mkdir } from "node:fs/promises"; +import { createHash } from "node:crypto"; +import { fileURLToPath } from "node:url"; +import path from "node:path"; +const RELEASE_TAG = "android-assets-v1"; +const REPO = "LCE-Hub/LCE-Emerald-Launcher"; +const ASSET_DIR = fileURLToPath( + new URL("../src-tauri/gen/android/app/src/main/assets/", import.meta.url), +); + +const ASSETS = [ + { + file: "imagefs.tar.zst", + sha256: "7838756e6a05c91afff68f4bf12aa2780f815877753f8dd354e203e99b9caf8a", + }, + { + file: "proton-11.0-arm64ec.tar.zst", + sha256: "ceb768396c2d44256518f94ae236f0c1f40738cf050a52e990e2fef67ff161df", + }, +]; + +function sha256File(file) { + return new Promise((resolve, reject) => { + const hash = createHash("sha256"); + const stream = createReadStream(file); + stream.on("data", (chunk) => hash.update(chunk)); + stream.on("end", () => resolve(hash.digest("hex"))); + stream.on("error", reject); + }); +} + +async function download(url, dest) { + const res = await fetch(url, { redirect: "follow" }); + if (!res.ok) { + throw new Error(`HTTP ${res.status} ${res.statusText} for ${url}`); + } + const fileStream = createWriteStream(dest); + await new Promise((resolve, reject) => { + res.body.pipe(fileStream); + res.body.on("error", reject); + fileStream.on("finish", resolve); + fileStream.on("error", reject); + }); +} + +let failed = false; +for (const asset of ASSETS) { + const target = path.join(ASSET_DIR, asset.file); + const exists = existsSync(target); + if (exists) { + const actual = await sha256File(target); + if (actual === asset.sha256) { + console.log(`ok ${asset.file} (up to date)`); + continue; + } + console.error( + `error ${asset.file}: sha256 mismatch (expected ${asset.sha256}, got ${actual}); delete it and rerun`, + ); + failed = true; + continue; + } + + const url = `https://github.com/${REPO}/releases/download/${RELEASE_TAG}/${asset.file}`; + console.log(`get ${asset.file} <- ${url}`); + await mkdir(path.dirname(target), { recursive: true }); + const tmp = target + ".part"; + await download(url, tmp); + const actual = await sha256File(tmp); + if (actual !== asset.sha256) { + console.error( + `error ${asset.file}: downloaded sha256 mismatch (expected ${asset.sha256}, got ${actual})`, + ); + failed = true; + continue; + } + await rename(tmp, target); + console.log(`okay ${asset.file} (downloaded)`); +} + +process.exit(failed ? 1 : 0);