diff --git a/src/screens/settings/LibraryDuplicates.tsx b/src/screens/settings/LibraryDuplicates.tsx index 936087ab..a626b643 100644 --- a/src/screens/settings/LibraryDuplicates.tsx +++ b/src/screens/settings/LibraryDuplicates.tsx @@ -60,17 +60,24 @@ const findDuplicatesByTitleAndAlternativeTitles = => { const idToDuplicateStatus: Record = {}; - const titleToMangas: Record = {}; + const titleToMangas: Record> = {}; + const titleToAlternativeTitleMatches: Record> = {}; + + libraryMangas.forEach((mangaToCheck) => { + const titleToCheck = cleanupTitle(mangaToCheck.title); + + titleToMangas[titleToCheck] ??= new Set(); + titleToMangas[titleToCheck].add(mangaToCheck); + + titleToAlternativeTitleMatches[titleToCheck] ??= new Set(); + titleToAlternativeTitleMatches[titleToCheck].add(mangaToCheck); - libraryMangas.forEach((mangaToCheck) => libraryMangas.forEach((libraryManga) => { const isDifferentManga = mangaToCheck.id !== libraryManga.id; if (!isDifferentManga) { return; } - const titleToCheck = cleanupTitle(mangaToCheck.title); - const doesTitleMatch = cleanupTitle(libraryManga.title) === titleToCheck; const doesAlternativeTitleMatch = cleanupTitle(libraryManga?.description ?? '').includes(titleToCheck); @@ -79,23 +86,41 @@ const findDuplicatesByTitleAndAlternativeTitles = { + const originalTitle = [...titleMatches][0].title; + + const combinedDuplicates = [...titleMatches, ...(titleToAlternativeTitleMatches[title] ?? [])]; + const duplicates = [...new Set([...combinedDuplicates])]; + + const noDuplicatesFound = duplicates.length === 1; + if (noDuplicatesFound) { + return null; + } + + return [originalTitle, duplicates]; + }) + .filter((entry) => !!entry); + + return Object.fromEntries(titleToDuplicatesEntries); }; export const LibraryDuplicates = () => {