#!/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): # source: matrix(3.4166273,0,0,3.4166273,-1716.8745,-2685.1066) # target: matrix(5.414656,0,0,5.414656,-3282.299,-4448.4489) size = 3 + easeOutSine(i, 0, 5.414656-3, frames) posx = easeOutSine(i, -1716.8745, -3282.299, frames) posy = easeOutSine(i, -2685.1066, -4448.4489, 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)), # 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},0,0,{size},{posx},{posy})", ), ) # 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) )