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:
1 parent
b924f01b2a
commit
36a0b38eca
9 files changed
+116
-14
No files matched your search
+31
-10
@@ -99,19 +99,40 @@ export async function fetchRomajiIndex() {
|
||||
export function invalidateRomajiIndex() { _romajiIndex = null; _romajiMap = null; _artistRomajiMap = null; }
|
||||
|
||||
// ─── ROMAJI OVERRIDES ───
|
||||
// Manual kanji → romaji corrections stored in localStorage. Always take priority over auto-conversion.
|
||||
// Stored server-side (shared across all clients). Cached in memory per session.
|
||||
let _overridesCache = null; // null = not loaded yet
|
||||
|
||||
export function getRomajiOverrides() {
|
||||
try { return JSON.parse(localStorage.getItem('ns_romaji_overrides') || '{}'); } catch { return {}; }
|
||||
return _overridesCache || {};
|
||||
}
|
||||
export function setRomajiOverride(kanji, romaji) {
|
||||
const o = getRomajiOverrides();
|
||||
if (romaji?.trim()) o[kanji.trim()] = romaji.trim(); else delete o[kanji.trim()];
|
||||
localStorage.setItem('ns_romaji_overrides', JSON.stringify(o));
|
||||
|
||||
export async function loadRomajiOverrides() {
|
||||
if (!S.cfg?.backendUrl) return;
|
||||
try {
|
||||
const r = await fetch(`${S.cfg.backendUrl}/api/romaji-overrides`);
|
||||
_overridesCache = r.ok ? await r.json() : {};
|
||||
} catch { _overridesCache = {}; }
|
||||
}
|
||||
export function removeRomajiOverride(kanji) {
|
||||
const o = getRomajiOverrides();
|
||||
delete o[kanji];
|
||||
localStorage.setItem('ns_romaji_overrides', JSON.stringify(o));
|
||||
|
||||
export async function setRomajiOverride(kanji, romaji) {
|
||||
if (!S.cfg?.backendUrl || !kanji?.trim()) return;
|
||||
try {
|
||||
await fetch(`${S.cfg.backendUrl}/api/romaji-overrides`, {
|
||||
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ kanji: kanji.trim(), romaji: romaji?.trim() || '' }),
|
||||
});
|
||||
if (!_overridesCache) _overridesCache = {};
|
||||
if (romaji?.trim()) _overridesCache[kanji.trim()] = romaji.trim();
|
||||
else delete _overridesCache[kanji.trim()];
|
||||
} catch (e) { console.warn('setRomajiOverride failed:', e); }
|
||||
}
|
||||
|
||||
export async function removeRomajiOverride(kanji) {
|
||||
if (!S.cfg?.backendUrl || !kanji) return;
|
||||
try {
|
||||
await fetch(`${S.cfg.backendUrl}/api/romaji-overrides/${encodeURIComponent(kanji)}`, { method: 'DELETE' });
|
||||
if (_overridesCache) delete _overridesCache[kanji];
|
||||
} catch (e) { console.warn('removeRomajiOverride failed:', e); }
|
||||
}
|
||||
|
||||
export function dispArtistById(id, name) {
|
||||
|
||||
Reference in new issue
Block a user