feat: server-side romaji overrides (shared list); preload ExoPlayer from SharedPreferences on cold start

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Sonnet 4.6 committed 2026-06-05 10:47:25 +02:00
1 parent b924f01b2a
commit 36a0b38eca
9 files changed
+116 -14

No files matched your search

+38
View File
@@ -188,6 +188,44 @@ app.delete('/api/romaji-index', (req, res) => {
res.json({ ok: true });
});
// ─── ROMAJI OVERRIDES (server-side, shared across all clients) ───────────────
const _overridesFile = path.join(CONFIG.dataPath, 'romaji-overrides.json');
function _loadOverrides() {
try { return JSON.parse(fs.readFileSync(_overridesFile, 'utf8')); } catch { return {}; }
}
function _saveOverrides(map) {
try {
fs.mkdirSync(CONFIG.dataPath, { recursive: true });
fs.writeFileSync(_overridesFile, JSON.stringify(map, null, 2), 'utf8');
} catch (e) { console.error('Failed to save romaji overrides:', e.message); }
}
// GET /api/romaji-overrides — returns the full kanji→romaji map
app.get('/api/romaji-overrides', (_req, res) => res.json(_loadOverrides()));
// POST /api/romaji-overrides — upsert { kanji, romaji }
app.post('/api/romaji-overrides', (req, res) => {
const { kanji, romaji } = req.body;
if (!kanji?.trim()) return res.status(400).json({ error: 'kanji required' });
const map = _loadOverrides();
if (romaji?.trim()) map[kanji.trim()] = romaji.trim();
else delete map[kanji.trim()];
_saveOverrides(map);
clearRomajiCache(); // rebuild romaji index so display picks up the change
res.json({ ok: true });
});
// DELETE /api/romaji-overrides/:kanji — remove one entry
app.delete('/api/romaji-overrides/:kanji', (req, res) => {
const kanji = decodeURIComponent(req.params.kanji);
const map = _loadOverrides();
delete map[kanji];
_saveOverrides(map);
clearRomajiCache();
res.json({ ok: true });
});
// POST /api/romaji-convert — convert an array of strings to romaji
app.post('/api/romaji-convert', (req, res) => {
const { texts } = req.body;