#!/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), ) # fade in title and persons frames = 1 * fps for i in range(0, frames): yield ( ("title", "style", "opacity", easeOutSine(i, 0, 1, frames)), ("persons", "style", "opacity", easeOutSine(i, 0, 1, frames)), ( "glogo", "attr", "transform", # the easing function can’t 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", easeOutSine(i, 0, 1, frames)), ) # 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), ) # 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)), ) 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.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", 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) )