From 92b3f6d256ce7572a8370c4295b735c93d0d8512 Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Tue, 1 Sep 2026 18:14:04 -0400 Subject: [PATCH] TV mode: channel-surf dwell cap, code-first corner type, AV sync knobs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No work holds the channel past 3 minutes in ?tv mode — the hour-long performances yield to the tiktok-scale ones. The corner label becomes a broadcast stack: 46px code, 32px title, 20px byline; QR eases to 140px. rig.sh trims pulse capture buffering (fragment_size 1024) and gains an AV_OFFSET dial for trimming stream A/V alignment. Claude-Session: https://claude.ai/code/session_01EaVptJ3ZhyeQ9ZZZNcp55T --- system/public/whistlegraph.org/tv.html | 14 +++++++++++--- toolchain/tv/rig.sh | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/system/public/whistlegraph.org/tv.html b/system/public/whistlegraph.org/tv.html index 16b8e65b3b..6b60a18d0e 100644 --- a/system/public/whistlegraph.org/tv.html +++ b/system/public/whistlegraph.org/tv.html @@ -60,10 +60,12 @@ /* 📺 broadcast mode (?tv=1) — the rig's Chrome is the viewer, a couch is the reader: label scales for a living room and never dims, the QR grows to scan-from-the-sofa size, and the progress hair leaves the floor. */ - body.tv #label{max-width:86vw;font:600 26px var(--mono);opacity:1} - body.tv #label .meta{font:17px var(--mono)} + body.tv #label{max-width:86vw;opacity:1} + body.tv #label .code{display:block;font:600 46px var(--mono);letter-spacing:.03em} + body.tv #label .title{display:block;margin-left:0;font:600 32px var(--mono);margin-top:2px} + body.tv #label .meta{font:20px var(--mono);margin-top:5px} body.tv.idle #label{opacity:1} - body.tv #qr{width:200px;height:200px} + body.tv #qr{width:140px;height:140px} body.tv #bar{display:none} @@ -86,6 +88,11 @@ const CDN="https://assets.aesthetic.computer/whistlegraph"; const IDX=CDN+"/index"; // 📺 ?tv=1 — broadcast mode for the rig's Chrome (big label, big QR, no bar). if(new URLSearchParams(location.search).has("tv"))document.body.classList.add("tv"); +const TV=document.body.classList.contains("tv"); +// Television surfs: no single work may hold the channel longer than this — +// the hour-long performances yield to the tiktok-scale ones. +const TV_DWELL_MS=180000; +let dwellTimer=null; const fmtViews=v=>v>=1e6?`${(v/1e6).toFixed(1)}M`:v>=1e3?`${Math.round(v/1e3)}K`:`${v}`; let WORKS=[]; // playable channel entries: {code,title,by,views,src,poster,dead} @@ -161,6 +168,7 @@ function play(i,push=true){ front.muted=document.body.dataset.sound!=="on"; front.currentTime=0; front.play().catch(()=>{}); + if(TV){ clearTimeout(dwellTimer); dwellTimer=setTimeout(next,TV_DWELL_MS); } showLabel(w); // stage the next pick in the back screen const peek=deck.length?deck[deck.length-1]:null; diff --git a/toolchain/tv/rig.sh b/toolchain/tv/rig.sh index f5261106ba..754ed0c8fc 100755 --- a/toolchain/tv/rig.sh +++ b/toolchain/tv/rig.sh @@ -119,7 +119,7 @@ exec ffmpeg -hide_banner -loglevel warning \ -thread_queue_size 1024 -use_wallclock_as_timestamps 1 \ -f x11grab -framerate "$FPS" -video_size "$SIZE" -i "$DISPLAY_NUM" \ -thread_queue_size 1024 -use_wallclock_as_timestamps 1 \ - -f pulse -i "${SINK}.monitor" \ + -itsoffset "${AV_OFFSET:-0}" -f pulse -fragment_size 1024 -i "${SINK}.monitor" \ $SCALE_ARGS \ -af "aresample=async=1:first_pts=0" \ -fps_mode cfr \ -- 2.54.0