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