From 2e21c3b5f519017b4600a44fdd5e884dd4a9003a Mon Sep 17 00:00:00 2001 From: Geert Rademakes Date: Fri, 8 Aug 2025 11:06:48 +0200 Subject: [PATCH] =?UTF-8?q?fix(matching):=20strip=20diacritics=20in=20matc?= =?UTF-8?q?hing=20and=20quick=20match=20so=20accented=20letters=20(e.g.,?= =?UTF-8?q?=20=C3=A9)=20match=20plain=20equivalents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/backend/src/services/backgroundJobService.ts | 5 +++-- packages/backend/src/services/songMatchingService.ts | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/services/backgroundJobService.ts b/packages/backend/src/services/backgroundJobService.ts index 4bc8ccd..2e1f2d3 100644 --- a/packages/backend/src/services/backgroundJobService.ts +++ b/packages/backend/src/services/backgroundJobService.ts @@ -224,13 +224,14 @@ class BackgroundJobService { // Quick filename matching logic // Decode URL-encoded sequences so %20, %27 etc. are compared correctly const safeDecode = (s: string): string => { try { return decodeURIComponent(s); } catch { return s; } }; - const normalizedS3Filename = safeDecode(filename).replace(/\.[^/.]+$/, '').toLowerCase(); + const stripDiacritics = (s: string) => s.normalize('NFKD').replace(/[\u0300-\u036f]/g, ''); + const normalizedS3Filename = stripDiacritics(safeDecode(filename)).replace(/\.[^/.]+$/, '').toLowerCase(); let matchedSong = null; for (const song of allSongs) { if (song.location) { const rekordboxFilename = song.location.split(/[/\\]/).pop() || song.location; - const normalizedRekordboxFilename = safeDecode(rekordboxFilename).replace(/\.[^/.]+$/, '').toLowerCase(); + const normalizedRekordboxFilename = stripDiacritics(safeDecode(rekordboxFilename)).replace(/\.[^/.]+$/, '').toLowerCase(); if (normalizedS3Filename === normalizedRekordboxFilename) { matchedSong = song; diff --git a/packages/backend/src/services/songMatchingService.ts b/packages/backend/src/services/songMatchingService.ts index d072a16..8519df0 100644 --- a/packages/backend/src/services/songMatchingService.ts +++ b/packages/backend/src/services/songMatchingService.ts @@ -643,7 +643,12 @@ export class SongMatchingService { * Clean string for comparison */ private cleanString(str: string): string { - return str + // Normalize unicode and strip diacritics so "é" -> "e" + const normalized = str + .normalize('NFKD') + .replace(/[\u0300-\u036f]/g, ''); + + return normalized .toLowerCase() .replace(/[^\w\s-]/g, '') // Remove special characters except spaces and hyphens .replace(/\s+/g, ' ') // Normalize whitespace