intro-outro-generator/fsck2025/__init__.py

204 lines
6.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/python3
from renderlib import *
from schedulelib import *
from easing import *
# URL to Schedule-XML
scheduleUrl = "https://cfp.ctbk.de/fsck-2024/schedule/export/schedule.xml"
def introFrames(args):
frames = 1 * fps
for _ in range(0, frames):
yield (
("title", "style", "opacity", 0),
("persons", "style", "opacity", 0),
("glogo", "style", "opacity", 0),
("sparkle", "style", "opacity", 0),
)
# fade in logo
frames = 3 * fps
for i in range(0, frames):
# source: matrix(0.66093871,0,0,0.66093871,325.49887,111.96043)
# target: matrix(1, 0, 0, 1, 0, 0)
size = 0.66 + easeInOutQuad(i, 0.0, 1.0 - 0.66, frames)
posx = easeInOutQuad(frames - i, 0.0, 325.49887, frames)
posy = easeInOutQuad(frames - i, 0.0, 111.96043, frames)
yield (
(
"glogo",
"attr",
"transform",
# the easing function cant handle easing from larger to smaller, so use this hacky workaround
f"translate(0,{easeInQuad(frames - i, 0.0, 200.0, frames)})",
),
("glogo", "style", "opacity", easeOutQuad(i, 0, 1, frames)),
# scale in the fsck text banner behind the foreground elements
# target size is 5.414656 in both x and y
(
"fsck-banner",
"attr",
"transform",
f"matrix({size:.4f},0,0,{size:.4f},{posx:.4f},{posy:.4f})",
),
("title", "style", "opacity", 0),
("persons", "style", "opacity", 0),
("sparkle", "style", "opacity", 0),
)
frames = 1 * fps
for i in range(0, frames):
yield (
("glogo", "style", "opacity", 1),
("title", "style", "opacity", 0),
("persons", "style", "opacity", 0),
("sparkle", "style", "opacity", 0),
)
# fade in title and persons
frames = 3 * fps
intermediate = (frames * 1) // 3
for i in range(0, intermediate):
yield (
("title", "style", "opacity", easeOutQuad(i, 0, 1, frames)),
("persons", "style", "opacity", 0),
("glogo", "style", "opacity", 1),
(
"sparkle",
"style",
"opacity",
easeOutQuad(min(i * 2, intermediate), 0, 1, intermediate),
),
(
"sparkle",
"attr",
"transform",
f"translate({-463.66869 + easeLinear(i, 0.0, 378.32308 + 463.66869, frames)}, 0)",
),
)
for i in range(intermediate, frames):
yield (
("title", "style", "opacity", easeOutQuad(i, 0, 1, frames)),
(
"persons",
"style",
"opacity",
easeOutQuad(i - intermediate, 0, 1, frames - intermediate),
),
("glogo", "style", "opacity", 1),
(
"sparkle",
"style",
"opacity",
easeInQuad(
i - intermediate,
1,
-1,
frames - intermediate,
),
),
(
"sparkle",
"attr",
"transform",
f"translate({-463.66869 + easeLinear(i, 0.0, 378.32308 + 463.66869, frames)}, 0)",
),
)
# show whole image for 5 seconds
frames = 5 * fps
for i in range(0, frames):
yield (
("title", "style", "opacity", 1),
("persons", "style", "opacity", 1),
("glogo", "style", "opacity", 1),
("sparkle", "style", "opacity", 0),
)
# fade out image and text
frames = 1 * fps
for i in range(0, frames):
yield (
("title", "style", "opacity", easeOutQuad(i, 1, -1, frames)),
("persons", "style", "opacity", easeOutQuad(i, 1, -1, frames)),
("glogo", "style", "opacity", easeOutQuad(i, 1, -1, frames)),
("sparkle", "style", "opacity", 0),
)
def outroFrames(args):
frames = 3 * fps
for i in range(0, frames):
yield (
("cc-text", "style", "opacity", 1),
("logo", "style", "opacity", 1),
)
# fadeout outro graphics
frames = 3 * fps
for i in range(0, frames):
yield (
("cc-text", "style", "opacity", easeOutQuad(i, 1, -1, frames)),
("logo", "style", "opacity", easeOutQuad(i, 1, -1, frames)),
)
def debug():
render(
["intro.svg", "intro.flac"],
"../intro.ts",
introFrames,
{
"$title": "Long Long Long title is LONG ",
"$personnames": "Long Name of Dr. Dr. Prof. Dr. Long Long",
},
)
# render('outro.svg',
# '../outro.mkv',
# outroFrames
# )
def tasks(queue, args, idlist, skiplist):
# iterate over all events extracted from the schedule xml-export
for event in events(scheduleUrl):
if event["room"] not in ("Medientheater", "Vortragssaal", "Blauer Salon"):
print("skipping room %s (%s)" % (event["room"], event["title"]))
continue
if event["day"] not in ("0", "1", "2", "3", "4"):
print("skipping day %s" % (event["day"]))
continue
if not (idlist == []):
if 000000 in idlist:
print("skipping id (%s [%s])" % (event["title"], event["id"]))
continue
if int(event["id"]) not in idlist:
print("skipping id (%s [%s])" % (event["title"], event["id"]))
continue
# generate a task description and put it into the queue
queue.put(
Rendertask(
infile=["intro.svg", "intro.flac"],
outfile=str(event["id"]) + ".ts",
sequence=introFrames,
parameters={
"$title": event["title"],
"$personnames": event["personnames"],
},
)
)
# place a task for the outro into the queue
if not "out" in skiplist:
queue.put(
Rendertask(infile="outro.svg", outfile="outro.ts", sequence=outroFrames)
)
if not "pause" in skiplist:
# place the pause-sequence into the queue
queue.put(
Rendertask(infile="pause.svg", outfile="pause.ts", sequence=pauseFrames)
)