every.channel/apps/web/index.html
Conrad Kramer 797f96e7eb
Some checks are pending
ci-gates / checks (push) Waiting to run
deploy-cloudflare / checks (push) Waiting to run
deploy-cloudflare / deploy (push) Blocked by required conditions
Speed up station guide startup
2026-06-10 02:34:44 -07:00

170 lines
6.6 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>every.channel</title>
<meta name="description" content="Watch live television from every.channel." />
<link rel="preconnect" href="https://relay.every.channel" />
<link rel="preconnect" href="https://esm.sh" />
<link rel="modulepreload" href="https://esm.sh/@moq/watch@0.2.10/element" />
<link data-trunk rel="css" href="style.css" />
<link data-trunk rel="copy-file" href="app.js" />
<link data-trunk rel="copy-dir" href="assets" />
</head>
<body>
<main class="watchSurface">
<header class="topbar" aria-label="Watch controls">
<a class="brand" href="/" aria-label="every.channel">
<span class="brandLens" aria-hidden="true"></span>
<span>every.channel</span>
</a>
<label class="quickTune">
<span class="quickTuneLabel">Channel</span>
<input id="broadcastName" class="quickTuneInput" type="text" spellcheck="false" />
</label>
<button id="watchBtn" class="primaryButton" type="button">Watch</button>
<button id="refreshListBtn" class="roundButton" type="button" aria-label="Scan channels">
<span class="scanIcon" aria-hidden="true"></span>
</button>
</header>
<section class="stageGrid">
<section class="playerStack" aria-label="Live player">
<div class="television">
<div id="playerMount" class="mount">
<div class="idleScreen">
<div class="idlePlate">
<span class="playGlyph" aria-hidden="true"></span>
<strong>Pick a channel</strong>
</div>
</div>
</div>
<section class="controlShelf" aria-label="Playback controls">
<div class="nowLine">
<div>
<div class="kicker">Now</div>
<div id="nowTitle" class="nowTitle">Ready</div>
</div>
<div id="hint" class="hint" aria-live="polite"></div>
</div>
<div class="scrubDeck">
<button class="transportButton" type="button" aria-label="Back">
<span class="backGlyph" aria-hidden="true"></span>
</button>
<label class="scrubberWrap" aria-label="Scrub">
<input id="watchScrubber" class="scrubber" type="range" min="0" max="100" value="78" />
<span class="chapterMarks" aria-hidden="true"></span>
</label>
<button class="transportButton" type="button" aria-label="Forward">
<span class="forwardGlyph" aria-hidden="true"></span>
</button>
</div>
<div class="toolRow">
<button id="clipStartBtn" class="toolButton" type="button">Clip start</button>
<button id="clipEndBtn" class="toolButton" type="button">Clip end</button>
<button id="copyClipBtn" class="toolButton" type="button">Copy clip</button>
<button id="multiViewBtn" class="toolButton pressed" type="button">Multiview</button>
</div>
</section>
</div>
<section class="multiview" aria-label="Multiview">
<div id="multiViewGrid" class="multiViewGrid">
<button class="miniScreen tileA" type="button">News</button>
<button class="miniScreen tileB" type="button">Game</button>
<button class="miniScreen tileC" type="button">Weather</button>
<button class="miniScreen tileD" type="button">Kitchen</button>
</div>
</section>
</section>
<aside class="channelRail" aria-label="Channels">
<div class="railHead">
<div>
<div class="kicker">Channels</div>
<div id="listHint" class="listHint" aria-live="polite"></div>
</div>
<div class="modeSwitch" aria-label="Mode">
<button id="liveModeBtn" class="modeButton pressed" type="button">Live</button>
<button id="dvrModeBtn" class="modeButton" type="button">DVR</button>
</div>
</div>
<div id="liveList" class="liveList"></div>
<details id="signalDrawer" class="signalDrawer">
<summary>Signal</summary>
<div class="signalGrid">
<label class="field">
<span>Address</span>
<input id="relayUrl" class="input" type="text" spellcheck="false" />
</label>
<label class="checkField">
<input id="archiveMode" type="checkbox" />
<span>DVR replay</span>
</label>
<button id="copyLinkBtn" class="secondaryButton" type="button">Copy link</button>
<div id="shareLink" class="shareLink" aria-live="polite"></div>
</div>
</details>
</aside>
</section>
</main>
<script id="initialPublicStreams" type="application/json">
{
"now_ms": 1781081086809,
"entries": [
{
"stream_id": "la-kcbs",
"title": "KCBS Los Angeles",
"relay_url": "https://relay.every.channel/anon",
"broadcast_name": "la-kcbs",
"track_name": "0.m4s"
},
{
"stream_id": "la-ktla",
"title": "KTLA",
"relay_url": "https://relay.every.channel/anon",
"broadcast_name": "la-ktla",
"track_name": "0.m4s"
},
{
"stream_id": "la-kcet",
"title": "KCET",
"relay_url": "https://relay.every.channel/anon",
"broadcast_name": "la-kcet",
"track_name": "0.m4s"
},
{
"stream_id": "la-pbs-socal",
"title": "PBS SoCal",
"relay_url": "https://relay.every.channel/anon",
"broadcast_name": "la-pbs-socal",
"track_name": "0.m4s"
},
{
"stream_id": "la-nbc4",
"title": "NBC4 Los Angeles",
"relay_url": "https://relay.every.channel/anon",
"broadcast_name": "la-nbc4",
"track_name": "0.m4s"
},
{
"stream_id": "la-kcop",
"title": "KCOP",
"relay_url": "https://relay.every.channel/anon",
"broadcast_name": "la-kcop",
"track_name": "0.m4s"
}
]
}
</script>
<script type="module" src="app.js"></script>
</body>
</html>