diff --git a/design/catch-up/build-catchup.py b/design/catch-up/build-catchup.py index 1c7e8fb..3527395 100644 --- a/design/catch-up/build-catchup.py +++ b/design/catch-up/build-catchup.py @@ -133,3 +133,43 @@ d.text((340, 205), 'Orbit switches off in 1 minute', font=semi(40), fill=WHITE) d.text((340, 262), 'Press any button to keep watching', font=reg(30), fill=MUTED) im.save(HERE / 'sleep-timer.png') print('done') + +# 5. The Catch Up page, from the main menu's nav bar. +im, d = screen() +d.text((70, 30), 'ORBIT', font=semi(54), fill=WHITE) +x = 300 +for label in ('Home', "What's On", 'TV Guide', 'Catch Up', 'Drive-In', 'Arcade'): + on = label == 'Catch Up' + w = d.textlength(label, font=semi(32)) + 40 + d.text((x + 20, 42), label, font=semi(32), fill=WHITE if on else MUTED) + if on: d.rectangle((x + w / 2 - 28, 88, x + w / 2 + 28, 92), fill=YELLOW) + x += w + 10 +d.text((1640, 30), '20:14', font=cond(44), fill=WHITE); d.text((1600, 80), 'Thursday 5 November', font=reg(22), fill=MUTED) +d.text((70, 130), 'CATCH UP', font=anton(56), fill=GREEN); d.text((360, 150), 'Anything shown on Orbit in the last two days, from the start', font=reg(30), fill=MUTED) +def card(x, y, w, h, channel, title, sub, when, focus=False): + box(d, x, y, w, h, fill=(28, 58, 112) if focus else PANEL, r=10, outline=YELLOW if focus else None, width=4) + d.text((x + 20, y + 16), channel.upper(), font=semi(22), fill=GREEN if not focus else YELLOW) + t = title + while d.textlength(t, font=semi(32)) > w - 40 and len(t) > 3: t = t[:-2].rstrip() + '…' + d.text((x + 20, y + 46), t, font=semi(32), fill=WHITE) + s2 = sub + while d.textlength(s2, font=reg(24)) > w - 40 and len(s2) > 3: s2 = s2[:-2].rstrip() + '…' + d.text((x + 20, y + 90), s2, font=reg(24), fill=MUTED); d.text((x + 20, y + 124), when, font=reg(24), fill=MUTED) + catch_mark(d, x + w - 52, y + 18, YELLOW if focus else GREEN) +d.text((70, 215), 'JUST MISSED', font=semi(30), fill=WHITE) +# Newest first. +just = [('Orbit 1', 'Family Matters', 'S2 E3 · Rock Video', 'Ended 20:00', True), ('Heroes', 'Batman: TAS', 'Two-Face (1)', 'Ended 19:50', False), + ('Evidence', 'NCIS', 'S4 E12 · Driven', 'Ended 19:45', False), ('Terra', 'Blue Planet', 'Ep 4 · Coral Seas', 'Ended 19:30', False), ('Paradox', 'Doctor Who', 'S3 E8 · Human Nature (1)', 'Ended 18:45', False)] +for k, (ch, t, sub, when, focus) in enumerate(just): card(70 + k * 362, 260, 346, 166, ch, t, sub, when, focus) +d.text((70, 460), 'EARLIER TODAY', font=semi(30), fill=WHITE) +today = [('Vortex', 'Dragon Ball Z', 'S2 E14 · Goku vs. Vegeta', '16:30 to 17:00'), ('Dark Files', 'Unsolved Mysteries', 'S1 E8', '15:00 to 16:00'), + ('Orbit Wild', 'Man vs. Wild', 'S3 E2 · Alps', '14:00 to 15:00'), ('Odyssey', 'Cosmos', 'Ep 3 · When Knowledge…', '13:00 to 14:00'), ('Riot', 'The Simpsons', 'S6 E25 · Who Shot Mr. Burns (1)', '12:30 to 13:00')] +for k, (ch, t, sub, when) in enumerate(today): card(70 + k * 362, 505, 346, 166, ch, t, sub, when) +d.text((70, 705), 'YESTERDAY', font=semi(30), fill=WHITE) +yday = [('After Dark', 'The Thing', '1982 · John Carpenter', 'Wed 23:00'), ('Premiere', 'Dune: Part Two', '2024', 'Wed 20:00'), + ('BritX', 'Hot Fuzz', '2007', 'Wed 21:00'), ('Orbit 2', 'Top Gear', 'S14 E3', 'Wed 19:00'), ('Wonder', 'Paddington 2', '2017', 'Wed 17:00')] +for k, (ch, t, sub, when) in enumerate(yday): card(70 + k * 362, 750, 346, 166, ch, t, sub, when) +d.text((70, 940), 'Newest first; each row scrolls on. A programme stays two days after it airs, and a two-part story shows its part 1.', font=reg(26), fill=MUTED) +keys(d, [('◄►', 'Move'), ('▲▼', 'Rows'), ('OK', 'Catch Up'), ('Back', 'Home')], y=1000) +im.save(HERE / 'catch-up-5-page.png') +print('page done') diff --git a/design/catch-up/catch-up-5-page.png b/design/catch-up/catch-up-5-page.png new file mode 100644 index 0000000..22840ed Binary files /dev/null and b/design/catch-up/catch-up-5-page.png differ diff --git a/docs/roadmap.md b/docs/roadmap.md index 15fab0c..bb00763 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -392,7 +392,7 @@ The project is now in git, so each release can also be rolled back from its comm Paul will watch Orbit for a few weeks first, so the channels, the Director's Chair and its learning mature on real use before anyone else gets it. In rough order: -1. **Catch-up:** watch a programme that aired in the last couple of days from the start; the channel itself carries on. Designed 5 November 2026 (design/catch-up): the guide scrolls back two days, past programmes carry a Catch Up mark, OK on one opens the Catch Up pop-up (Hold OK stays the number box), a two-part story offers both parts. Awaiting approval, then build. +1. **Catch-up:** watch a programme that aired in the last couple of days from the start; the channel itself carries on. Designed 5 November 2026 (design/catch-up): the guide scrolls back two days, past programmes carry a Catch Up mark, OK on one opens the Catch Up pop-up (Hold OK stays the number box), a two-part story offers both parts; plus a Catch Up tab in the nav bar (Home, What's On, TV Guide, Catch Up, Drive-In, Arcade) with Just missed, Earlier today and Yesterday rows. Paul liked the design (5 Nov); build next, sleep timer first. 2. **Sleep timer:** fade out and stop after 30, 60 or 90 minutes. 3. **First run (pre-launch setup):** a guided first launch that connects a library, checks it against Orbit's channel presets and switches on the channels it can fill; sets the After Dark lock (a PIN on After Dark and The Late Show) and the sleep timer there too. 4. **More media servers:** beyond Emby, Plex, Jellyfin and Silo (a new open-source media server, https://siloserver.org/), behind one library interface so the scheduler, the Chair and the Drive-In don't care which server it is.