From d54427d6e0b42fc0217c5454bcd17aee4d2c69fb Mon Sep 17 00:00:00 2001 From: ghostcoder42 Date: Fri, 9 Oct 2026 14:28:40 +0800 Subject: [PATCH] fix: empty result pages terminate the infinite scroll walk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The site's pagination lies on past-the-end pages: an empty result page still renders pagination.next markers (verified live — page 2 of a 1-result search returns 0 cards with 3 next markers). Trusting the marker kept hasNextPage true after the walk hit the void, so every scroll bounce at the bottom fired another guaranteed-empty fetch, even with the "已经看完啦" footer already on screen. An empty page is now always terminal: parseVideoList returns nextPage/lastPage null when it yields no cards, regardless of what the pagination markers claim. Requests were already sequential (the isFetchingNextPage guard); this ends the chain itself. --- src/lib/hanime1/scraper.test.ts | 16 ++++++++++++++++ src/lib/hanime1/scraper.ts | 8 ++++++++ 2 files changed, 24 insertions(+) diff --git a/src/lib/hanime1/scraper.test.ts b/src/lib/hanime1/scraper.test.ts index dc0c112..84cf6d6 100644 --- a/src/lib/hanime1/scraper.test.ts +++ b/src/lib/hanime1/scraper.test.ts @@ -48,6 +48,22 @@ describe('parseVideoList — homepage feed', () => { expect(result.nextPage).toBe(2); // page 1 always advances to 2 on a multi-page feed expect(result.lastPage).toBeGreaterThan(1); }); + + it('treats an empty page as terminal even when pagination.next markers exist', () => { + // Live-verified shape: past-the-end pages render zero cards but still + // carry pagination.next markers. Trusting them made the infinite query + // walk empty pages forever. + const html = ` + +
`; + const result = parseVideoList(html, 2); + expect(result.items).toEqual([]); + expect(result.nextPage).toBeNull(); + expect(result.lastPage).toBeNull(); + }); }); describe('parseVideoList — genre search page', () => { diff --git a/src/lib/hanime1/scraper.ts b/src/lib/hanime1/scraper.ts index c530801..2486aa4 100644 --- a/src/lib/hanime1/scraper.ts +++ b/src/lib/hanime1/scraper.ts @@ -199,6 +199,14 @@ export function parseVideoList(html: string, currentPage = 1): ListResult