fix: iTunes Japanese artist lookup + sort tag editing in info modal

- views.js: skip ASCII word-match when artist name is non-ASCII so Japanese
  artists (e.g. ヨルシカ) resolve correctly to an iTunes artist ID
- index.html + styles.css: collapsible Sort-Tags section in edit modal
- ui.js: pre-fill sort fields from romaji index; include in save body
- novasonic-server.js: accept manual titleSort/artistSort/albumArtistSort/albumSort
  overrides; fall back to auto-computed romaji when not provided

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Sonnet 4.6 committed 2026-05-25 19:49:47 +02:00
1 parent 1c0d3eb4cc
commit 5dda1a7101
5 files changed
+54 -22

No files matched your search

+30 -14
View File
@@ -1,6 +1,6 @@
import { S } from './state.js';
import { esc, formatDur, toast } from './utils.js';
import { api, coverUrl, ndAuth, fetchRomajiIndex, romajiConvert } from './api.js';
import { api, coverUrl, ndAuth, fetchRomajiIndex, romajiConvert, romajiLookup } from './api.js';
import { THEMES, applyTheme, getCurrentThemeId } from './themes.js';
// Circular imports — safe (only used inside function bodies)
import { playQueue, dlSongLocal, toggleStar, togglePlay, renderQueue, syncNpStar, updateStarBtn, npToggleStar, playCurrent, _syncNpDirect, setPlayIcon, nativeInsertAt, refreshDisplayMode } from './player.js';
@@ -309,6 +309,11 @@ export async function showSongInfo(s) {
document.getElementById('ie-track').value = full.track || '';
document.getElementById('ie-disc').value = full.discNumber || '';
document.getElementById('ie-totaltracks').value = full.albumSongCount || '';
const _rm2 = romajiLookup(full.id);
document.getElementById('ie-titlesort').value = _rm2?.titleRomaji || '';
document.getElementById('ie-artistsort').value = _rm2?.artistRomaji || '';
document.getElementById('ie-albumartistsort').value = _rm2?.artistRomaji || '';
document.getElementById('ie-albumsort').value = _rm2?.albumRomaji || '';
}
}
} catch {}
@@ -351,6 +356,13 @@ export function toggleInfoEdit() {
document.getElementById('ie-disc').value = s.discNumber || '';
document.getElementById('ie-totaltracks').value = s.albumSongCount || '';
// Sort tags — pre-fill from romaji index when available
const _rm = romajiLookup(s.id);
document.getElementById('ie-titlesort').value = _rm?.titleRomaji || '';
document.getElementById('ie-artistsort').value = _rm?.artistRomaji || '';
document.getElementById('ie-albumartistsort').value = _rm?.artistRomaji || '';
document.getElementById('ie-albumsort').value = _rm?.albumRomaji || '';
// Art preview — use existing cover
const cv = coverUrl(s.coverArt, 200);
const prev = document.getElementById('info-edit-art-preview');
@@ -417,19 +429,23 @@ export async function saveMetadata() {
status.textContent = '💾 Speichern…';
const body = {
ndUrl: S.cfg.url,
user: S.cfg.user,
pass: S.cfg.pass,
songId: s.id,
title: document.getElementById('ie-title').value || undefined,
artist: document.getElementById('ie-artist').value || undefined,
albumArtist: document.getElementById('ie-albumartist').value || undefined,
album: document.getElementById('ie-album').value || undefined,
genre: document.getElementById('ie-genre').value || undefined,
year: parseInt(document.getElementById('ie-year').value) || undefined,
trackNum: parseInt(document.getElementById('ie-track').value) || undefined,
totalTracks: parseInt(document.getElementById('ie-totaltracks').value) || undefined,
discNum: parseInt(document.getElementById('ie-disc').value) || undefined,
ndUrl: S.cfg.url,
user: S.cfg.user,
pass: S.cfg.pass,
songId: s.id,
title: document.getElementById('ie-title').value || undefined,
artist: document.getElementById('ie-artist').value || undefined,
albumArtist: document.getElementById('ie-albumartist').value || undefined,
album: document.getElementById('ie-album').value || undefined,
genre: document.getElementById('ie-genre').value || undefined,
year: parseInt(document.getElementById('ie-year').value) || undefined,
trackNum: parseInt(document.getElementById('ie-track').value) || undefined,
totalTracks: parseInt(document.getElementById('ie-totaltracks').value) || undefined,
discNum: parseInt(document.getElementById('ie-disc').value) || undefined,
titleSort: document.getElementById('ie-titlesort').value || undefined,
artistSort: document.getElementById('ie-artistsort').value || undefined,
albumArtistSort:document.getElementById('ie-albumartistsort').value || undefined,
albumSort: document.getElementById('ie-albumsort').value || undefined,
};
if (S._infoArtData?.base64) {
body.artworkBase64 = S._infoArtData.base64;