Results from direct AniList search.
Results from Comick fallback.
Results from MangaDex fallback.
Comick source information to preserve.
MangaDex source information to preserve.
Merged results and source maps.
export function mergeSourceResults(
originalResults: AniListManga[],
comickResults: AniListManga[],
mangaDexResults: AniListManga[],
comickSourceMap: ComickSourceMap,
mangaDexSourceMap: MangaDexSourceMap,
): {
mergedResults: AniListManga[];
comickSourceMap: ComickSourceMap;
mangaDexSourceMap: MangaDexSourceMap;
} {
const seenIds = new Set<number>();
const mergedResults: AniListManga[] = [];
const finalComickSourceMap = new Map(comickSourceMap);
const finalMangaDexSourceMap = new Map(mangaDexSourceMap);
// Add original results first
for (const manga of originalResults) {
if (!seenIds.has(manga.id)) {
seenIds.add(manga.id);
mergedResults.push(manga);
}
}
// Add Comick results, checking for duplicates
for (const manga of comickResults) {
if (seenIds.has(manga.id)) {
// If duplicate, keep the Comick source info
console.debug(
`[MangaSearchService] 🔄 Found duplicate manga ID ${manga.id} from Comick, keeping source info`,
);
} else {
seenIds.add(manga.id);
mergedResults.push(manga);
}
}
// Add MangaDex results, checking for duplicates
for (const manga of mangaDexResults) {
if (seenIds.has(manga.id)) {
// If duplicate, keep the MangaDex source info
console.debug(
`[MangaSearchService] 🔄 Found duplicate manga ID ${manga.id} from MangaDex, keeping source info`,
);
} else {
seenIds.add(manga.id);
mergedResults.push(manga);
}
}
console.debug(
`[MangaSearchService] 🔗 Merged results: ${originalResults.length} original + ${comickResults.length} Comick + ${mangaDexResults.length} MangaDex = ${mergedResults.length} unique results`,
);
return {
mergedResults,
comickSourceMap: finalComickSourceMap,
mangaDexSourceMap: finalMangaDexSourceMap,
};
}
Merge results from direct AniList search and fallback sources, deduplicating by manga ID.