From 59120fd7b6fc0bb7be6cc4d7c506d2396c39fc57 Mon Sep 17 00:00:00 2001 From: Honey Date: Fri, 5 Jun 2026 00:29:21 +0200 Subject: [PATCH] feat: rename song file artist segment when applying romaji override fix Co-Authored-By: Claude Sonnet 4.6 --- backend/novasonic-server.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/backend/novasonic-server.js b/backend/novasonic-server.js index 84d03aa..5c7fec9 100644 --- a/backend/novasonic-server.js +++ b/backend/novasonic-server.js @@ -704,6 +704,30 @@ app.post('/api/fix-artist-sort', async (req, res) => { }); fs.renameSync(tmpFile, filePath); + // Rename the file itself: keep track prefix + title, replace artist segment. + // Convention: {NN - }Artist - Title.ext (separator may be " - " or " – ") + const oldBasename = path.basename(filePath); + const oldStem = oldBasename.slice(0, -fileExt.length); + // Extract leading track prefix (e.g. "01 - " or "01-15 – ") + const trackPrefixMatch = oldStem.match(/^(\d[\d\-]*\s*[-–—]\s*)/); + const trackPrefix = trackPrefixMatch ? trackPrefixMatch[1] : ''; + // Everything after the track prefix: "OldArtist - Title" or just "Title" + const afterPrefix = oldStem.slice(trackPrefix.length); + // Split on first " - " or " – ": if 2+ segments, first is old artist, rest is title + const segments = afterPrefix.split(/\s+[-–—]\s+/); + const titlePart = segments.length >= 2 ? segments.slice(1).join(' - ') : afterPrefix; + const safeArtistFile = sanitize(artistSort.split(/[,;&]/)[0].trim()); + const safeTitlePart = sanitize(titlePart); + const newBasename = `${trackPrefix}${safeArtistFile} - ${safeTitlePart}${fileExt}`; + + if (newBasename !== oldBasename) { + const renamedPath = path.join(path.dirname(filePath), newBasename); + if (!fs.existsSync(renamedPath)) { + fs.renameSync(filePath, renamedPath); + filePath = renamedPath; + } + } + // Move to correct artist/album folder: {musicPath}/{safeArtistDir}/{albumName}/ const oldAlbumDir = path.dirname(filePath); const oldArtistDir = path.dirname(oldAlbumDir);