From e529ab104a19ceb71f1981016fb3a857a79d3caa Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 17 Oct 2026 05:04:35 -0700 Subject: The video pager's counter counts every post it has found, not just the clips already warmed up: a refresh no longer shows "1 / 2" over a grid of a dozen. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The posts were all there (the grid showed them); the carousel holds a post back until its clip is ready to play — its first frame on the slide and its opening cached — and only the next couple are warmed at a time, so after a refresh the total started at 1 or 2 and crept up as clips warmed (Adam, 2026-10-17: "On refresh the total video count seems to reset to 1 and slowly more load despite showing posters for several more being available"). Now the total, and the place in it, count the waiting posts too; only posts kept out for their shape are left out. A swipe still passes over a post not yet ready. tools/pager-ready-gate-test.js: the counter reads 3 / 4 both before and after the waiting post joins. pager-swipe-fly, profile-pager, thread-pager and pager-seek-hide pass. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg --- src/features/messages.js | 7 ++++++- tools/pager-ready-gate-test.js | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/features/messages.js b/src/features/messages.js index 017629f..82b1986 100644 --- a/src/features/messages.js +++ b/src/features/messages.js @@ -13194,9 +13194,14 @@ export function messagesFeature(ctx) { const slide = rowSlide(group); if (slide) { pagerShow(slide); pagerArrive(slide); } } + // Counted: every post the pager has found, the ones still waiting for + // their clip to be ready included — only those kept out for their shape + // aren't. Counting the carousel alone, a refresh showed "1 / 2" over a + // grid of a dozen clips, the total creeping up as clips warmed (Adam, + // 2026-10-17: "the total count persists"). function pagerPosition() { if (!pager) return; - const groups = pagerGroups(); + const groups = pagerGroups(true).filter((g) => !g.classList.contains('mp-off')); const slide = pager.cur || pager.anchor; const index = groups.indexOf(slide && slide.closest('.mp-group')); pager.el.querySelector('.mp-position').textContent = (index < 0 ? 0 : index + 1) + ' / ' + groups.length; diff --git a/tools/pager-ready-gate-test.js b/tools/pager-ready-gate-test.js index d6df826..4138e42 100644 --- a/tools/pager-ready-gate-test.js +++ b/tools/pager-ready-gate-test.js @@ -118,7 +118,7 @@ try { await sleep(300); const g = await groups(); check('…joining above the clip on screen without moving it', g.find((x) => x.cur)?.clip === 'tall3' && Math.abs(g.find((x) => x.cur).top) <= 1, JSON.stringify(g.map((x) => x.clip + ':' + x.top + (x.cur ? '*' : '')))); - check('…and the counter grew', (await counter()) !== n0, n0 + ' → ' + (await counter())); + check('…and the counter counted it all along (3 / 4 before and after)', n0 === '3 / 4' && (await counter()) === '3 / 4', n0 + ' → ' + (await counter())); await page.keyboard.press('ArrowUp'); check('a step back up lands on the one that joined', await waitFor(() => { const s = document.querySelector('.mp-slide.mp-cur'); return !!s && /tall2/.test(s.getAttribute('data-k')) && !s.querySelector('video').paused; }, null, 6000), String(await curClip())); -- cgit v1.2.3