diff --git a/packages/backend/src/lib/adapters/instagram.test.ts b/packages/backend/src/lib/adapters/instagram.test.ts index 26a503c..32b773a 100644 --- a/packages/backend/src/lib/adapters/instagram.test.ts +++ b/packages/backend/src/lib/adapters/instagram.test.ts @@ -159,6 +159,21 @@ describe("InstagramAdapter", () => { expect(items[0].id).toBe("high"); expect(items[1].id).toBe("mid"); }); + + it("deduplicates items by id", async () => { + mockFetch.mockResolvedValueOnce({ + items: [ + { code: "AAA", caption: "First", user: { username: "a" }, like_count: 8000 }, + { code: "AAA", caption: "First dup", user: { username: "a" }, like_count: 8000 }, + { code: "BBB", caption: "Second", user: { username: "b" }, like_count: 3000 }, + ], + }); + + const items = await adapter.fetchTrending(20); + expect(items).toHaveLength(2); + expect(items[0].id).toBe("AAA"); + expect(items[1].id).toBe("BBB"); + }); }); describe("fetchDetail", () => { diff --git a/packages/backend/src/lib/adapters/instagram.ts b/packages/backend/src/lib/adapters/instagram.ts index 1ddfac9..522a1a4 100644 --- a/packages/backend/src/lib/adapters/instagram.ts +++ b/packages/backend/src/lib/adapters/instagram.ts @@ -33,11 +33,16 @@ export class InstagramAdapter implements PlatformAdapter { } } + const seen = new Set(); return items .map((item: unknown, index: number) => this.mapToContentItem(item as Record, index) ) - .filter((item) => item.like_count != null && item.like_count >= 100) + .filter((item) => { + if (seen.has(item.id)) return false; + seen.add(item.id); + return item.like_count != null && item.like_count >= 100; + }) .sort((a, b) => (b.like_count ?? 0) - (a.like_count ?? 0)) .slice(0, count); }