From 319e465ba6bc06350f6017d9bc12ea75e87ca67b Mon Sep 17 00:00:00 2001 From: rinseaid Date: Tue, 7 Jul 2026 16:32:39 -0400 Subject: [PATCH] fix: CamelCase author names fail automatic search matching (#219) Co-authored-by: rinseaid --- src/lib/utils/ranking-algorithm.ts | 9 ++++---- tests/utils/ranking-algorithm.test.ts | 30 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/lib/utils/ranking-algorithm.ts b/src/lib/utils/ranking-algorithm.ts index 17f3d71..5b39c8d 100644 --- a/src/lib/utils/ranking-algorithm.ts +++ b/src/lib/utils/ranking-algorithm.ts @@ -389,11 +389,12 @@ export class RankingAlgorithm { // Parse authors from RAW string first (preserving commas for splitting) // Then normalize individual authors for matching - const requestAuthorRaw = audiobook.author.toLowerCase().replace(/\s+/g, ' ').trim(); - const parsedAuthors = requestAuthorRaw - .split(/,|&| and | - /) + const parsedAuthors = audiobook.author + .replace(/\s+/g, ' ') + .trim() + .split(/,|&| and | - /i) .map(a => a.trim()) - .filter(a => a.length > 2 && !['translator', 'narrator'].includes(a)); + .filter(a => a.length > 2 && !['translator', 'narrator'].includes(a.toLowerCase())); // Normalize parsed authors for matching (handles CamelCase in author names) const normalizedAuthors = parsedAuthors.map(a => this.normalizeForMatching(a, characterReplacements)); diff --git a/tests/utils/ranking-algorithm.test.ts b/tests/utils/ranking-algorithm.test.ts index efb1f1c..264f0aa 100644 --- a/tests/utils/ranking-algorithm.test.ts +++ b/tests/utils/ranking-algorithm.test.ts @@ -1348,6 +1348,36 @@ describe('ranking-algorithm', () => { // Gets partial score from fuzzy matching (title words + author words present) expect(breakdown.matchScore).toBeGreaterThan(30); }); + + it('matches CamelCase author prefix "McGowan" in request author field', () => { + const torrent = { + ...baseTorrent, + title: 'The Housekeeper by Suellen McGowan [M4B]', + }; + + const breakdown = algorithm.getScoreBreakdown(torrent, { + title: 'The Housekeeper', + author: 'Suellen McGowan', + }, true); + + // "McGowan" must survive into normalizeForMatching as "Mc Gowan" + // With requireAuthor: true, author presence check must pass + expect(breakdown.matchScore).toBeGreaterThanOrEqual(50); + }); + + it('matches CamelCase author prefix "McFadden" in request author field', () => { + const torrent = { + ...baseTorrent, + title: 'The Housemaid - Freida McFadden [M4B]', + }; + + const breakdown = algorithm.getScoreBreakdown(torrent, { + title: 'The Housemaid', + author: 'Freida McFadden', + }, true); + + expect(breakdown.matchScore).toBeGreaterThanOrEqual(50); + }); }); describe('Legacy API Compatibility', () => {