soulsync/api/video
BoulderBadgeDad d91693ba53 Channel page: stream the FULL video catalog in batches (no more 90 cap)
The channel page was capped at the recent 90 (yt-dlp flat, hard min(90,limit)),
so prolific channels (Ninja Kidz etc.) showed only ~90 of hundreds. Now it loads
everything via YouTube's InnerTube API, paginated by continuation token — each
page fetched once (O(n), light on rate limits), unlike yt-dlp offset batches
which re-scan from the start every time.

- core: innertube_parse_video_items (keeps title+thumbnail, not just dates) +
  innertube_channel_videos_page(channel_id, continuation) → {videos, continuation}.
- api: GET /youtube/channel/<id>/videos?continuation=<tok> returns ~a batch of
  videos (approx dates, refined from the date cache) + the next token.
- frontend: ytLoadAllVideos streams batches after the fast initial 90 render,
  folding each into the year-seasons live — backfills dates on the videos already
  shown AND appends older ones, re-rendering per batch (episode grid only when the
  viewed season changed). Replaces the old date-only re-poll (this dates AND
  expands). Safety ceiling 2000; a 'Loading full history… N so far' indicator.

Validated live (MrBeast: 30/page, clean continuation, all dated). 101 tests green.
2026-06-17 17:42:21 -07:00
..
__init__.py YouTube channels (3/4): API endpoints 2026-06-17 00:38:11 -07:00
calendar.py Video Calendar: week navigation + owned/missing filter 2026-06-15 19:32:57 -07:00
dashboard.py Video: scope library reads to the active server (Plex/Jellyfin don't commingle) 2026-06-15 18:45:28 -07:00
detail.py video: episode detail expand (guest stars + bigger still) 2026-06-15 13:20:15 -07:00
discover.py Discover: streaming-provider filter + infinite scroll + a11y polish 2026-06-16 14:55:13 -07:00
enrichment.py Dashboard: YouTube date enricher as a 4th worker orb + Follow→Watchlist consistency 2026-06-17 11:05:59 -07:00
libraries.py Video side: own server connection (Plex/Jellyfin), music-style picker, isolated 2026-06-15 16:42:22 -07:00
library.py Video: scope library reads to the active server (Plex/Jellyfin don't commingle) 2026-06-15 18:45:28 -07:00
poster.py Search avatars: proxy with a UA + graceful initials fallback 2026-06-17 09:57:42 -07:00
scan.py video Tools: match music Database Updater (stats, cancel, real progress) 2026-06-14 07:35:57 -07:00
search.py video: smart multi-layer back button + next-level search/person 2026-06-15 08:30:17 -07:00
watchlist.py Video watchlist: richer show cards (status pill + ep count) + sort dropdown 2026-06-16 10:19:13 -07:00
wishlist.py Wishlist: episode synopsis + clickable cards + FIFO/newest sort 2026-06-16 18:21:26 -07:00
youtube.py Channel page: stream the FULL video catalog in batches (no more 90 cap) 2026-06-17 17:42:21 -07:00