Design: channel takeovers
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:
@@ -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 |
Reference in New Issue
Block a user