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 @@
-
-
-
-
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)