diff --git a/design/takeovers/build-takeovers.py b/design/takeovers/build-takeovers.py new file mode 100644 index 0000000..8238c79 --- /dev/null +++ b/design/takeovers/build-takeovers.py @@ -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') diff --git a/design/takeovers/takeovers-1-pairings.png b/design/takeovers/takeovers-1-pairings.png new file mode 100644 index 0000000..85df79e Binary files /dev/null and b/design/takeovers/takeovers-1-pairings.png differ diff --git a/design/takeovers/takeovers-2-guide.png b/design/takeovers/takeovers-2-guide.png new file mode 100644 index 0000000..efe825f Binary files /dev/null and b/design/takeovers/takeovers-2-guide.png differ diff --git a/design/takeovers/takeovers-3-ident.png b/design/takeovers/takeovers-3-ident.png new file mode 100644 index 0000000..78b62bf Binary files /dev/null and b/design/takeovers/takeovers-3-ident.png differ diff --git a/design/takeovers/takeovers-4-kids.png b/design/takeovers/takeovers-4-kids.png new file mode 100644 index 0000000..80b7a50 Binary files /dev/null and b/design/takeovers/takeovers-4-kids.png differ