Design: channel takeovers
pauljd/davidson-ci: Davidson CI / quality (push) Failing after 1m49s
pauljd/davidson-ci: Davidson CI / ai-review (push) Failing after 1m32s

Paul, 6 November 2026, after NostalgiaTV's Channel Redirect: at set hours a
channel becomes another with its own name, mark, ident and programmes.
Suggested pairings (ToonZ Late, Nite Owl, Tots Dreamtime, Terra Starlight),
the guide across a switchover, the switchover ident, and what Kids sees.
For approval only.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-11-06 01:12:52 +00:00
co-authored by Claude Opus 5.5
parent 37d1d51865
commit 52872b8a12
5 changed files with 88 additions and 0 deletions
+88
View File
@@ -0,0 +1,88 @@
#!/usr/bin/env python3
"""Channel takeovers, design proposal (Paul, 6 November 2026, after NostalgiaTV's Channel Redirect): at set hours a channel
becomes another, with its own name, mark, ident and programmes, then hands back. Suggested pairings for Paul to choose from.
Kids never sees a grown-up takeover. Drawn with the squeeze-back design's helpers and the cast. For approval only."""
import ast
from pathlib import Path
HERE = Path(__file__).resolve().parent
SRC = HERE.parent / 'squeeze-back' / 'build-squeeze-back.py'
tree = ast.parse(SRC.read_text())
keep = []
for n in tree.body:
if isinstance(n, ast.Expr) and isinstance(n.value, ast.Constant): continue
if isinstance(n, ast.Expr) and isinstance(n.value, ast.Call) and getattr(n.value.func, 'id', '') == 'screen': break
keep.append(n)
ns = {'__file__': str(SRC)}
exec(compile(ast.Module(keep, []), str(SRC), 'exec'), ns)
globals().update({k: v for k, v in ns.items() if k not in ('HERE', '__file__', 'save')})
def save(name): G['im'].resize((W, H), Image.LANCZOS).save(HERE / name); print(name)
def mark(x, y, name, colour, size=40):
"""A takeover's own wordmark: Orbit's moon swoosh and the name, in its colour."""
D().arc((S(x), S(y + 4), S(x + size * .9), S(y + size * .9 + 4)), 100, 330, fill=WHITE, width=SW(size * .08))
text((x + size * 1.05, y), name, anton(size), colour)
PAIRS = [('toonz_epg', 'ToonZ', 'TOONZ LATE', (255, 122, 198), '22:00–05:00', 'Grown-up animation after the kids are in bed', 'Blaze'),
('orbit_junior_epg', 'Junior', 'NITE OWL', (255, 194, 61), '21:00–06:00', 'Classic sitcoms all night, like Nick at Nite', 'Luna'),
('orbit_tots_epg', 'Tots', 'TOTS DREAMTIME', (167, 123, 255), '19:00–06:00', 'Wind-down shows as a night channel, with Luna', 'Luna'),
('orbit_terra_epg', 'Terra', 'TERRA STARLIGHT', (110, 220, 170), '22:00–06:00', 'Space and night-sky documentaries', 'Drift')]
# 1. The pairings to choose from.
screen()
text((80, 70), 'CHANNEL TAKEOVERS', anton(56), YELLOW)
text((80, 150), 'At set hours a channel becomes another, with its own name, mark, ident and programmes, then hands back. Pick the ones you like.', reg(28), MUTED)
for i, (lg, base, name, col, hours, line, host) in enumerate(PAIRS):
y = 230 + i * 190
box(80, y, 1760, 170, fill=NAVY if i == 0 else PANEL, r=16, outline=YELLOW if i == 0 else None, width=4)
logo(RES / f'{lg}.webp', 110, y + 40, 220)
D().line([(S(352), S(y + 85)), (S(410), S(y + 85))], fill=MUTED, width=SW(5)); D().polygon([(S(410), S(y + 72)), (S(428), S(y + 85)), (S(410), S(y + 98))], fill=MUTED)
mark(440, y + 40, name, col, 54)
text((1100, y + 34), hours, semi(34), WHITE)
text((1100, y + 84), line, reg(26), MUTED)
who = {'Blaze': lambda c: blaze(c, 40, (255, 138, 61)), 'Luna': lambda c: luna(c, 42, (167, 123, 255)), 'Drift': lambda c: drift(c, 42, (53, 214, 242))}[host]
who((1770, y + 85))
keys([('▲▼', 'Move'), ('OK', 'Turn on or off'), ('Back', 'Settings')])
save('takeovers-1-pairings.png')
# 2. The guide across the switchover: the row's name and mark change with the hour.
screen()
text((80, 70), 'TV GUIDE', anton(44), WHITE)
box(60, 150, 1800, 48, fill=BLUE, r=0); text((80, 158), 'Thursday', semi(28), WHITE)
for i, tm in enumerate(('21:00', '21:30', '22:00', '22:30', '23:00')): text((420 + i * 290, 158), tm, semi(28), WHITE)
rows = [('toonz_epg', [('Ben 10', 0, 1, 'now'), ('Danny Phantom', 1, 2, 'later')], [('Futurama', 2, 3), ('King of the Hill', 3, 4), ('The Simpsons', 4, 5)]),
('orbit_junior_epg', [], [('Cheers', 0, 1), ('Frasier', 1, 2), ('Taxi', 2, 3), ('M*A*S*H', 3, 4), ('Cheers', 4, 5)])]
for r, (lg, before, after) in enumerate(rows):
y = 210 + r * 120
box(60, y, 340, 100, fill=PANEL, r=0)
if r == 0: logo(RES / f'{lg}.webp', 80, y + 26, 220)
else: mark(80, y + 26, 'NITE OWL', (255, 194, 61), 40)
for title, a, b, state in before:
box(410 + a * 290, y, (b - a) * 290 - 6, 100, fill=(24, 66, 130) if state == 'now' else (15, 44, 92), r=0); text((430 + a * 290, y + 34), title, reg(28), WHITE)
for title, a, b in after:
box(410 + a * 290, y, (b - a) * 290 - 6, 100, fill=(60, 30, 70) if r == 0 else (70, 55, 20), r=0); text((430 + a * 290, y + 34), title, reg(28), WHITE)
if r == 0:
D().line((S(410 + 2 * 290 - 3), S(y - 6)), (S(410 + 2 * 290 - 3), S(y + 106)), fill=(255, 122, 198), width=SW(5)) if False else D().line([(S(407 + 2 * 290), S(y - 6)), (S(407 + 2 * 290), S(y + 106))], fill=(255, 122, 198), width=SW(5))
mark(410 + 2 * 290 + 10, y + 250, 'TOONZ LATE starts here', (255, 122, 198), 28)
text((80, 500), 'From 22:00 the ToonZ row takes on ToonZ Late\'s mark and colour, and its programmes. Junior is Nite Owl for the whole evening.', reg(28), MUTED)
text((80, 545), 'The corner logo during programmes and What\'s On change with it; the channel number stays the same.', reg(28), MUTED)
save('takeovers-2-guide.png')
# 3. The switchover ident.
screen()
box(0, 0, W, H, fill=(40, 18, 52), r=0)
for k in range(30): circ((100 + (k * 263) % 1700, 80 + (k * 137) % 900), 2, (120, 70, 140))
mark(560, 330, 'TOONZ LATE', (255, 122, 198), 120)
text((960, 560), 'Starts now: grown-up cartoons till 5am', semi(44), WHITE, 'ma')
blaze((420, 760), 70, (255, 138, 61)); zip_((1500, 740), 64, (255, 79, 163))
motion(1290, 860, 560, 150, ['Plays once, at the takeover\'s first hour, in the', 'channel ident\'s place. Still with Reduce motion.'])
save('takeovers-3-ident.png')
# 4. What Kids sees during a grown-up takeover.
screen()
box(560, 200, 800, 600, fill=DEEP, r=24)
luna((960, 360), 110, (167, 123, 255))
text((960, 520), 'ToonZ is asleep', anton(56), WHITE, 'ma')
text((960, 610), "It's grown-up cartoons until 5am. Back for Kids at 6am.", reg(30), MUTED, 'ma')
text((960, 680), 'Up and down still go to Kids\' other channels.', reg(26), MUTED, 'ma')
text((960, 880), 'Kids profile: a grown-up takeover never shows; the channel rests with Luna instead.', reg(28), MUTED, 'ma')
save('takeovers-4-kids.png')
Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB