1
0

Refactor how NickelMenu is set up
All checks were successful
Build and test project / build-and-test (push) Successful in 1m32s

This commit is contained in:
2026-03-21 17:57:04 +01:00
parent 6f902090c1
commit 7b62c2e166
27 changed files with 553 additions and 404 deletions

View File

@@ -0,0 +1,42 @@
import JSZip from 'jszip';
export default {
id: 'koreader',
title: 'Install KOReader',
description: 'Installs KOReader, an alternative e-book reader with advanced features like PDF reflow, customizable fonts, and more.',
default: false,
available: false, // set to true at runtime if KOReader assets exist
async install(ctx) {
ctx.progress('Fetching KOReader release info...');
const metaResp = await fetch('/koreader/release.json');
if (!metaResp.ok) throw new Error('KOReader assets not available (run koreader/setup.sh)');
const meta = await metaResp.json();
ctx.progress('Downloading KOReader ' + meta.version + '...');
const zipResp = await fetch('/koreader/koreader-kobo.zip');
if (!zipResp.ok) throw new Error('Failed to download KOReader: HTTP ' + zipResp.status);
const zip = await JSZip.loadAsync(await zipResp.arrayBuffer());
ctx.progress('Extracting KOReader...');
const files = [];
for (const [relativePath, entry] of Object.entries(zip.files)) {
if (entry.dir) continue;
const devicePath = relativePath.startsWith('koreader/')
? '.adds/' + relativePath
: '.adds/koreader/' + relativePath;
files.push({
path: devicePath,
data: new Uint8Array(await entry.async('arraybuffer')),
});
}
// Add NickelMenu launcher config
files.push({
path: '.adds/nm/koreader',
data: 'menu_item:main:KOReader:cmd_spawn:quiet:exec /mnt/onboard/.adds/koreader/koreader.sh\n',
});
return files;
},
};