fix: romaji override delete button (JSON.stringify breaks HTML attr); fix file stem search for en-dash track prefixes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
7496c28663
commit
ff3bb782d3
2 files changed
+18
-6
No files matched your search
@@ -95,19 +95,31 @@ function _findFileInDir(dir, basename) {
|
|||||||
// Convention: MusicRoot/AlbumArtist/Album/{01 - }Artist - Title.ext
|
// Convention: MusicRoot/AlbumArtist/Album/{01 - }Artist - Title.ext
|
||||||
// The title stem is everything after the optional "NN - Artist - " prefix.
|
// The title stem is everything after the optional "NN - Artist - " prefix.
|
||||||
// We match any audio file whose stem ends with the same title words.
|
// We match any audio file whose stem ends with the same title words.
|
||||||
|
// Normalize a file stem for loose matching:
|
||||||
|
// 1. Strip compound track prefixes like "01-15 – " or "01 - " (handles en-dash, em-dash, hyphen)
|
||||||
|
// 2. Normalize all dash variants (en-dash, em-dash) to " - "
|
||||||
|
function _normStem(s) {
|
||||||
|
return s
|
||||||
|
.replace(/^\d[\d\-–—]*\s*[-–—]\s*/, '') // strip leading "01-15 – " or "01 - "
|
||||||
|
.replace(/\s*[–—]\s*/g, ' - '); // normalize remaining en/em-dash to " - "
|
||||||
|
}
|
||||||
|
|
||||||
function _findFileByStem(dir, titleStem, depth = 0) {
|
function _findFileByStem(dir, titleStem, depth = 0) {
|
||||||
if (depth > 4) return null;
|
if (depth > 4) return null;
|
||||||
|
const normTitle = _normStem(titleStem);
|
||||||
try {
|
try {
|
||||||
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
||||||
if (entry.isDirectory()) {
|
if (entry.isDirectory()) {
|
||||||
const found = _findFileByStem(path.join(dir, entry.name), titleStem, depth + 1);
|
const found = _findFileByStem(path.join(dir, entry.name), titleStem, depth + 1);
|
||||||
if (found) return found;
|
if (found) return found;
|
||||||
} else if (AUDIO_EXT_RE.test(entry.name)) {
|
} else if (AUDIO_EXT_RE.test(entry.name)) {
|
||||||
// Strip extension, strip leading "NN - ", then strip optional "Artist - " prefix
|
// Strip extension + leading track prefix, then normalize dashes
|
||||||
const bare = entry.name.replace(AUDIO_EXT_RE, '').replace(/^\d+\s*-\s*/, '');
|
const bare = entry.name.replace(AUDIO_EXT_RE, '').replace(/^\d+\s*-\s*/, '');
|
||||||
// bare may be "Artist - Title" or just "Title" — match from the end
|
const bareStem = _normStem(bare.toLowerCase());
|
||||||
const bareStem = bare.toLowerCase();
|
// Match: exact, or "Artist - Title" ending with our title stem
|
||||||
if (bareStem === titleStem || bareStem.endsWith(' - ' + titleStem) || bareStem.endsWith(titleStem)) {
|
if (bareStem === normTitle ||
|
||||||
|
bareStem.endsWith(' - ' + normTitle) ||
|
||||||
|
bareStem.endsWith(normTitle)) {
|
||||||
return path.join(dir, entry.name);
|
return path.join(dir, entry.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ function _renderRomajiOverrides() {
|
|||||||
<span style="flex:1;font-size:13px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${esc(k)}</span>
|
<span style="flex:1;font-size:13px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${esc(k)}</span>
|
||||||
<span style="color:var(--text2);flex-shrink:0">→</span>
|
<span style="color:var(--text2);flex-shrink:0">→</span>
|
||||||
<span style="flex:1.2;font-size:13px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${esc(v)}</span>
|
<span style="flex:1.2;font-size:13px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${esc(v)}</span>
|
||||||
<button onclick="removeRomajiOverrideUI(${JSON.stringify(k)})" style="background:none;border:none;color:var(--danger);cursor:pointer;font-size:18px;line-height:1;padding:0 2px;flex-shrink:0">×</button>
|
<button onclick="removeRomajiOverrideUI('${esc(k)}')" style="background:none;border:none;color:var(--danger);cursor:pointer;font-size:18px;line-height:1;padding:0 2px;flex-shrink:0">×</button>
|
||||||
</div>`
|
</div>`
|
||||||
).join('');
|
).join('');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user