feat(video): beeldvullende modus en eigen bronlabel voor presentatiedia's

Met '# vullend: ja' vult een beeld het hele frame, zonder kader, label en
voettekst. Dat is nodig voor hele dia's uit een presentatie, die zelf al
een kop en een bronregel hebben. Met '# bronlabel: ...' past de slotkaart
bij iets anders dan een handleiding.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido van Dijk
2026-09-22 22:13:09 +02:00
parent f1167f07c2
commit 62544b10bf
+14 -2
View File
@@ -19,6 +19,7 @@ Opbouw van het script (regels die met [ beginnen zijn koppen, de rest is de gesp
# uitvoer: naam-zonder-extensie # uitvoer: naam-zonder-extensie
# reeks: Reeks Copilot-agents voor school (kopregel op de titelkaart en in de voettekst) # reeks: Reeks Copilot-agents voor school (kopregel op de titelkaart en in de voettekst)
# bron: git.lexconsultancy.nl/guido/copilot-handleidingen (op de slotkaart) # bron: git.lexconsultancy.nl/guido/copilot-handleidingen (op de slotkaart)
# vullend: ja beelden vullen het hele frame (hele dia's uit een presentatie)
[titel] de titelkaart [titel] de titelkaart
[beeld: bestand.jpg] een schermafbeelding uit beelden/, met een label [beeld: bestand.jpg] een schermafbeelding uit beelden/, met een label
[beeld: bestand.jpg | label] [beeld: bestand.jpg | label]
@@ -45,6 +46,8 @@ LOGO_LAI = HERE / "logo-ai-netwerk-limburg.png"
LOGO_LEX = HERE / "logo-lex.png" LOGO_LEX = HERE / "logo-lex.png"
BRON = "git.lexconsultancy.nl/guido/copilot-handleidingen" BRON = "git.lexconsultancy.nl/guido/copilot-handleidingen"
REEKS = "Reeks Copilot-agents voor school" REEKS = "Reeks Copilot-agents voor school"
VULLEND = False # bij "# vullend: ja" vullen de beelden het hele frame (presentatiedia's)
BRONLABEL = "Handleiding, instructies en beelden" # aan te passen met "# bronlabel: ..."
def font(size, bold=False): def font(size, bold=False):
@@ -98,7 +101,7 @@ def kaart_slot(titel, dest):
for line in wrap(d, titel, font(80, True), 1300): for line in wrap(d, titel, font(80, True), 1300):
d.text((128, y), line, font=font(80, True), fill=LIGHT); y += 96 d.text((128, y), line, font=font(80, True), fill=LIGHT); y += 96
y += 30 y += 30
for line in ["Handleiding, instructies en beelden: " + BRON, for line in [BRONLABEL + ": " + BRON,
"Alles mag gekopieerd en bewerkt worden onder CC BY-SA 4.0, met bronvermelding.", "Alles mag gekopieerd en bewerkt worden onder CC BY-SA 4.0, met bronvermelding.",
"Namen van producten zijn merken van hun eigenaren."]: "Namen van producten zijn merken van hun eigenaren."]:
d.text((128, y), line, font=font(32), fill="#D9DEE6"); y += 48 d.text((128, y), line, font=font(32), fill="#D9DEE6"); y += 48
@@ -121,6 +124,13 @@ def kaart_tekst(kop, regels, dest):
def kaart_beeld(pad, label, dest): def kaart_beeld(pad, label, dest):
if VULLEND: # hele dia's uit een presentatie: beeldvullend, zonder kader en voettekst
shot = Image.open(pad).convert("RGB")
img = Image.new("RGB", (W, Hh), DARK)
k = min(W / shot.width, Hh / shot.height)
shot = shot.resize((round(shot.width * k), round(shot.height * k)), Image.LANCZOS)
img.paste(shot, ((W - shot.width) // 2, (Hh - shot.height) // 2))
img.save(dest); return
img = Image.new("RGB", (W, Hh), LIGHT2); d = ImageDraw.Draw(img) img = Image.new("RGB", (W, Hh), LIGHT2); d = ImageDraw.Draw(img)
shot = Image.open(pad).convert("RGB") shot = Image.open(pad).convert("RGB")
box_w, box_h = W - 2 * 96, Hh - 160 - 80 box_w, box_h = W - 2 * 96, Hh - 160 - 80
@@ -226,8 +236,10 @@ def main():
script = Path(sys.argv[1]).resolve() script = Path(sys.argv[1]).resolve()
map_ = script.parent map_ = script.parent
meta, segs = lees_script(script) meta, segs = lees_script(script)
global BRON, REEKS global BRON, REEKS, VULLEND, BRONLABEL
BRON = meta.get("bron", BRON); REEKS = meta.get("reeks", REEKS) BRON = meta.get("bron", BRON); REEKS = meta.get("reeks", REEKS)
VULLEND = meta.get("vullend", "nee").lower() in ("ja", "yes", "true")
BRONLABEL = meta.get("bronlabel", BRONLABEL)
stem = meta.get("stem", "nl-NL-FennaNeural"); tempo = meta.get("tempo", "-5%") stem = meta.get("stem", "nl-NL-FennaNeural"); tempo = meta.get("tempo", "-5%")
naam = meta.get("uitvoer", script.stem.replace("video-script", "video")) naam = meta.get("uitvoer", script.stem.replace("video-script", "video"))
pauze = 0.8 # seconden stilte na elk segment pauze = 0.8 # seconden stilte na elk segment