gitoriaLog in with ident

tracker

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commitfbb903ccfbb903cctracker#33/#37 (mission 032): a title without a TMDB poster gets its backdrop (w780, posterFromBackdrop, shown 2:3 centre-cropped); movies store runtime, the page shows release date + runtime; art backfill (public titles without poster file / movies without runtime) and person photo backfill (tmdbProfile / photoCheck) as the last start jobs (TRACKER_ART, TRACKER_PHOTOS; off in every gate start); gates 379/0, 32/0, 53/0, 229/0, 26/0, check-theme 0; live copy: art 4977 titles in 42 min (115 posters, 15 backdrops, 4609 runtimes), The Remaining shows its backdrop + 7 minmrefbb903cc/reports/013-tracker-caret-skeleton.md

3.6 KB

  1. # w057 — tracker#17: season caret up/down + skeleton rows + faster opening
  2. **Commit** 1704ec4 on main (loreana:/media/STORAGE/projects/tracker.worldapi.org; not pushed, not deployed).
  3. Files: components/show.hl, styles.hl, tests/browser.mjs, tests/realdata-057.mjs (new), README.md, STATUS.md.
  4. **What changed**
  5. - Caret: DOWN when the season is closed, UP when it is open (`season-row.expanded` rotate 180°).
  6. - Opening a season: right away in the browser, the caret turns up and min(episodes, 8) shimmering skeleton rows appear. They have the episode row's shape and height and use CSS only. Then the new face `showSeasonEpisodes(seasonId)` answers and its episodes replace the skeleton rows.
  7. - The face takes no session (the data is public), so the server does not re-render the page and sends nothing back to sync.
  8. - The watch state comes from a new member `watchedEpisodes`. It holds only this show's episodes, per season as `{ all, except }`.
  9. - Closing a season happens only in the browser, with no request.
  10. - A season closed again before the answer arrives stays closed.
  11. - Adult title pages (only their followers see them) still use the session face `showRows`.
  12. **Why opening was slow (measured):** the server work was small. On the copy, the slug scan took 60–78 ms, the watches scan 20 ms and loading the episodes 6 ms. The old face took `session`, so hl:web re-rendered the whole page on the server and shipped every session-derived member back as a sync, including `rows`. The browser then drew the rows twice.
  13. **Real data** (copy of live storage/, signed in as the creator, ms from the click, measured in the page; 390 and 1280 similar):
  14. | | Daily Show S30 (142 ep) | LWT S12 (30 ep) |
  15. |---|---|---|
  16. | before: episodes visible | 380–450 | 265–390 (one 1,093) |
  17. | after: skeleton visible | 77–106 | 25–54 |
  18. | after: episodes visible | 233–288 | 58–102 |
  19. | close before → after | 420–1388 → 135–175 | 285–390 → 28–45 |
  20. - Every season showed 8 skeleton rows (the cap). Only `showSeasonEpisodes` was sent.
  21. - The watch state filled in the browser equals the server's own rebuild: true for both shows.
  22. - Page load is unchanged (Daily Show about 310–360 ms warm). Its HTML grew from 157 to 167 kB; a plain id map would have made it 274 kB.
  23. - The adult path was checked on a second copy with Last Week Tonight set to adult: signed out it says "Not found", and the creator's season opens go through `showRows` with no double rows.
  24. - Copies, sessions and servers are removed. No port in 8720–8739 is listening.
  25. **Gate:** `TRACKER_GATE_SHOTS=/tmp/w057/shots TRACKER_GATE_PORT=8720 TRACKER_GATE_IDENT_PORT=8721 TRACKER_GATE_CHROME=8722-8726 TRACKER_GATE_TMDB_PORT=8727 node tests/browser.mjs`
  26. → `214 passed, 0 failed` (was 208)
  27. - Checks the caret both ways.
  28. - Checks the skeleton state: an init script holds the face's websocket frame back by 1.5 s, and the gate checks 2 rows, shape/height, shimmer, caret already up and no episodes yet.
  29. - After the answer: skeleton gone, every row once (hybriel#121), watch state right.
  30. - A season closed while loading stays closed; closing sends nothing.
  31. **Screenshots** (looked at): Loreana /tmp/w057/shots/show-{skeleton,open,closed}-{390,1280}.png. Real-data ones: /tmp/w057/real-after/ and /tmp/w057/real-before/.
  32. **Open**
  33. 1. Deploy.
  34. 2. Episode and season check clicks still use session faces, so the server re-renders the page each time. Not measured; the same split could speed them up.
  35. 3. On a big show (about 264 rows) the skeleton needs about 80 ms, because hl:web redraws the whole flat row list on every write to `rows`.
  36. 4. The adult fallback is not in the gate: no fixture series is adult. Real data currently has no adult title with seasons.

Branches

Latest commits

  • fbb903cctracker#33/#37 (mission 032): a title without a TMDB poster gets its backdrop (w780, posterFromBackdrop, shown 2:3 centre-cropped); movies store runtime, the page shows release date + runtime; art backfill (public titles without poster file / movies without runtime) and person photo backfill (tmdbProfile / photoCheck) as the last start jobs (TRACKER_ART, TRACKER_PHOTOS; off in every gate start); gates 379/0, 32/0, 53/0, 229/0, 26/0, check-theme 0; live copy: art 4977 titles in 42 min (115 posters, 15 backdrops, 4609 runtimes), The Remaining shows its backdrop + 7 minmre
  • 4ecc67b2tracker: STATUS/LOG for the t38 + t40 merge (gates 374/0, 32/0, 53/0, 229/0, 26/0, check-theme 0; live copy checks)mre
  • e5945d2fMerge t40 (tracker#40 curated franchises, Franchises menu, superseded collections) into main: deploy.sh lists all six gates (browser, kinds, franchises, pager, franchiseseed, check-theme); search.hl keeps #37's personPhotoOf + #40's importWithCredits; pager gate runs with TRACKER_FRANCHISE_SEED=0; gates 374/0, 32/0, 53/0, 229/0, 26/0, check-theme 0mre
  • b638e99dMerge t38 (tracker#38 pagination, #35 Returning/Airing label) into main: LOG/STATUS keep both sides; pager gate follows #37's /people (everyone, last updated first: seed updatedAt); gates pager 229/0, browser 374/0mre
  • f8ffa4dbtracker: report 032 + The Remaining + #39mre
  • 7565a863tracker: LOG timemre
  • b10f00c8tracker#39: double episodes — migrated episodes whose TMDB id TMDB replaced are adopted by their number in the sync (old id -> migratedTmdbId); merge.hl step 3 merges each season's doubles at start (keeper: most watches > synced > first; watches moved/parked; tombstones into mergedEpisodes, nothing deleted); tools/count-duplicate-episodes.hl; gate fixture + paths-m039; live copy 850 -> 0 in 64 s; gates 373/0, 32/0, 52/0mre
  • 8f1d4542tracker#40: superseded collections — a TMDB collection timeline whose titles are all in one curated timeline is hidden (supersededBy; kept: own page + editor finder), set by the collection seed when it makes one and by the curated build (lifted when the cover is gone); partly covered ones join that franchise; no second widget (First Contact: only Star Trek — Prime); gate franchiseseed 26/0, browser 365/0, kinds 32/0, franchises 53/0, check-theme 0; real copy 24 supersededmre
  • 9448d643tracker#35 follow-up (mission 033): TVmaze 'Running' is labelled 'Returning', or 'Airing' while a non-special episode of the two newest seasons is released within today +-7 days (data unchanged); gate fixtures Running/Airing/Aired + a special; browser 366/0, kinds 32/0, franchises 52/0, pager 229/0, check-theme 0mre
  • 7d4b293dtracker#40: "Franchises" in the main menu (desktop header after People, phone sidebar) → /franchises, marked on franchise and timeline pages; gates 365/0, 32/0, 53/0, 24/0, check-theme 0mre
  • 8751adb8tracker: report 032mre
  • 9bce1f65tracker mission 032: STATUS gate files + the hour-boundary flakemre
  • 718bfb89tracker#37 (mission 032): /people = everyone, last updated first (updatedAt stamped by the person fill; view built at boot, touched people first at once), photo + name tiles (person colour) with the /movies pagination, /people/<letter> removed; photo = our file, tmdbProfile, a cast/crew entry's profile (in-memory map at boot), else the new 'no photo' placeholder; new cast/crew/created_by people keep tmdbProfile; search people rows with the photo; /settings = the heading only; util.hl sortDesc starts from sorted runs (same result, 105k: 1.6 s -> 0.15 s); gates 369/0, 32/0, 52/0, check-theme 0; README/STATUS/LOGmre
  • 93dfb0batracker#40 (mission 034): the curated franchises — data/franchises.json (17 franchises, 31 timelines, 285 TMDB titles, movies + series, in-universe/release order, 12 TMDB collections attached); lib/franchiseseed.hl + jobs.hl franchiseSeedTick (last start job, imports missing titles via details.hl importWithCredits = the search's Add, one per step paced, then one build; franchiseseed.db: editor changes win, the creator's same-name franchise adopted / timeline left alone, 404 remembered, resumable, idempotent); timeline heads 'N titles · in-universe order' (orderKind) and wrap on a phone; series pages show the widget; new gate tests/franchiseseed.mjs (5th in deploy.sh), the others run with TRACKER_FRANCHISE_SEED=0; gates 365/0, 32/0, 52/0, 24/0, check-theme 0; real copy 196 imported, 0 failed, 7 min, restart unchanged=31mre
  • 03ec792ftracker#38 (mission 033): pagination goes exactly to the clicked page — tilelist read the clicked button's text after pagination.hl's own handler had rebuilt the buttons (real clicks only); now li.current, else the button's own text; new gate tests/pager.mjs (5 lists x 11 pages, 390/1280, real + script clicks, Back/Forward) 229/0; browser 365/0, kinds 32/0, franchises 52/0, check-theme 0mre
  • 96ba683adeploy.sh: a gate without a 'passed,' line (check-theme) no longer ends the scriptmre
  • eb3b9205tracker: report 031mre
  • 9b5d2e89tracker mission 031: README (What it does, Test: four gates + the #32 checks, Files: theme/, new pages), STATUS (real copy, A/B load, how to repeat, open points), LOGmre
  • 39950e4ctracker#32 (mission 031): the WorldAPI theme (theme/ vendored verbatim from layouts.worldapi.org 85b5654; styles.hl inherits it: accent green-dark, type colours 1-6; own base/header rules, row lines, genre-pill and inverted-button frames removed, the season foldable keeps its line; check-theme 21 -> 0, 4th deploy gate; main actions class primary) and the #32 header (theme AppHeader/MainMenu/UserMenu/Sidebar/ContentFirst: desktop brand, search, Series|Shows|Movies|Genres|People, user icon with Unwatched..Settings, Logout; signed out the ident selector, phone the iD icon dropdown; phone menu in the sidebar overlay; marked entry by :has); /find -> /search/<q>, /genres, /people(/<letter>), /settings; main { ContentFirst { slot } } works around the hl:web one-line slot bug; gates 365/0, 32/0, 52/0, check-theme 0mre
  • a386dc92tracker: reports 029 + 030mre