diff --git a/fsck2025/__init__.py b/fsck2025/__init__.py index ad13ced..101f296 100644 --- a/fsck2025/__init__.py +++ b/fsck2025/__init__.py @@ -5,187 +5,117 @@ from schedulelib import * from easing import * # URL to Schedule-XML -scheduleUrl = 'https://cfp.ctbk.de/fsck-2024/schedule/export/schedule.xml' +scheduleUrl = "https://cfp.ctbk.de/fsck-2024/schedule/export/schedule.xml" + def introFrames(args): - for frame in range(0, fps): + frames = 2*fps + for _ in range(0, frames): yield ( - ('title', 'style', 'opacity', 0), - ('persons', 'style', 'opacity', 0), - ('gfactoryreset', 'style', 'opacity', 0), - *((f'g{i}', 'style', 'opacity', int(i<=frame)) for i in range(0,26)) + ("title", "style", "opacity", 0), + ("persons", "style", "opacity", 0), + ("glogo", "style", "opacity", 0), ) - - -#fade in title and persons - frames = 1*fps + # fade in title and persons + frames = 1 * fps for i in range(0, frames): - yield( - ('title', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), - ('persons', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), - ('gfactoryreset', 'style', 'opacity', 1), - *((f'g{i}', 'style', 'opacity', 1) for i in range(0,26)) + yield ( + ("title", "style", "opacity", easeInQuad(i, 0, 1, frames)), + ("persons", "style", "opacity", easeInQuad(i, 0, 1, frames)), + ("glogo", "style", "opacity", 1), ) -#show whole image for 5 seconds - frames = 5*fps + # show whole image for 5 seconds + frames = 5 * fps for i in range(0, frames): - yield( - ('title', 'style', 'opacity', 1), - ('persons', 'style', 'opacity', 1), - ('gfactoryreset', 'style', 'opacity', 1), - *((f'g{i}', 'style', 'opacity', 1) for i in range(0,26)) + yield ( + ("title", "style", "opacity", 1), + ("persons", "style", "opacity", 1), + ("glogo", "style", "opacity", 1), ) - frames = 1*fps + # 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)), - ('gfactoryreset', 'style', 'opacity', easeOutQuad(i, 1, -1, frames)), - *((f'g{g}', 'style', 'opacity', easeOutQuad(i, 1, -1, frames)) for g in range(0,26)) + 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 + frames = 3 * fps for i in range(0, frames): - yield( - ('cc-text', 'style', 'opacity', 1), - ('logo', 'style', 'opacity', 1), + yield ( + ("cc-text", "style", "opacity", 1), + ("logo", "style", "opacity", 1), ) - #fadeout outro graphics - frames = 3*fps + # 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)), + yield ( + ("cc-text", "style", "opacity", easeOutQuad(i, 1, -1, frames)), + ("logo", "style", "opacity", easeOutQuad(i, 1, -1, frames)), ) -def pauseFrames(params): - # kringel - for frame in range(0, fps): - yield ( - ('pause', 'style', 'opacity', 0), - ('gfactoryreset', 'style', 'opacity', 0), - *((f'g{i}', 'style', 'opacity', int(i<=frame)) for i in range(0,26)) - ) - # ease in factory - frames = int(0.5*fps) - for i in range(0, frames): - yield( - ('pause', 'style', 'opacity', 0), - ('gfactoryreset', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), - *((f'g{i}', 'style', 'opacity', 1) for i in range(0,26)) - ) - # show factory - frames = 1*fps - for i in range(0, frames): - yield( - ('pause', 'style', 'opacity', 0), - ('gfactoryreset', 'style', 'opacity', 1), - *((f'g{i}', 'style', 'opacity', 1) for i in range(0,26)) - ) - # ease out factory - frames = int(0.5*fps) - for i in range(0, frames): - yield( - ('pause', 'style', 'opacity', 0), - ('gfactoryreset', 'style', 'opacity', easeOutQuad(i, 1, -1, frames)), - *((f'g{i}', 'style', 'opacity', 1) for i in range(0,26)) - ) - # ease in pause - frames = int(0.5*fps) - for i in range(0, frames): - yield( - ('pause', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), - ('gfactoryreset', 'style', 'opacity', 0), - *((f'g{i}', 'style', 'opacity', 1) for i in range(0,26)) - ) - # show pause - frames = 1*fps - for i in range(0, frames): - yield( - ('pause', 'style', 'opacity', 1), - ('gfactoryreset', 'style', 'opacity', 0), - *((f'g{i}', 'style', 'opacity', 1) for i in range(0,26)) - ) - # ease out pause - frames = int(0.5*fps) - for i in range(0, frames): - yield( - ('pause', 'style', 'opacity', easeOutQuad(i, 1, -1, frames)), - ('gfactoryreset', 'style', 'opacity', 0), - *((f'g{i}', 'style', 'opacity', 1) for i in range(0,26)) - ) - # kringel - for frame in range(0, fps+2): - yield ( - ('pause', 'style', 'opacity', 0), - ('gfactoryreset', 'style', 'opacity', 0), - *((f'g{i}', 'style', 'opacity', int(i>=frame)) for i in range(0,26)) - ) 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' - } + "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.ts', + # 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'])) + 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'])) + if event["day"] not in ("0", "1", "2", "3", "4"): + print("skipping day %s" % (event["day"])) continue - if not (idlist==[]): + if not (idlist == []): if 000000 in idlist: - print("skipping id (%s [%s])" % (event['title'], event['id'])) + 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'])) + 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'] - } - )) + # 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 - )) - + 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) + ) diff --git a/fsck2025/artwork/FSCK_Logo_NoOutline.svg b/fsck2025/artwork/FSCK_Logo_NoOutline.svg new file mode 100644 index 0000000..6f28de0 --- /dev/null +++ b/fsck2025/artwork/FSCK_Logo_NoOutline.svg @@ -0,0 +1,609 @@ + + + + + + + + diff --git a/fsck2025/artwork/intro.svg b/fsck2025/artwork/intro.svg index 0e24207..c143b3d 100644 --- a/fsck2025/artwork/intro.svg +++ b/fsck2025/artwork/intro.svg @@ -10,6 +10,7 @@ inkscape:version="1.4 (e7c3feb100, 2024-10-09)" sodipodi:docname="intro.svg" enable-background="new" + xml:space="preserve" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" @@ -17,236 +18,695 @@ xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" - xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - image/svg+xml - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $personnames - $title$title - - + id="persons" + style="font-size:53.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;writing-mode:lr-tb;direction:ltr;white-space:pre;shape-inside:url(#rect3);shape-padding:1.2142;display:inline;opacity:1;fill:#ff9700" + transform="translate(-284.84385,128.97464)" + inkscape:label="persons">$personnames diff --git a/fsck2025/artwork/pause.svg b/fsck2025/artwork/pause.svg deleted file mode 100644 index e265620..0000000 --- a/fsck2025/artwork/pause.svg +++ /dev/null @@ -1,3088 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Pause - - diff --git a/renderlib.py b/renderlib.py index c8e5e84..c5407cd 100644 --- a/renderlib.py +++ b/renderlib.py @@ -11,6 +11,8 @@ from svgtemplate import SVGTemplate from lxml import etree from urllib.request import urlopen from wand.image import Image +from multiprocessing.pool import ThreadPool +from time import sleep # Frames per second. Increasing this renders more frames, the avconf-statements would still need modifications fps = 25 @@ -142,8 +144,6 @@ def cachedRenderFrame(frame, frameNr, task, cache): cache[frame]), "{0}/{1:04d}.png".format(framedir, frameNr)) return - elif not skip_rendering: - cache[frame] = frameNr svgfile = '{0}/.frames/{1:04d}.svg'.format(task.workdir, frameNr) @@ -155,6 +155,7 @@ def cachedRenderFrame(frame, frameNr, task, cache): outfile = '{0}/.frames/{1:04d}.png'.format(task.workdir, frameNr) renderFrame(svgfile, task, outfile) + cache[frame] = frameNr # increment frame-number frameNr += 1 @@ -175,6 +176,14 @@ def rendertask_video(task): for frameNr, frame in enumerate(task.sequence(task.parameters)): cachedRenderFrame(frame, frameNr, task, cache) + # with ThreadPool() as pool: + # pool.starmap( + # lambda frameNr, frame: cachedRenderFrame(frame, frameNr, task, cache), + # enumerate(task.sequence(task.parameters)), + # ) + # pool.close() + # pool.join() + if args.only_frame: task.outfile = '{0}.frame{1:04d}.png'.format(task.outfile, args.only_frame)