Commit Graph

21 Commits

Author SHA1 Message Date
44r0n7 31bcd85fc7 README: add demo link, fix tagline, Windows server option, demo mode, PWA/HTTPS note, hosting section 2026-05-28 16:58:48 -04:00
44r0n7 ef40bc2092 README: drop personal Brave note from ads section 2026-05-28 16:54:35 -04:00
44r0n7 ff74d6215f README: add note on YouTube ads and adblocker options 2026-05-28 16:53:32 -04:00
44r0n7 a26e703f17 Add README with quick start, API key setup, and feature docs 2026-05-28 16:43:19 -04:00
44r0n7 07f9cd310e Add channel number flash overlay and prefetch-based bad-video skip
- CH n flash overlay (#ch-flash) fades in/holds/fades out on channel switch
- Prefetch state (prefetchNext/prefetchOk) skips known-bad videos at ENDED
- Reduce onPErr skip delay 1.2s → 0.4s now that prefetch catches most cases
2026-05-28 16:39:33 -04:00
Aaron bd4613b6f2 Fix YouTube title reappearing: oversize height in portrait to clip title off-screen
Portrait (vw < vh): w=vw (no horizontal overflow), h=vh+120 so the iframe
extends 60px above the viewport. The YouTube title bar at the iframe top sits
at y≈-60px and is clipped by #pw overflow:hidden — same mechanism as before.
YouTube letterboxes the 16:9 video within the tall iframe; black bars top/bottom.

Landscape/desktop: restored original formula (vw×1.12 / vh×1.7778) unchanged.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 19:34:42 -04:00
Aaron 20cc10fbc9 Fix mobile portrait video overflow + preserve YouTube title hiding
sizePW() rewritten: iframe height is always exactly vh so the top of the iframe
aligns with y=0. The YouTube title bar (shown briefly on play) falls within the
52px #tb overlay (z-index:5) and stays hidden.

Portrait (vw/vh < 16:9): w=vw, h=vh — YouTube letterboxes the 16:9 video
  internally; no horizontal overflow.
Landscape / ultrawide (vw/vh >= 16:9): h=vh, w=min(vw, vh×1.778) — no vertical
  cropping; side black bars from #pw background on very wide screens.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 19:30:35 -04:00
Aaron c1e5fa0fc5 Time display: always visible, brighter color, subtle text-shadow
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 19:19:49 -04:00
Aaron 36f7a7e439 Add video time display to scrubber (fades in on hover)
- #pb-time span inside #pb-wrap, absolutely positioned right:8px
- Shows current / total in m:ss format (e.g. 1:23 / 4:56)
- Fades in on scrubber hover, hidden otherwise
- fmtTime() helper added to utilities section

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 19:18:32 -04:00
Aaron 40dfcbb257 Center progress bar vertically within scrubber hit area
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 19:15:47 -04:00
Aaron d7c25573be Layout: move ticker above scrubber, shrink scrubber, sidebar closes on channel select
- #pb-wrap height 16px → 10px (less imposing hit target)
- #np-strip bottom raised to calc(var(--bot-h) + 10px) — sits directly above scrubber
- loadChSB() always closes sidebar (was desktop-only skip; now consistent with addPlayCh)

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 19:13:54 -04:00
Aaron c0219932a0 Refactor: persist search results, expand scrubber, error handling, comments
- addCh() no longer calls renderTab() so search results survive ADD clicks
- Progress bar hit target expanded to 16px (visual stays 3px, 6px on hover)
- np-strip gets pointer-events:none so scrubber clicks aren't blocked
- pb-thumb reanchored with top:50% translateY(-50%) for any bar height
- apiFetch() and validateKey() wrap fetch in try-catch for network errors
- stopVideo() in loadCh() wrapped in try-catch for consistency
- Comments added throughout: section banners, function docs, inline notes

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 19:06:15 -04:00
Aaron 90642b22ec Tighten bottom UI, fix ch-bug/ticker/hamburger, reduce gradients
Layout:
- Move NOW PLAYING ticker into #np-strip above scrubber; #bb is controls-only at 46px
- --bot-h: 76px → 46px; #tc repositioned to clear new ticker strip
- #np-strip added to idle slide-out animation

Bug fixes:
- Channel bug (#ch-bug) now hides during title card display, restores after
- Reset A.npTitle/A.npArtist in loadCh() so ticker always updates on channel change
- Hamburger (☰) and C key always open to MY LIST tab

Visual:
- .gt gradient 140px → 72px, .gb gradient 220px → 140px (less intrusive)

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 12:41:29 -04:00
Aaron e5780b2c17 Fix ticker vertical clip and increase iframe overscan for YT title
- Remove margin-top:-10px from #np-ticker — leftover from old single-row layout,
  combined with overflow:hidden on .np-wrap it was pushing text top outside the
  container and clipping it
- Increase iframe overscan 1.04→1.12 (6% per side instead of 2%), pushing the
  YouTube title overlay ~115px off-screen at 1920px viewport width

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 12:18:59 -04:00
Aaron df0399bb3b Add GET API KEY button to setup screen, enlarge demo mode link
- Add secondary .btn-s (cyan outline) button above ENTER VIDFLOW that opens the API key guide modal
- Simplify the hint text — the button makes the action self-evident
- Increase .sp-skip font-size 11px → 13px, brighten demo mode link color
- Wire #get-key-btn in initApiGuide() alongside existing #api-guide-btn

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 12:07:47 -04:00
Aaron b0582bab9f Fix API key guide with accurate step-by-step flow
Corrected based on actual Google Cloud Console experience:
- Step 3 is now 'Create credentials' button on the API details page (not left sidebar)
- Choose Public data → Next to generate the key
- Key shown immediately on screen; can copy and use as-is
- Optional restriction flow: Restrict key → type youtube → select API → OK → Save → Credentials sidebar → Show key

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 12:00:59 -04:00
Aaron 9095d27ffb Fix ticker clipping, remove gear icon, add ENDED fallback, persist shuffle, add API key guide modal
- Remove overflow:hidden from .bb-top; give .np-wrap explicit 26px height to stop ticker text being vertically clipped
- Remove redundant gear icon from top bar (settings accessible via hamburger menu)
- ENDED state: try nextVideo(), fallback to playVideoAt(0) after 1.2s so last-video playlists loop
- Persist shuffle state to localStorage from both the toolbar button and S keyboard shortcut
- Replace setup hint with direct YouTube API link + "What's an API key?" modal with 4-step guide for first-time users

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 11:50:46 -04:00
Aaron 8be980a554 Run 3: settings sidebar panel
- Gear button opens sidebar to new SETTINGS tab (replaces confirm dialog)
- Settings: API key management (save/clear), shuffle toggle, volume slider, hotkeys reference
- Shuffle state persisted to vf_shuffle localStorage key
- Volume restored on player ready from vf_volume localStorage key

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 11:15:31 -04:00
Aaron 7318d7ed7f Run 2: layout restructure and pop-out overlay
- Bottom bar: two-row layout — ticker above centered controls
- Ticker speed halved (0.5px/frame) and longer bottom bar (76px)
- Pop-out overlay: shows "PLAYING IN MINI PLAYER" when popup is open
- Pop-out re-press: focuses existing popup window instead of opening a new one
- Clear overlay and popoutWin ref when video returns from popup

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 11:13:07 -04:00
Aaron 04fffb11d6 Run 1: bug fixes and CSS polish
- Fix keyboard shortcuts breaking after +/- channel change (window.focus on PLAYING)
- Fix + and gear buttons not staying open (document close handler exclusions)
- Remove hotkey hint bar (moved to settings panel later)
- Title truncation: 2-line clamp for playlist and channel list titles
- sizePW: 4% buffer ensures YouTube native title never bleeds into viewport
- Mobile: hide pop-out button on ≤600px

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 11:10:46 -04:00
Aaron fa63f4d956 Initial implementation: single-file MTV-style music video TV channel PWA
Includes all spec features plus pop-out player with bidirectional video transfer:
- YouTube IFrame API + Data API v3 channel management
- Idle/broadcast mode, channel flip animation, NCO onboarding
- Pop-out player (⧉/P) transfers video to popup; P closes and returns it

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 10:35:02 -04:00