Twitch-VOD-Manager/src
xRangerDE 3c73efbad7 feat: banner background + live preview card + VOD hover storyboard + sticky header
Four interlocking visual upgrades that push the profile area from
"works" to "looks like a real Twitch app". Single release because
all four share data plumbing and need to land coherently.

1) Banner background — getStreamerProfile now also pulls
   bannerImageURL via public GQL, fetches the bytes server-side as a
   data URL (same path as the avatar fix in 4.6.18-4.6.19), and the
   renderer puts it behind the header content with blur(18px) +
   saturate(1.2) + a 0.55 opacity overlay. Result: per-streamer
   colour identity at a glance, like twitch.tv's channel page.

2) Live preview card — when isLive, the public-GQL stream block also
   carries previewImageURL(640x360), viewersCount, title, game{name}.
   A second card slides in below the main profile row showing the
   current frame at 240×135, eye-icon viewer count, big bold title,
   game, and a red "Jetzt aufnehmen" CTA. Click anywhere on the card
   OR on the button triggers triggerLiveRecording — same path as
   the sidebar REC dot, so the recording reaches the queue with
   identical settings.

3) VOD hover storyboard — Twitch ships a seekPreviewsURL per VOD
   pointing at a JSON manifest of sprite-sheet images, each a grid
   of preview thumbnails spanning the recording. New IPC
   get-vod-storyboard fetches the manifest, picks the high-quality
   first sprite, fetches its bytes as a data URL, and returns the
   grid metadata. Renderer (new renderer-vod-hover.ts) hooks
   delegated mouseover on #vodGrid: 220ms debounce, then on
   activation overlays a div positioned over the thumbnail with
   background-image=sprite + a setInterval cycling
   background-position through 4 evenly-spaced cells at 600ms each.
   Per-VOD result cached client-side so repeated hovers don't
   re-fetch. Negative results (private VODs, expired) are also
   cached so we don't re-query a known-empty manifest.

4) Sticky header — position:sticky;top:0;z-index:20 plus a
   backdrop-filter:blur(6px) so the VOD grid scrolling underneath
   reads through the banner subtly. Header stays anchored to the top
   of .content as the user scrolls hundreds of VODs.

GQL refresher: the public schema rejects `broadcasterType` but
accepts `roles{isPartner isAffiliate}`, plus the same query now
includes bannerImageURL and stream{previewImageURL viewersCount
title game{name}}. One single roundtrip pulls everything we need
for the header AND the live card. The old separate-follower-count
roundtrip (fetchOnlyFollowerCount) is now redundant but kept around
for back-compat in case other call sites grow into it.

Also: profile layout switched from one big flex row to a relative
container with two children (.streamer-profile-row for the meta,
.streamer-profile-live-card for the live block). The .live-card
only renders when isLive — offline streamers get the same compact
header they had before.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 00:55:17 +02:00
..
index.html feat: banner background + live preview card + VOD hover storyboard + sticky header 2026-05-11 00:55:17 +02:00
main.ts feat: banner background + live preview card + VOD hover storyboard + sticky header 2026-05-11 00:55:17 +02:00
preload.ts feat: banner background + live preview card + VOD hover storyboard + sticky header 2026-05-11 00:55:17 +02:00
renderer-archive.ts feat: local archive search — new Archiv tab 2026-05-11 00:26:42 +02:00
renderer-globals.d.ts feat: banner background + live preview card + VOD hover storyboard + sticky header 2026-05-11 00:55:17 +02:00
renderer-locale-de.ts feat: banner background + live preview card + VOD hover storyboard + sticky header 2026-05-11 00:55:17 +02:00
renderer-locale-en.ts feat: banner background + live preview card + VOD hover storyboard + sticky header 2026-05-11 00:55:17 +02:00
renderer-profile.ts feat: banner background + live preview card + VOD hover storyboard + sticky header 2026-05-11 00:55:17 +02:00
renderer-queue.ts feat: live recording health indicator (green/amber dot per item) 2026-05-10 22:04:53 +02:00
renderer-settings.ts feat: auto-merge resumed live-recording parts via ffmpeg concat 2026-05-11 00:29:54 +02:00
renderer-shared.ts fix: persist expanded details across re-renders, guard drag-drop init against duplicates 2026-03-21 15:03:20 +01:00
renderer-stats.ts feat: archive statistics dashboard 2026-05-11 00:20:14 +02:00
renderer-streamers.ts feat: streamer profile header — modern channel-page card above VOD grid 2026-05-11 00:38:38 +02:00
renderer-texts.ts feat: auto-merge resumed live-recording parts via ffmpeg concat 2026-05-11 00:29:54 +02:00
renderer-updates.ts feat: skip-version + addStreamer validation + smart-scheduler tooltip 2026-05-10 12:14:13 +02:00
renderer-vod-hover.ts feat: banner background + live preview card + VOD hover storyboard + sticky header 2026-05-11 00:55:17 +02:00
renderer.ts feat: local archive search — new Archiv tab 2026-05-11 00:26:42 +02:00
styles.css feat: banner background + live preview card + VOD hover storyboard + sticky header 2026-05-11 00:55:17 +02:00
tools.ts refactor: extract tool discovery functions to src/tools.ts 2026-03-20 10:00:51 +01:00
types.ts feat: live recording health indicator (green/amber dot per item) 2026-05-10 22:04:53 +02:00
update-version-utils.ts chore: migrate repository to Codeberg, bump version to 4.2.0, update update logic 2026-03-01 20:23:21 +01:00