feat: romaji artist names, Apple Music autofill, romaji index invalidation
- Artist grid and detail header now show romaji names when toggle is on. Builds a Map<artistId, artistRomaji> from the existing song romaji index so no extra API call is needed. - Apple Music autofill button added to edit modal next to MusicBrainz. Reuses the existing lookupItunesTrackMeta backend function via a new GET /api/itunes/lookup endpoint — fills album, year, genre, track#, and cover art. - Romaji index is invalidated after every successful download so newly added songs appear with correct sort tags without requiring a page reload. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
212491aa89
commit
b7afa19f70
6 files changed
+79
-9
No files matched your search
+14
-3
@@ -53,11 +53,17 @@ export async function ndAuth() {
|
||||
// Fetched once per session from the backend, cached in memory.
|
||||
let _romajiIndex = null;
|
||||
let _romajiMap = null; // Map<songId, { titleRomaji, artistRomaji, albumRomaji }>
|
||||
let _artistRomajiMap = null; // Map<artistId, artistRomaji>
|
||||
let _romajiIndexFetch = null; // in-flight promise dedup
|
||||
|
||||
function _buildRomajiMap(idx) {
|
||||
const m = new Map();
|
||||
if (Array.isArray(idx)) idx.forEach(e => m.set(String(e.id), e));
|
||||
const m = new Map();
|
||||
const am = new Map();
|
||||
if (Array.isArray(idx)) idx.forEach(e => {
|
||||
m.set(String(e.id), e);
|
||||
if (e.artistId && e.artistRomaji) am.set(String(e.artistId), e.artistRomaji);
|
||||
});
|
||||
_artistRomajiMap = am;
|
||||
return m;
|
||||
}
|
||||
|
||||
@@ -73,7 +79,12 @@ export async function fetchRomajiIndex() {
|
||||
return _romajiIndexFetch;
|
||||
}
|
||||
|
||||
export function invalidateRomajiIndex() { _romajiIndex = null; _romajiMap = null; }
|
||||
export function invalidateRomajiIndex() { _romajiIndex = null; _romajiMap = null; _artistRomajiMap = null; }
|
||||
|
||||
export function dispArtistById(id, name) {
|
||||
if (!S.cfg.showRomaji || !_artistRomajiMap) return name || '';
|
||||
return _artistRomajiMap.get(String(id)) || name || '';
|
||||
}
|
||||
|
||||
// Synchronous lookup — returns index entry for a song ID, or null if not in index.
|
||||
export function romajiLookup(id) { return _romajiMap?.get(String(id)) ?? null; }
|
||||
|
||||
Reference in new issue
Block a user