gitoriaLog in with ident

tracker

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commit54796ff254796ff2tracker mission 028 (code order) 4/5 thin faces + last copies: the show page's check/follow faces call lib/watches.hl toggleWatched / toggleSeasonWatched (seasonAllWatched moved there) and lib/follows.hl toggleFollowed; both logins (header selector face, /login/callback) share lib/users.hl userOfCode; todayStr/listOf copies in components and the export readers copied into tools/migrate.hl + tools/old-short-ids.hl now once (lib/util.hl, lib/export.hl); gates 342/0, 32/0, 52/0; old-short-ids output byte-identical, migrate output identicalmre54796ff2/reports/015-tracker-filmography-complete.md

5.1 KB

  1. # w059 — tracker#26: filmography titles complete
  2. **Commit**: `25a50bc` on branch `t26` (worktree loreana:/media/STORAGE/projects/tracker-wt26, based on main 1704ec4). Not pushed, not merged, not deployed. main untouched.
  3. ## What the filmography stored (vs a full import)
  4. - `people.hl addMinimalTitle` (#16) stores title, year/release, overview, type, tmdbId, adult, genres, language, and only that one person as cast.
  5. - It stores no poster, no seasons/episodes, no imdb/tvdb/tvmaze ids, no homepage/tagline/status and no `tmdbSync`. Nothing ever completed these records, so the page stayed that way.
  6. - A search import (`importTitle` + `syncShow`) has all of that, but no cast either.
  7. - The live copy has 321 such titles.
  8. ## Built
  9. - **`details.hl` `completeStep`**:
  10. - Step 1 is one TMDB request: `/movie|tv/<id>?append_to_response=external_ids,credits|aggregate_credits`. It stores the fields and the cast (TMDB's first 20, adult people left out). People we don't have yet get a new person record (slug, search entry); their page fills on the first visit.
  11. - A movie is complete after step 1 (ids + poster).
  12. - A series then continues in steps through `tmdbsync.hl syncShowPart`: one step per ≤ 300 episodes of seasons, then a last step for ids, the TVmaze lookup + merge and the poster.
  13. - `detailsAt` marks a title complete. `detailsCheck` marks TMDB 404 and adult titles, which are never asked again.
  14. - **Show page** (`components/show.hl`): an incomplete title shows what it has plus shimmer skeletons (poster, cast line, 3 season rows for a series). An invisible probe calls the sessionless face `showComplete` step by step until it is done. The last answer replaces the skeletons without a reload.
  15. - **Details repair** (`project.hl repairTick`):
  16. - At start it queues every incomplete title that is not adult and does one step per clock tick.
  17. - It paces itself with `pauseMsAfter` (TMDB ≤ 40 / 10 s, TVmaze ≤ 20 / 10 s) and runs only after the adult backfill and never during the daily sync.
  18. - It resumes after a restart and retries passing failures up to 2 times.
  19. - Env: `TRACKER_REPAIR` (default on), `TRACKER_REPAIR_LOG_EVERY`, `TRACKER_REPAIR_FAST` (gate only).
  20. - New titles from a filmography get `minimal = true`.
  21. - Adult titles are never completed: the public face refuses them and the repair skips them.
  22. ## Gate
  23. ```
  24. TRACKER_GATE_SHOTS=/tmp/w059/shots TRACKER_GATE_PORT=8754 TRACKER_GATE_IDENT_PORT=8755 TRACKER_GATE_CHROME=8756-8758 TRACKER_GATE_TMDB_PORT=8759 node tests/browser.mjs
  25. 231 passed, 0 failed
  26. ```
  27. - 214 → 231 checks. The new ones cover:
  28. - artist page → click a new movie → skeleton → full page without a reload, one TMDB request;
  29. - the series case in 4 steps;
  30. - the new cast person's page and search entry;
  31. - the repair: 82 titles, stopped after 6, resumes, 404s marked, adult title never asked, pages < 1.2 s meanwhile, a 3rd start has nothing to do.
  32. - The offline home check now expects 6 series instead of 5, because Person Series has released episodes once it is completed.
  33. ## Real data (copy of live `storage/`, real TMDB; copy deleted afterwards)
  34. **Opening a title** (ms from the click):
  35. - **Skeleton:** shown after 178–258 ms.
  36. - **Movies:** complete after 642–712 ms.
  37. - **Series:** complete after 1262–1361 ms.
  38. - **Other requests meanwhile:** at most 586 ms.
  39. - **Reload afterwards:** complete at once, 157–205 ms.
  40. - **Biggest titles:** The Late Show (4,252 episodes) took 11.4 s in 23 steps, with other requests waiting at most 1.3 s.
  41. **Repair**: 321/321 complete, 0 failed, +638 seasons, +16,528 episodes, 299 posters, 5,196 cast entries, 787 TMDB + 218 TVmaze requests, 507 s.
  42. - Page latency meanwhile: median 0.13 s, p99 1.03 s, max 2.35 s.
  43. - The next start logs "nothing to do".
  44. - My first version did one title per step; the Late Show then blocked the server for 10.7 s. That is why series are now split into steps.
  45. **Screenshots** (looked at), on Loreana:
  46. - `/tmp/w059/real/`: `{movie,series}-{skeleton,complete,reload}-{390,1280}.png`, `repaired-*-{390,1280}.png`, `direct-*-1280.png`
  47. - gate: `/tmp/w059/shots/{title,series}-skeleton-1280.png`
  48. ## Merge notes for main (mission 014 (old 058) touches `components/show.hl`)
  49. - **`components/show.hl`:** my changes are additive:
  50. - 1 import;
  51. - 2 statics (`completingOf`, `completedPageOf`, which calls `buildRows(show, null, cl)`);
  52. - 4 members after `adultShow`;
  53. - the View blocks (poster skeleton, cast skeleton, `showLoading`);
  54. - the handler `completeTick`;
  55. - the face `showComplete`.
  56. - **`tmdbsync.hl`:** `syncMovie` gained a third parameter `pre`, and `syncShow` now calls `syncShowPart(id, null, null)`.
  57. - **Gate:** new fixtures, startServer defaults (`TRACKER_REPAIR=0`, `TRACKER_DETAILS_PART_EPISODES=1`), and the #16 block's "added title" check is replaced by the #26 block.
  58. - **Deploy:** on live the repair waits for the adult backfill (~80 min), then takes ~9 min.
  59. ## Open points
  60. 1. Merge and deploy.
  61. 2. Search imports still have no cast.
  62. 3. Titles added while the app runs are only completed when opened or at the next start.
  63. 4. After a client-side click, the title page keeps the person page's scroll position (hl:web behaviour, not new).
  64. ## Hybriel issues
  65. None new.

Branches

Latest commits

  • 54796ff2tracker mission 028 (code order) 4/5 thin faces + last copies: the show page's check/follow faces call lib/watches.hl toggleWatched / toggleSeasonWatched (seasonAllWatched moved there) and lib/follows.hl toggleFollowed; both logins (header selector face, /login/callback) share lib/users.hl userOfCode; todayStr/listOf copies in components and the export readers copied into tools/migrate.hl + tools/old-short-ids.hl now once (lib/util.hl, lib/export.hl); gates 342/0, 32/0, 52/0; old-short-ids output byte-identical, migrate output identicalmre
  • 06b078e3tracker mission 028 (code order) 3/5 project.hl is the map: config, routes, wiring and a feature → file index (914 → 258 lines); the background jobs (daily sync run, backfills, details repair, credits job, merge, short ids, collection seed) moved unchanged into lib/jobs.hl (a class: their state is reassigned every step, a static cannot be; one instance made after the server), the login callback into lib/users.hl, poster/photo serving into lib/images.hl, the /shows/<slug> rule into lib/shows.hl showsMovedPath; route handlers are thin wrappers; gates 342/0, 32/0, 52/0, real-copy pages identicalmre
  • 94716fd2tracker mission 028 (code order) 2/5 util + topics: lib/util.hl holds envOr, storageDir, postersDir, profilesDir, newId, hexDigits, todayStr, dateOr, textOr, hasId, listOr, firstOf, sortDesc once (were copied into up to 5 files); tmdbsync.hl split into tmdb.hl (TMDB/TVmaze requests), sync.hl (one title's sync), sync-helpers.hl, backfill.hl; details.hl split into details.hl, credits.hl, credits-helpers.hl (isIncomplete to shows.hl); search-helpers.hl (words, query, ranking, slugs); collections.hl (the TMDB collection seed, out of franchises.hl); deltasync.hl renamed dailysync.hl; no behaviour change: gates 342/0, 32/0, 52/0, real-copy pages identicalmre
  • 186079b0tracker mission 028 (code order) 1/5 move: every root .hl except project.hl into lib/ (styles.hl into components/), import paths only; gates 342/0, 32/0, 52/0; real-copy pages identicalmre
  • 4f47f181tracker: report 027mre
  • dc1d4be4tracker mission 027: Hybriel master 06617221 vendored (plugin allocator fixes 3a781359 + 413f60e4); real copy RSS through first-start jobs + 400 loads flat ~2.55 GB (190aa11d 2.3 -> 5.6 GB), page times <= 1.1x; gates 342/0, 32/0, 52/0mre
  • 84e1b3e1tracker: reports 025 + 026mre
  • dc40d859tracker#31 (mission 026): duplicate titles merged — the 68 type+tmdbId pairs held by 157 records were the old tracker's (all migrated); merge.hl repair job (own clock, before the TMDB jobs) keeps one keeper per title (follows/watches > old short id > oldest), moves follows, watches, seasons, cast, credits, timelines, tombstones the rest (mergedInto, never deleted), slugs + short ids 301 to the keeper; stray seasons merged into their listed twin (Reacher S3 watches) or linked when watched; search import re-checks before its put; deploy.sh waits up to 90 s for 200; real copy 68 -> 0 dup ids, az5b2 follows/watches equal; gates 342/0, 32/0, 52/0mre
  • 2667da05tracker#30 (mission 025): /my/ pages from slim cached title cards, episode rows and watch sets (after the jobs /my/series 1.8 s -> 0.06 s, /my/unwatched 4.1 -> 0.18 s); timeline page shows its name once; franchise widget under the poster/title; movies with TV leftovers (First Contact) go through the details repair; tools/count-tmdb-ids.hl; gates 327/0, 52/0, 32/0mre
  • 3909810dantcolony#40: mission references in README/STATUS/docs point to the moved missionsmre
  • e63b1d28antcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
  • 1cda451dtracker: Hybriel master 190aa11d (#127 both shapes, GC correctness fc838894) — conductor adopts despite /my/series 2.4x after jobs (memory 8.0 → 1.7 GB boot); see reports/071mre
  • c1fa2f2etracker (mission 071): Hybriel master 190aa11d measured on the real copy vs the live binary 8590df63 — NOT adopted (after the first-start jobs /my/series 2.4x slower, /series 1.6x, RSS swings 7.4-12.2 GB; fresh it is flat at 1.7-2.2 GB and /my/unwatched faster), vendor stays 8efba065, candidate kept in .scratch/w071/vendor-190aa11d; tests/kinds.mjs: collection seed off (its TMDB request broke check 1 in 1 of 4 runs); tests/realdata-071.sh + realdata-071-bench.mjs + tools/realdata-071-table.py; README + STATUS (numbers, how to repeat); gates 325/0, 32/0, 50/0mre
  • 8081350atracker docs (mission 070): README (summary, Config HL_GC_BYTES — kept at Hybriel's default, the 256 MiB setting is taken out of docker-compose.yml again: the jobs grew to 12+ GB with it too, see STATUS), Test (three gates), Deploy (first start ~50 min: kinds then seed, restart once after collections done, memory numbers), Vendored Hybriel 8efba065 + #48 audit, Files; STATUS mission 070 entry (merges, migrated counts, lambda audit, gates, RSS old vs new, how to repeat, open points); docs/kinds.md + docs/franchises.md job order; tests/realdata-070-*.sh, tools/count-migrated.hl, tools/ref-params.py, tools/lambda-audit.pymre
  • 1ad19c8ctracker: re-vendor Hybriel master 8efba065 (#126 GC by bytes, #48 lambda parameters copy) (mission 070): bin/hybriel sha256 50361e95…, plugins core crypto data fetch fs http http1 mpackdb proc smtp time web; lambda audit: 13 lambdas change a passed record/list (11 through a local alias), no caller relies on it — unchanged; 319 read-only lambda parameters get & (no copy per call: /my/schedule 2.35 → 0.46 s, /my/unwatched 13.7 → 5.7 s on the real copy); /my/unwatched one merge sort instead of n² inserts; docker-compose HL_GC_BYTES=268435456; deploy.sh runs kinds.mjs + franchises.mjs too (default ports 8700–8710); tests/realdata-070.mjs; gates browser 325/0, kinds 32/0, franchises 50/0mre
  • 46b21389tracker (mission 070, conductor): the sync never destroys migrated data — the one-time summary step MOVES a copied summary to migratedSummary (marker summaries-moved.txt) instead of clearing it; a migrated record's first title/genres/homepage/tagline TMDB replaces → migratedTitle/migratedGenres/migratedHomepage/migratedTagline, a migrated season's/episode's title/summary → migratedTitle/migratedSummary (set once); tests/peek-shows.hl prints them; gate 325/0mre
  • 749019b0Merge t19 (tracker#19 franchises + timelines) into main (mission 070): conflicts README/STATUS/show.hl/project.hl/browser.mjs/faketmdb.mjs, both sides kept; franchise/timeline pages get #20's typed heading (Franchise | …, Timeline | …), their title links via titlePath (/movies|/series|/shows); the collection seed waits for repair, kinds and credits too; franchises.mjs URLs + 2 new checks; gates browser 323/0, kinds 32/0, franchises 50/0mre
  • daf49feaMerge t20 (tracker#20 typed headings + #21 series/shows split) into main (mission 070): conflicts README/STATUS/show.hl/project.hl/search.hl/components/search.hl/browser.mjs/faketmdb.mjs, both sides kept; clock order backfill → repair → kinds → credits; withDetailsFields stores tmdbType + kind; gates: browser.mjs URLs → /series|/movies, typed h1 selectors; kinds.mjs repair/credits off, fixture name = seed name; browser 323/0, kinds 32/0mre
  • 20e09d89Merge t18 (tracker#18 delta sync) into main (mission 070): conflicts README/STATUS/show.hl/project.hl/browser.mjs, both sides kept; pageShowOf summary = summaryOfmre
  • f83571c3tracker#18 (mission 067): daily sync by change lists — TMDB /tv|movie/changes (since the stored day, paged) + TVmaze /updates/shows → only our changed titles (followed: full step, unfollowed: light step — changed seasons, no TVmaze), full walk on first run / gap > 14 days / failed list; show record refreshed (title, tmdbSummary, tagline, status, genres …; renamed titles re-indexed); summary = the creator's own text (page: summary > tmdbSummary > tvmazeSummary), one-time clear of copied summaries (9,647 on the live copy); gate 261, tests/realdata-018*.mjs, README + STATUSmre