diff --git a/.gitignore b/.gitignore index 549fcd9..b5f2439 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,3 @@ schedule.de.xml snapshot-*.png env .DS_Store -venv diff --git a/fsck2025/__init__.py b/fsck2025/__init__.py index 101f296..ad13ced 100644 --- a/fsck2025/__init__.py +++ b/fsck2025/__init__.py @@ -5,117 +5,187 @@ 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): - frames = 2*fps - for _ in range(0, frames): + for frame in range(0, fps): yield ( - ("title", "style", "opacity", 0), - ("persons", "style", "opacity", 0), - ("glogo", "style", "opacity", 0), + ('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)) ) - # 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)), - ("glogo", "style", "opacity", 1), + 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)) ) - # 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), - ("glogo", "style", "opacity", 1), + 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)) ) - # fade out image and text - frames = 1 * fps + 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)), + 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)) ) 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.mkv', + #render('outro.svg', + # '../outro.ts', # 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) - ) + 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 + )) + - 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 deleted file mode 100644 index 6f28de0..0000000 --- a/fsck2025/artwork/FSCK_Logo_NoOutline.svg +++ /dev/null @@ -1,609 +0,0 @@ - - - - - - - - diff --git a/fsck2025/artwork/intro.svg b/fsck2025/artwork/intro.svg index c143b3d..0e24207 100644 --- a/fsck2025/artwork/intro.svg +++ b/fsck2025/artwork/intro.svg @@ -10,7 +10,6 @@ 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" @@ -18,695 +17,236 @@ 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $title$personnames + $personnames + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:80px;line-height:125%;font-family:B612;-inkscape-font-specification:'B612, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-variant-east-asian:normal" + id="title">$title + + diff --git a/fsck2025/artwork/pause.svg b/fsck2025/artwork/pause.svg new file mode 100644 index 0000000..e265620 --- /dev/null +++ b/fsck2025/artwork/pause.svg @@ -0,0 +1,3088 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pause + + diff --git a/renderlib.py b/renderlib.py index c5407cd..c8e5e84 100644 --- a/renderlib.py +++ b/renderlib.py @@ -11,8 +11,6 @@ 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 @@ -144,6 +142,8 @@ 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,7 +155,6 @@ 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 @@ -176,14 +175,6 @@ 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)