Compare commits

..

26 commits

Author SHA1 Message Date
Franziska Kunsmann
bfbdda8ffe
Merge pull request #70 from MaZderMind/t4at-2024-motn-fixes
t4at 2024 motn fixes
2024-11-21 20:11:48 +01:00
Peter Körner
21a8e014ef make-apple-motion: replace xml.sax.saxutils.xmlescape with custom routine, which also escapes quotes
xml.sax.saxutils.xmlescape is only a str.replace in a trencoat anyways.
2024-11-21 19:37:35 +01:00
Peter Körner
a9cbfc5eb3 make-apple-motion: add --snapshot-sec to automatically generate a snapshot of the final clip for inspection or as thumbnail 2024-11-21 19:37:33 +01:00
Peter Körner
41db29d24b make-apple-motion: add --setting-path flag and auto-detect absolute path to default .compressorsetting file 2024-11-21 19:37:08 +01:00
Peter Körner
40eb76b968 make-apple-motion: add --no-cleanup flag 2024-11-21 19:37:03 +01:00
Lukas Schauer
5661e690de
god2024 changes 2024-11-12 12:43:11 +01:00
Lukas Schauer
d8c198f984
god2024 2024-11-12 11:38:27 +01:00
Jannik Beyerstedt
b3fb07a6e3 Merge branch 'feat/refactor-make-ffmpeg' 2024-11-03 21:35:20 +01:00
Jannik Beyerstedt
2451c0f25f bump some versions in requirements.txt
- lxml 5 works
- svg.path has no breaking changes according to change log
- cssutils has a v2, but didn't find a changelog
2024-11-03 21:32:53 +01:00
Jannik Beyerstedt
ca224b9d84 make-ffmpeg: Remove fontfamily option as it doesn't work 2024-11-03 21:32:53 +01:00
Jannik Beyerstedt
8933550f31 make-ffmpeg: Combine with make-ffmpeg-fade 2024-11-03 21:32:53 +01:00
Jannik Beyerstedt
31f01ca386 make-ffmpeg: Use fit_text from make-ffmpeg-fade (break into lines array) 2024-11-03 21:32:51 +01:00
Jannik Beyerstedt
6876f2cf44 make-ffmpeg: Rework config file 2024-11-03 21:25:16 +01:00
Jannik Beyerstedt
526ef6231a make-ffmpeg: add border option 2024-11-02 20:57:55 +01:00
Jannik Beyerstedt
9210d36248 make-ffmpeg: Properly escape special characters 2024-11-02 20:57:55 +01:00
Jannik Beyerstedt
0bb26d6b25 make-ffmpeg: Refactor code 2024-11-02 20:57:48 +01:00
Franziska Kunsmann
26c660a135
vcfb24 switch to make-ffmpeg-fade 2024-10-19 11:00:23 +02:00
Franziska Kunsmann
8ca5d334cb
vcfb24 fix imports 2024-10-19 10:45:29 +02:00
Franziska Kunsmann
367e8ea094
re-add jugendhackt source gimp file 2024-10-19 10:33:17 +02:00
Franziska Kunsmann
c94b840807
vcfb24 2024-10-19 10:31:32 +02:00
Jannik Beyerstedt
471e0c38b7 Merge remote-tracking branch 'github/master' 2024-09-21 22:36:33 +02:00
Jannik Beyerstedt
848b72b113 schedulelib: Ignore missing track field
According to the XML schema, the "track" field of an event is not mandatory. So we should replace it with an empty string if not existing like we do for other fields.
2024-09-01 16:36:15 +02:00
derpeter
3ae90b87c0 added osmodevcon24 2024-05-03 11:53:27 +02:00
Sophie Schiller
1893beda4d
Merge pull request #64 from fkusei/master
fix make-ffmpeg-fade
2024-04-04 08:30:06 +02:00
Franziska Kunsmann
ec29473d53 make-ffmpeg-fade: use better algorythm for determining lines 2024-03-18 14:19:36 +01:00
Franziska Kunsmann
96f410ba6a make-ffmpeg-fade: fix missing import 2024-03-18 14:19:08 +01:00
44 changed files with 36151 additions and 1891 deletions

View file

@ -1,15 +1,13 @@
[default] [meta]
schedule = https://pretalx.c3voc.de/camp2023/schedule/export/schedule.xml schedule = https://pretalx.c3voc.de/camp2023/schedule/export/schedule.xml
template = intro.mp4 template = intro.mp4
alpha = false alpha = false
prores = false prores = false
fontfile = true inout_type = t
inout = t
[title] [title]
in = 16 in = 16
out = 24 out = 24
fontfamily = BeonRegular
fontfile = saira.ttf fontfile = saira.ttf
fontsize = 100 fontsize = 100
fontcolor = #FB48C4 fontcolor = #FB48C4
@ -19,7 +17,6 @@ y = 100
[speaker] [speaker]
in = 16 in = 16
out = 24 out = 24
fontfamily = BeonRegular
fontfile = saira.ttf fontfile = saira.ttf
fontsize = 70 fontsize = 70
fontcolor = #3FFF21 fontcolor = #3FFF21
@ -29,11 +26,10 @@ y = 800
[text] [text]
in = 16 in = 16
out = 24 out = 24
fontfamily = BeonRegular
fontfile = saira.ttf fontfile = saira.ttf
fontsize = 45 fontsize = 45
fontcolor = #FB48C4 fontcolor = #FB48C4
x = (w-text_w)/2 x = (w-text_w)/2
y = 1000 y = 1000
text = 'Chaos Communication Camp 2023' text = Chaos Communication Camp 2023

View file

@ -1,15 +1,13 @@
[default] [meta]
schedule = https://fahrplan.events.ccc.de/camp/2019/Fahrplan/schedule.xml schedule = https://fahrplan.events.ccc.de/camp/2019/Fahrplan/schedule.xml
template = cccamp19_talks_intro_1080p.mov template = cccamp19_talks_intro_1080p.mov
alpha = true alpha = true
prores = true prores = true
fontfile = true inout_type = n
inout = n
[title] [title]
in = 193 in = 193
out = 324 out = 324
fontfamily =
fontfile = Marvel-Bold.ttf fontfile = Marvel-Bold.ttf
fontsize = 120 fontsize = 120
fontcolor = #c68100 fontcolor = #c68100
@ -19,7 +17,6 @@ y = 480
[speaker] [speaker]
in = 233 in = 233
out = 324 out = 324
fontfamily =
fontfile = Marvel-Regular.ttf fontfile = Marvel-Regular.ttf
fontsize = 70 fontsize = 70
fontcolor = #c68100 fontcolor = #c68100
@ -29,11 +26,10 @@ y = 845
[text] [text]
in = 242 in = 242
out = 324 out = 324
fontfamily =
fontfile = Marvel-Regular.ttf fontfile = Marvel-Regular.ttf
fontsize = 45 fontsize = 45
fontcolor = #c68100 fontcolor = #c68100
x = (w-text_w)/2 x = (w-text_w)/2
y = 927 y = 927
text = 'chaos communication camp 2019' text = chaos communication camp 2019

View file

@ -1,15 +1,13 @@
[default] [meta]
schedule = https://pretalx.denog.de/denog11/schedule/export/schedule.xml schedule = https://pretalx.denog.de/denog11/schedule/export/schedule.xml
template = denog11_intro_template.ts template = denog11_intro_template.ts
alpha = false alpha = false
prores = false prores = false
fontfile = true inout_type = n
inout = n
[title] [title]
in = 1 in = 1
out = 6.5 out = 6.5
fontfamily =
fontfile = DejaVuSans.ttf fontfile = DejaVuSans.ttf
fontsize = 100 fontsize = 100
fontcolor = #f9cc12 fontcolor = #f9cc12
@ -19,7 +17,6 @@ y = 200
[speaker] [speaker]
in = 2 in = 2
out = 6.5 out = 6.5
fontfamily =
fontfile = DejaVuSans.ttf fontfile = DejaVuSans.ttf
fontsize = 60 fontsize = 60
fontcolor = #ffffff fontcolor = #ffffff
@ -29,11 +26,10 @@ y = 900
[text] [text]
in = 3 in = 3
out = 6.5 out = 6.5
fontfamily =
fontfile = DejaVuSans.ttf fontfile = DejaVuSans.ttf
fontsize = 45 fontsize = 45
fontcolor = #ffffff fontcolor = #ffffff
x = 640 x = 640
y = 1000 y = 1000
text = '' ; text =

View file

@ -1,201 +0,0 @@
#!/usr/bin/python3
import subprocess
from renderlib import *
from schedulelib import *
from easing import *
# URL to Schedule-XML
scheduleUrl = 'https://pretalx.com/fossgis2024/schedule/export/schedule.xml'
# For (really) too long titles
titlemap = {
#708: "Neue WEB-Anwendungen des LGRB Baden-Württemberg im Überblick"
}
def outroFrames(params):
# 8 Sekunden
# 2 Sekunden Fadein Text
frames = 2*fps
for i in range(0, frames):
yield (
('banderole', 'style', 'opacity', "%.4f" % easeOutCubic(i, 0, 1, frames) ),
('license', 'style', 'opacity', 0)
)
# 2 Sekunde Fadein Lizenz-Logo
frames = 2*fps
for i in range(0, frames):
yield (
('banderole', 'style', 'opacity', 1),
('license', 'style', 'opacity', "%.4f" % (float(i)/frames))
)
# 4 Sekunde stehen bleiben
frames = 4*fps
for i in range(0, frames):
yield (
('banderole', 'style', 'opacity', 1),
('license', 'style', 'opacity', 1)
)
def introFrames(params):
# 7 Sekunden
# 2 Sekunden Text 1
frames = 2*fps
for i in range(0, frames):
yield (
('box-und-text1', 'style', 'opacity', "%.4f" % easeOutCubic(i, 0, 1, frames)),
('url', 'style', 'opacity', "%.4f" % easeOutCubic(i, 0, 1, frames)),
('text1', 'style', 'opacity', "%.4f" % 1),
('text2', 'style', 'opacity', 0)
)
# 1 Sekunde Fadeout Text 1
frames = 1*fps
for i in range(0, frames):
yield (
('box-und-text1', 'style', 'opacity', 1),
('url', 'style', 'opacity', 1),
('text1', 'style', 'opacity', "%.4f" % (1-(float(i)/frames))),
('text2', 'style', 'opacity', 0)
)
# 2 Sekunden Text 2
frames = 2*fps
for i in range(0, frames):
yield (
('box-und-text1', 'style', 'opacity', 1),
('url', 'style', 'opacity', 1),
('text1', 'style', 'opacity', 0),
('text2', 'style', 'opacity', "%.4f" % easeOutCubic(i, 0, 1, frames))
)
# 2 Sekunden stehen bleiben
frames = 2*fps
for i in range(0, frames):
yield (
('box-und-text1', 'style', 'opacity', 1),
('url', 'style', 'opacity', 1),
('text1', 'style', 'opacity', 0),
('text2', 'style', 'opacity', 1)
)
def pauseFrames(params):
# 12 Sekunden
# 2 Sekunden Text1 stehen
frames = 2*fps
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', 1),
('text2', 'style', 'opacity', 0)
)
# 2 Sekunden Fadeout Text1
frames = 2*fps
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % (1-easeOutCubic(i, 0, 1, frames))),
('text2', 'style', 'opacity', 0)
)
# 2 Sekunden Fadein Text2
frames = 2*fps
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', 0),
('text2', 'style', 'opacity', "%.4f" % easeOutCubic(i, 0, 1, frames))
)
# 2 Sekunden Text2 stehen
frames = 2*fps
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', 0),
('text2', 'style', 'opacity', 1)
)
# 2 Sekunden Fadeout Text2
frames = 2*fps
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', 0),
('text2', 'style', 'opacity', "%.4f" % (1-easeOutCubic(i, 0, 1, frames)))
)
# 2 Sekunden Fadein Text1
frames = 2*fps
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % (easeOutCubic(i, 0, 1, frames))),
('text2', 'style', 'opacity', 0)
)
def debug():
render(
'intro.svg',
'../intro.ts',
introFrames,
{
'$id': 904,
'$title': 'Was ist Open Source, wie funktioniert das?',
'$subtitle': 'Die Organisation der Open Geo- und GIS-Welt. Worauf man achten sollte.',
'$personnames': 'Arnulf Christl, Astrid Emde, Dominik Helle, Till Adams'
}
)
render(
'outro.svg',
'../outro.ts',
outroFrames
)
render('pause.svg',
'../pause.ts',
pauseFrames
)
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 ('Hörsaal 1 (Audimax 1)', 'Hörsaal 2 (Ditze H016)', 'Hörsaal 3 (K0506/ Audimax 2)', 'Hörsaal 4 (A.013)'):
print("skipping room %s (%s)" % (event['room'], event['title']))
continue
if (event['id'] in idlist or not idlist) and not 'intro' in skiplist:
# generate a task description and put them into the queue
queue.put(Rendertask(
infile = 'intro.svg',
outfile = str(event['id'])+".ts",
sequence = introFrames,
parameters = {
'$id': event['id'],
'$title': event['title'],
'$url': event['url'],
#'$subtitle': event['subtitle'],
'$personnames': event['personnames']
}
))
if not 'outro' in skiplist:
# place a task for the outro into the queue
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
))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

View file

@ -1,199 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="120"
height="42"
id="svg2759"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docname="by-sa.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs2761" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#8b8b8b"
borderopacity="1"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="179"
inkscape:cy="89.569904"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="120px"
height="42px"
inkscape:showpageshadow="false"
inkscape:window-width="1198"
inkscape:window-height="624"
inkscape:window-x="488"
inkscape:window-y="401" />
<metadata
id="metadata2764">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
transform="matrix(0.9937807,0,0,0.9936694,-177.69409,-74.436409)"
id="g287"
inkscape:export-filename="/mnt/hgfs/Bov/Documents/Work/2007/cc/identity/srr buttons/big/by-sa.png"
inkscape:export-xdpi="300.23013"
inkscape:export-ydpi="300.23013">
<path
id="path3817_2_"
nodetypes="ccccccc"
d="M 182.23532,75.39014 L 296.29928,75.59326 C 297.89303,75.59326 299.31686,75.35644 299.31686,78.77344 L 299.17721,116.34033 L 179.3569,116.34033 L 179.3569,78.63379 C 179.3569,76.94922 179.51999,75.39014 182.23532,75.39014 z"
style="fill:#aab2ab" />
<g
id="g5908_2_"
transform="matrix(0.872921,0,0,0.872921,50.12536,143.2144)">
<path
id="path5906_2_"
cx="296.35416"
ry="22.939548"
cy="264.3577"
type="arc"
rx="22.939548"
d="M 187.20944,-55.6792 C 187.21502,-46.99896 180.18158,-39.95825 171.50134,-39.95212 C 162.82113,-39.94708 155.77929,-46.97998 155.77426,-55.66016 C 155.77426,-55.66687 155.77426,-55.67249 155.77426,-55.6792 C 155.76922,-64.36054 162.80209,-71.40125 171.48233,-71.40631 C 180.16367,-71.41193 187.20441,-64.37842 187.20944,-55.69824 C 187.20944,-55.69263 187.20944,-55.68591 187.20944,-55.6792 z"
style="fill:#ffffff" />
<g
id="g5706_2_"
transform="translate(-289.6157,99.0653)">
<path
id="path5708_2_"
d="M 473.88455,-167.54724 C 477.36996,-164.06128 479.11294,-159.79333 479.11294,-154.74451 C 479.11294,-149.69513 477.40014,-145.47303 473.9746,-142.07715 C 470.33929,-138.50055 466.04281,-136.71283 461.08513,-136.71283 C 456.18736,-136.71283 451.96526,-138.48544 448.42003,-142.03238 C 444.87419,-145.57819 443.10158,-149.81537 443.10158,-154.74451 C 443.10158,-159.6731 444.87419,-163.94049 448.42003,-167.54724 C 451.87523,-171.03375 456.09728,-172.77618 461.08513,-172.77618 C 466.13342,-172.77618 470.39914,-171.03375 473.88455,-167.54724 z M 450.76657,-165.20239 C 447.81982,-162.22601 446.34701,-158.7395 446.34701,-154.74005 C 446.34701,-150.7417 447.80529,-147.28485 450.72125,-144.36938 C 453.63778,-141.45288 457.10974,-139.99462 461.1383,-139.99462 C 465.16683,-139.99462 468.66848,-141.46743 471.64486,-144.41363 C 474.47076,-147.14947 475.88427,-150.59069 475.88427,-154.74005 C 475.88427,-158.85809 474.44781,-162.35297 471.57659,-165.22479 C 468.70595,-168.09546 465.22671,-169.53131 461.1383,-169.53131 C 457.04993,-169.53131 453.59192,-168.08813 450.76657,-165.20239 z M 458.52106,-156.49927 C 458.07074,-157.4809 457.39673,-157.9715 456.49781,-157.9715 C 454.90867,-157.9715 454.11439,-156.90198 454.11439,-154.763 C 454.11439,-152.62341 454.90867,-151.55389 456.49781,-151.55389 C 457.54719,-151.55389 458.29676,-152.07519 458.74647,-153.11901 L 460.94923,-151.94598 C 459.8993,-150.0805 458.32417,-149.14697 456.22374,-149.14697 C 454.60384,-149.14697 453.30611,-149.64367 452.33168,-150.63653 C 451.35561,-151.62994 450.86894,-152.99926 450.86894,-154.7445 C 450.86894,-156.46008 451.37123,-157.82159 452.37642,-158.83013 C 453.38161,-159.83806 454.63347,-160.34264 456.13423,-160.34264 C 458.35435,-160.34264 459.94407,-159.46776 460.90504,-157.71978 L 458.52106,-156.49927 z M 468.8844,-156.49927 C 468.43353,-157.4809 467.77292,-157.9715 466.90201,-157.9715 C 465.28095,-157.9715 464.46988,-156.90198 464.46988,-154.763 C 464.46988,-152.62341 465.28095,-151.55389 466.90201,-151.55389 C 467.95304,-151.55389 468.68918,-152.07519 469.10925,-153.11901 L 471.36126,-151.94598 C 470.31301,-150.0805 468.74007,-149.14697 466.64358,-149.14697 C 465.02587,-149.14697 463.73095,-149.64367 462.75711,-150.63653 C 461.78494,-151.62994 461.29773,-152.99926 461.29773,-154.7445 C 461.29773,-156.46008 461.79221,-157.82159 462.78061,-158.83013 C 463.76843,-159.83806 465.02588,-160.34264 466.55408,-160.34264 C 468.77027,-160.34264 470.35776,-159.46776 471.3154,-157.71978 L 468.8844,-156.49927 z" />
</g>
</g>
<path
d="M 297.29639,74.91064 L 181.06688,74.91064 C 179.8203,74.91064 178.80614,75.92529 178.80614,77.17187 L 178.80614,116.66748 C 178.80614,116.94922 179.03466,117.17822 179.31639,117.17822 L 299.04639,117.17822 C 299.32813,117.17822 299.55713,116.94922 299.55713,116.66748 L 299.55713,77.17188 C 299.55713,75.92529 298.54297,74.91064 297.29639,74.91064 z M 181.06688,75.93213 L 297.29639,75.93213 C 297.97998,75.93213 298.53565,76.48828 298.53565,77.17188 C 298.53565,77.17188 298.53565,93.09131 298.53565,104.59034 L 215.4619,104.59034 C 212.41698,110.09571 206.55077,113.83399 199.81835,113.83399 C 193.083,113.83399 187.21825,110.09913 184.1748,104.59034 L 179.82666,104.59034 C 179.82666,93.09132 179.82666,77.17188 179.82666,77.17188 C 179.82664,76.48828 180.38329,75.93213 181.06688,75.93213 z"
id="path294" />
<g
enable-background="new "
id="g296">
<path
d="M 265.60986,112.8833 C 265.68994,113.03906 265.79736,113.16504 265.93115,113.26172 C 266.06494,113.35791 266.22119,113.42969 266.40088,113.47608 C 266.58154,113.52296 266.76807,113.54639 266.96045,113.54639 C 267.09033,113.54639 267.22998,113.53565 267.3794,113.51368 C 267.52784,113.4922 267.66749,113.44972 267.79835,113.3877 C 267.92823,113.32569 268.03761,113.23975 268.12355,113.13086 C 268.21144,113.02197 268.25441,112.88379 268.25441,112.71533 C 268.25441,112.53515 268.19679,112.38916 268.08156,112.27685 C 267.9673,112.16455 267.81594,112.07177 267.62941,111.99658 C 267.44386,111.92236 267.23195,111.85693 266.9966,111.80078 C 266.76027,111.74463 266.52101,111.68262 266.27883,111.61377 C 266.02981,111.55176 265.78762,111.47559 265.55129,111.38525 C 265.31594,111.29541 265.10402,111.17822 264.9175,111.03515 C 264.73098,110.89208 264.58059,110.71337 264.46535,110.49853 C 264.35109,110.28369 264.29347,110.02392 264.29347,109.71923 C 264.29347,109.37646 264.36671,109.07958 264.51222,108.82763 C 264.6587,108.57568 264.85011,108.36572 265.08644,108.19726 C 265.32179,108.02929 265.58937,107.90478 265.8882,107.82372 C 266.18605,107.74315 266.48488,107.70263 266.78273,107.70263 C 267.13136,107.70263 267.46535,107.74169 267.78566,107.81982 C 268.105,107.89746 268.39015,108.02392 268.6382,108.19824 C 268.88722,108.37256 269.08449,108.59521 269.23097,108.86621 C 269.37648,109.13721 269.44972,109.46582 269.44972,109.85156 L 268.02784,109.85156 C 268.01514,109.65234 267.97315,109.4873 267.90284,109.35693 C 267.83155,109.22607 267.73682,109.12353 267.61964,109.04834 C 267.50148,108.97412 267.36671,108.9209 267.21534,108.89014 C 267.063,108.85889 266.89796,108.84326 266.71827,108.84326 C 266.60108,108.84326 266.48292,108.85596 266.36573,108.88037 C 266.24757,108.90576 266.14112,108.94922 266.04542,109.01123 C 265.94874,109.07373 265.86964,109.15137 265.80812,109.24463 C 265.7466,109.33838 265.71535,109.45654 265.71535,109.59961 C 265.71535,109.73047 265.73976,109.83643 265.78957,109.91699 C 265.83937,109.99804 265.93801,110.07275 266.08352,110.14111 C 266.22903,110.20947 266.43118,110.27832 266.68899,110.34668 C 266.9468,110.41504 267.28372,110.50244 267.70071,110.60791 C 267.82473,110.63281 267.99661,110.67822 268.21731,110.74365 C 268.43801,110.80908 268.65676,110.91308 268.87454,111.05615 C 269.09231,111.1997 269.27981,111.39111 269.43899,111.63037 C 269.59719,111.87012 269.67629,112.17676 269.67629,112.55029 C 269.67629,112.85547 269.61672,113.13867 269.49856,113.3999 C 269.3804,113.66162 269.20461,113.8872 268.97122,114.07666 C 268.73782,114.26709 268.44876,114.41455 268.10403,114.52051 C 267.75833,114.62647 267.35794,114.6792 266.90481,114.6792 C 266.53762,114.6792 266.18118,114.63379 265.83547,114.54346 C 265.49074,114.45313 265.18508,114.31104 264.92043,114.11768 C 264.65676,113.92432 264.4468,113.67774 264.29055,113.37891 C 264.13528,113.07959 264.06106,112.7251 264.06692,112.31397 L 265.4888,112.31397 C 265.48877,112.53809 265.52881,112.72803 265.60986,112.8833 z"
id="path298"
style="fill:#ffffff" />
<path
d="M 273.8667,107.8667 L 276.35986,114.53076 L 274.8374,114.53076 L 274.33349,113.04638 L 271.84033,113.04638 L 271.31787,114.53076 L 269.84326,114.53076 L 272.36377,107.8667 L 273.8667,107.8667 z M 273.95068,111.95264 L 273.11084,109.50928 L 273.09229,109.50928 L 272.22315,111.95264 L 273.95068,111.95264 z"
id="path300"
style="fill:#ffffff" />
</g>
<g
enable-background="new "
id="g302">
<path
d="M 239.17821,107.8667 C 239.49559,107.8667 239.78563,107.89502 240.04735,107.95068 C 240.30907,108.00683 240.53368,108.09863 240.72118,108.22607 C 240.9077,108.35351 241.05321,108.52295 241.15575,108.73437 C 241.25829,108.94579 241.31005,109.20703 241.31005,109.51806 C 241.31005,109.854 241.23388,110.13329 241.08056,110.35742 C 240.92822,110.58154 240.70165,110.76465 240.40283,110.90771 C 240.81494,111.02587 241.12256,111.23291 241.32568,111.5288 C 241.5288,111.82469 241.63037,112.18114 241.63037,112.59814 C 241.63037,112.93408 241.56494,113.22509 241.43408,113.47119 C 241.30322,113.7168 241.12646,113.91748 240.90576,114.07324 C 240.68408,114.229 240.43115,114.34424 240.14795,114.41845 C 239.86377,114.49365 239.57275,114.53075 239.27295,114.53075 L 236.03662,114.53075 L 236.03662,107.86669 L 239.17821,107.86669 L 239.17821,107.8667 z M 238.99071,110.56201 C 239.25243,110.56201 239.46727,110.5 239.63622,110.37597 C 239.80419,110.25146 239.88817,110.05029 239.88817,109.77099 C 239.88817,109.61572 239.85985,109.48828 239.80419,109.38915 C 239.74755,109.28954 239.67333,109.21239 239.57958,109.15624 C 239.48583,109.10058 239.37841,109.06151 239.25731,109.04003 C 239.13524,109.01806 239.00926,109.00732 238.8784,109.00732 L 237.50535,109.00732 L 237.50535,110.56201 L 238.99071,110.56201 z M 239.07664,113.39014 C 239.22019,113.39014 239.35691,113.37647 239.48777,113.34815 C 239.61863,113.32032 239.73484,113.27344 239.83445,113.2085 C 239.93406,113.14307 240.01316,113.0542 240.07273,112.94239 C 240.1323,112.83058 240.1616,112.68751 240.1616,112.51319 C 240.1616,112.17139 240.06492,111.92725 239.87156,111.78126 C 239.6782,111.63527 239.42234,111.56202 239.10496,111.56202 L 237.50535,111.56202 L 237.50535,113.39014 L 239.07664,113.39014 z"
id="path304"
style="fill:#ffffff" />
<path
d="M 241.88914,107.8667 L 243.53269,107.8667 L 245.09324,110.49854 L 246.64402,107.8667 L 248.27781,107.8667 L 245.80418,111.97315 L 245.80418,114.53077 L 244.33543,114.53077 L 244.33543,111.93604 L 241.88914,107.8667 z"
id="path306"
style="fill:#ffffff" />
</g>
<g
id="g6316_1_"
transform="matrix(0.624995,0,0,0.624995,391.2294,176.9332)">
<path
id="path6318_1_"
cx="475.97119"
ry="29.209877"
cy="252.08646"
type="arc"
rx="29.209877"
d="M -175.0083,-139.1153 C -175.00204,-129.7035 -182.62555,-122.06751 -192.03812,-122.06049 C -201.44913,-122.05341 -209.08512,-129.67774 -209.09293,-139.09028 C -209.09293,-139.09809 -209.09293,-139.10749 -209.09293,-139.1153 C -209.09919,-148.52784 -201.47413,-156.1623 -192.06311,-156.17011 C -182.65054,-156.17713 -175.01456,-148.55207 -175.0083,-139.14026 C -175.0083,-139.13092 -175.0083,-139.1239 -175.0083,-139.1153 z"
style="fill:#ffffff" />
<g
id="g6320_1_"
transform="translate(-23.9521,-89.72962)">
<path
id="path6322_1_"
d="M -168.2204,-68.05536 C -173.39234,-68.05536 -177.76892,-66.25067 -181.35175,-62.64203 C -185.02836,-58.90759 -186.86588,-54.48883 -186.86588,-49.38568 C -186.86588,-44.28253 -185.02836,-39.89416 -181.35175,-36.22308 C -177.67673,-32.55114 -173.29859,-30.71521 -168.2204,-30.71521 C -163.07974,-30.71521 -158.62503,-32.56677 -154.85312,-36.26996 C -151.30307,-39.78558 -149.52652,-44.15827 -149.52652,-49.38568 C -149.52652,-54.6123 -151.33432,-59.03265 -154.94843,-62.64203 C -158.5625,-66.25067 -162.98599,-68.05536 -168.2204,-68.05536 z M -168.17352,-64.69519 C -163.936,-64.69519 -160.33752,-63.20221 -157.37655,-60.21466 C -154.38748,-57.25836 -152.89214,-53.64899 -152.89214,-49.38568 C -152.89214,-45.09186 -154.35466,-41.52856 -157.28438,-38.69653 C -160.36876,-35.64727 -163.99849,-34.12304 -168.17351,-34.12304 C -172.34856,-34.12304 -175.94701,-35.63244 -178.96892,-38.64965 C -181.9908,-41.66918 -183.50176,-45.24657 -183.50176,-49.38567 C -183.50176,-53.52398 -181.97518,-57.13414 -178.92205,-60.21465 C -175.9939,-63.20221 -172.41107,-64.69519 -168.17352,-64.69519 z" />
<path
id="path6324_1_"
d="M -176.49548,-52.02087 C -175.75171,-56.71856 -172.44387,-59.22949 -168.30008,-59.22949 C -162.33911,-59.22949 -158.70783,-54.90448 -158.70783,-49.1372 C -158.70783,-43.50982 -162.57194,-39.13793 -168.39383,-39.13793 C -172.39856,-39.13793 -175.98297,-41.60277 -176.63611,-46.43877 L -171.93292,-46.43877 C -171.7923,-43.92778 -170.1626,-43.04418 -167.83447,-43.04418 C -165.1813,-43.04418 -163.4563,-45.50908 -163.4563,-49.27709 C -163.4563,-53.22942 -164.94693,-55.32244 -167.74228,-55.32244 C -169.79074,-55.32244 -171.55948,-54.57787 -171.93292,-52.02087 L -170.56418,-52.02789 L -174.26734,-48.32629 L -177.96894,-52.02789 L -176.49548,-52.02087 z" />
</g>
</g>
<g
id="g313">
<circle
cx="242.56226"
cy="90.224609"
r="10.8064"
id="circle315"
sodipodi:cx="242.56226"
sodipodi:cy="90.224609"
sodipodi:rx="10.8064"
sodipodi:ry="10.8064"
style="fill:#ffffff" />
<g
id="g317">
<path
d="M 245.68994,87.09766 C 245.68994,86.68116 245.35205,86.34424 244.93603,86.34424 L 240.16357,86.34424 C 239.74755,86.34424 239.40966,86.68115 239.40966,87.09766 L 239.40966,91.87061 L 240.74071,91.87061 L 240.74071,97.52295 L 244.3579,97.52295 L 244.3579,91.87061 L 245.68993,91.87061 L 245.68993,87.09766 L 245.68994,87.09766 z"
id="path319" />
<circle
cx="242.5498"
cy="84.083008"
r="1.63232"
id="circle321"
sodipodi:cx="242.5498"
sodipodi:cy="84.083008"
sodipodi:rx="1.63232"
sodipodi:ry="1.63232" />
</g>
<path
clip-rule="evenodd"
d="M 242.53467,78.31836 C 239.30322,78.31836 236.56641,79.4458 234.32715,81.70215 C 232.0293,84.03516 230.88086,86.79736 230.88086,89.98633 C 230.88086,93.1753 232.0293,95.91846 234.32715,98.21338 C 236.625,100.50781 239.36133,101.65527 242.53467,101.65527 C 245.74756,101.65527 248.53272,100.49853 250.88819,98.18359 C 253.10889,95.98681 254.21827,93.2539 254.21827,89.98632 C 254.21827,86.71874 253.08936,83.95751 250.83057,81.70214 C 248.57178,79.4458 245.80615,78.31836 242.53467,78.31836 z M 242.56396,80.41797 C 245.2124,80.41797 247.46142,81.35156 249.31103,83.21875 C 251.18115,85.06592 252.11572,87.32227 252.11572,89.98633 C 252.11572,92.66992 251.20068,94.89746 249.36963,96.66699 C 247.4419,98.57275 245.17334,99.52539 242.56397,99.52539 C 239.9546,99.52539 237.70557,98.58252 235.81739,96.6958 C 233.92774,94.80957 232.98389,92.57324 232.98389,89.98633 C 232.98389,87.3999 233.93799,85.14404 235.84619,83.21875 C 237.67676,81.35156 239.9165,80.41797 242.56396,80.41797 z"
id="path323"
style="fill-rule:evenodd" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

View file

@ -1,243 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1920"
height="1080"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="intro.svg">
<defs
id="defs20">
<filter
id="filter3772"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3774"
flood-opacity="0.5"
flood-color="rgb(255,255,255)"
result="flood" />
<feComposite
id="feComposite3776"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3778"
in="composite"
stdDeviation="3"
result="blur" />
<feOffset
id="feOffset3780"
dx="1"
dy="1"
result="offset" />
<feComposite
id="feComposite3782"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="1237.7451"
inkscape:cy="-112.36108"
inkscape:document-units="px"
inkscape:current-layer="g_background"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="1920"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:bbox-paths="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-page="true">
<sodipodi:guide
orientation="0,1"
position="1987.9802,1080.8632"
id="guide2996" />
<sodipodi:guide
orientation="0,1"
position="0,0"
id="guide2998" />
<sodipodi:guide
orientation="1,0"
position="0,0"
id="guide3000" />
<sodipodi:guide
orientation="1,0"
position="1920,2297.1429"
id="guide3002" />
<sodipodi:guide
orientation="1,0"
position="32,0"
id="guide3029" />
<sodipodi:guide
orientation="0,1"
position="0,1048"
id="guide3031"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1888,0"
orientation="1,0"
id="guide4176"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1865.6255,13.404053"
orientation="0,1"
id="guide4183" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Background"
inkscape:groupmode="layer"
id="layer_background"
transform="translate(0,28)">
<g
id="g_background"
transform="translate(-162.78572,747.3215)">
<image
xlink:href="../Titelbild_FOSSGIS2024_fullhd.png"
width="1920"
height="1080"
id="image_background"
x="162.78572"
y="-775.32147" />
<image
xlink:href="../fossgis24_logo.png"
width="249"
height="249"
id="image_logo"
x="1801.7858"
y="-743.32147" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:80.00000119%;font-family:Sans;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none"
x="1900.0262"
y="1035.1428"
id="text2992-5-5-3"
sodipodi:linespacing="80.000001%"><tspan
sodipodi:role="line"
x="1900.0262"
y="1035.1428"
id="url"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;line-height:80.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';text-align:end;text-anchor:end;fill:#f2f4f5;fill-opacity:1;stroke:none">$url</tspan></text>
<g
id="box-und-text1"
inkscape:label="#g4270"
style="opacity:1">
<rect
style="fill:#333333;fill-opacity:0.70196078"
ry="0.0084510781"
y="697"
x="0"
height="310"
width="1920"
id="rect_banderole_1" />
<g
transform="matrix(1.3478261,0,0,1.3478261,0,-350.26087)"
style="opacity:0.25"
id="text1">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:80.00000119%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="75.964493"
y="879.83752"
id="text2992"
sodipodi:linespacing="90.000001%"><tspan
sodipodi:role="line"
x="75.964493"
y="879.83752"
id="tspan2996"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#c2ced2;stroke:none;fill-opacity:1"> Hamburg</tspan><tspan
sodipodi:role="line"
x="75.964493"
y="915.23755"
id="tspan3002"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#c2ced2;stroke:none;fill-opacity:1">20. - 23. März 2024</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:80.00000119%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="77.218193"
y="837.2262"
id="text2992-5"
sodipodi:linespacing="90.000001%"><tspan
sodipodi:role="line"
id="tspan2994-9"
x="77.218193"
y="837.2262"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;stroke:none;fill-opacity:1">FOSSGIS Konferenz</tspan><tspan
sodipodi:role="line"
x="77.218193"
y="875.62622"
id="tspan2998-1"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;stroke:none;fill-opacity:1">2024</tspan></text>
</g>
</g>
<flowRoot
xml:space="preserve"
id="text2"
style="font-style:normal;font-weight:normal;font-size:53.91304398px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
inkscape:label="#text2"><flowRegion
id="flowRegion3041"><rect
id="rect3043"
width="1782.4845"
height="248.00835"
x="105.51553"
y="738.59009" /></flowRegion><flowPara
style="font-weight:bold;font-size:64.69565582px;line-height:94.99999762%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#c2ced2;stroke:none;fill-opacity:1"
id="flowPara3025">$personnames</flowPara><flowPara
id="flowPara3048"
style="font-weight:bold;font-size:64.69565582px;line-height:98.99999762%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;stroke:none;fill-opacity:1">$title</flowPara></flowRoot> <text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:80.00000119%;font-family:Sans;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none"
x="30.53125"
y="1038.3694"
id="text2992-5-5-3-3"
sodipodi:linespacing="80.000001%"><tspan
sodipodi:role="line"
x="30.53125"
y="1038.3694"
id="url-6"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;line-height:80.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';text-align:start;text-anchor:start;fill:#f2f4f5;fill-opacity:1;stroke:none">Photo: Hauke Stieler</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -1,350 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1920"
height="1080"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="outro.svg">
<defs
id="defs20">
<filter
id="filter3772"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3774"
flood-opacity="0.5"
flood-color="rgb(255,255,255)"
result="flood" />
<feComposite
id="feComposite3776"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3778"
in="composite"
stdDeviation="3"
result="blur" />
<feOffset
id="feOffset3780"
dx="1"
dy="1"
result="offset" />
<feComposite
id="feComposite3782"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
color-interpolation-filters="sRGB"
id="filter3772-5"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3774-9"
flood-opacity="0.5"
flood-color="rgb(255,255,255)"
result="flood" />
<feComposite
id="feComposite3776-9"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3778-3"
stdDeviation="3"
result="blur" />
<feOffset
id="feOffset3780-4"
dx="1"
dy="1"
result="offset" />
<feComposite
id="feComposite3782-9"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="617.24097"
inkscape:cy="402.75815"
inkscape:document-units="px"
inkscape:current-layer="g_background-5"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="1920"
inkscape:window-y="27"
inkscape:window-maximized="1">
<sodipodi:guide
orientation="0,1"
position="0,1080"
id="guide2996"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
orientation="0,1"
position="0,0"
id="guide2998" />
<sodipodi:guide
orientation="1,0"
position="0,0"
id="guide3000" />
<sodipodi:guide
orientation="1,0"
position="1920,0"
id="guide3002"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
orientation="1,0"
position="32,0"
id="guide3029" />
<sodipodi:guide
orientation="0,1"
position="0,1048"
id="guide3031"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1888,281.42857"
orientation="1,0"
id="guide4165"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Background"
inkscape:groupmode="layer"
id="layer_background"
transform="translate(0,-476)">
<g
id="g_background"
transform="translate(437.21428,1251.3215)">
<image
xlink:href="/Users/thorti/Git/c3voc/intro-outro-generator/fossgis24/artwork/fossgis24_logo.png"
y="-743.32147"
x="1801.7858"
id="image_logo"
height="249"
width="249" />
<g
id="g_background-5"
transform="translate(1.4433594e-5,-2.7832031e-5)">
<image
xlink:href="/Users/thorti/Git/c3voc/intro-outro-generator/fossgis24/artwork/Titelbild_FOSSGIS2024_fullhd.png"
y="-775.32147"
x="-437.21429"
id="image_background"
height="1080"
width="1920" />
<image
xlink:href="/Users/thorti/Git/c3voc/intro-outro-generator/fossgis24/artwork/fossgis24_logo.png"
y="-743.32147"
x="1801.7858"
id="image_logo-3"
height="249"
width="249" />
</g>
</g>
<g
style="opacity:1"
id="banderole"
transform="matrix(1.3478261,0,0,1.3478261,2.8702447e-7,-525.56522)">
<rect
id="rect_banderole"
width="1424.5161"
height="230"
x="-8.2519534e-07"
y="1281"
ry="0.0062701544"
style="fill:#333333;fill-opacity:0.70196078" />
<text
sodipodi:linespacing="90.000001%"
id="text2992"
y="1382.8375"
x="75.964493"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:90.00000119%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#c2ced2;fill-opacity:1;stroke:none"
id="tspan3002"
y="1382.8375"
x="75.964493"
sodipodi:role="line"> Hamburg</tspan><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#c2ced2;fill-opacity:1;stroke:none"
y="1420.2375"
x="75.964493"
sodipodi:role="line"
id="tspan4213">20. - 23. März 2024</tspan></text>
<text
sodipodi:linespacing="90.000001%"
id="text2992-5"
y="1341.2262"
x="77.218193"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:90.00000119%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;fill-opacity:1;stroke:none"
y="1341.2262"
x="77.218193"
id="tspan2994-9"
sodipodi:role="line">FOSSGIS Konferenz</tspan><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;fill-opacity:1;stroke:none"
id="tspan2998-1"
y="1379.6262"
x="77.218193"
sodipodi:role="line">2024</tspan><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;fill-opacity:1;stroke:none"
id="tspan3002-3"
y="1418.0262"
x="77.218193"
sodipodi:role="line" /><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;fill-opacity:1;stroke:none"
y="1438.5645"
x="77.218193"
sodipodi:role="line"
id="tspan3013">www.fossgis-konferenz.de/2024</tspan></text>
</g>
<g
transform="matrix(1.9786883,0,0,1.9784667,1294.4604,1263.9383)"
id="license"
inkscape:export-filename="/mnt/hgfs/Bov/Documents/Work/2007/cc/identity/srr buttons/big/by-sa.png"
inkscape:export-xdpi="300.23013"
inkscape:export-ydpi="300.23013"
inkscape:label="#g287">
<path
inkscape:connector-curvature="0"
id="path3817_2_"
nodetypes="ccccccc"
d="m 182.23532,75.39014 114.06396,0.20312 c 1.59375,0 3.01758,-0.23682 3.01758,3.18018 l -0.13965,37.56689 -119.82031,0 0,-37.70654 c 0,-1.68457 0.16309,-3.24365 2.87842,-3.24365 z"
style="fill:#aab2ab" />
<g
id="g5908_2_"
transform="matrix(0.872921,0,0,0.872921,50.12536,143.2144)">
<path
inkscape:connector-curvature="0"
id="path5906_2_"
cx="296.35416"
ry="22.939548"
cy="264.3577"
type="arc"
rx="22.939548"
d="m 187.20944,-55.6792 c 0.006,8.68024 -7.02786,15.72095 -15.7081,15.72708 -8.68021,0.005 -15.72205,-7.02786 -15.72708,-15.70804 0,-0.0067 0,-0.01233 0,-0.01904 -0.005,-8.68134 7.02783,-15.72205 15.70807,-15.72711 8.68134,-0.0056 15.72208,7.02789 15.72711,15.70807 0,0.0056 0,0.01233 0,0.01904 z"
style="fill:#ffffff" />
<g
id="g5706_2_"
transform="translate(-289.6157,99.0653)">
<path
inkscape:connector-curvature="0"
id="path5708_2_"
d="m 473.88455,-167.54724 c 3.48541,3.48596 5.22839,7.75391 5.22839,12.80273 0,5.04938 -1.7128,9.27148 -5.13834,12.66736 -3.63531,3.5766 -7.93179,5.36432 -12.88947,5.36432 -4.89777,0 -9.11987,-1.77261 -12.6651,-5.31955 -3.54584,-3.54581 -5.31845,-7.78299 -5.31845,-12.71213 0,-4.92859 1.77261,-9.19598 5.31845,-12.80273 3.4552,-3.48651 7.67725,-5.22894 12.6651,-5.22894 5.04829,0 9.31401,1.74243 12.79942,5.22894 z m -23.11798,2.34485 c -2.94675,2.97638 -4.41956,6.46289 -4.41956,10.46234 0,3.99835 1.45828,7.4552 4.37424,10.37067 2.91653,2.9165 6.38849,4.37476 10.41705,4.37476 4.02853,0 7.53018,-1.47281 10.50656,-4.41901 2.8259,-2.73584 4.23941,-6.17706 4.23941,-10.32642 0,-4.11804 -1.43646,-7.61292 -4.30768,-10.48474 -2.87064,-2.87067 -6.34988,-4.30652 -10.43829,-4.30652 -4.08837,0 -7.54638,1.44318 -10.37173,4.32892 z m 7.75449,8.70312 c -0.45032,-0.98163 -1.12433,-1.47223 -2.02325,-1.47223 -1.58914,0 -2.38342,1.06952 -2.38342,3.2085 0,2.13959 0.79428,3.20911 2.38342,3.20911 1.04938,0 1.79895,-0.5213 2.24866,-1.56512 l 2.20276,1.17303 c -1.04993,1.86548 -2.62506,2.79901 -4.72549,2.79901 -1.6199,0 -2.91763,-0.4967 -3.89206,-1.48956 -0.97607,-0.99341 -1.46274,-2.36273 -1.46274,-4.10797 0,-1.71558 0.50229,-3.07709 1.50748,-4.08563 1.00519,-1.00793 2.25705,-1.51251 3.75781,-1.51251 2.22012,0 3.80984,0.87488 4.77081,2.62286 l -2.38398,1.22051 z m 10.36334,0 c -0.45087,-0.98163 -1.11148,-1.47223 -1.98239,-1.47223 -1.62106,0 -2.43213,1.06952 -2.43213,3.2085 0,2.13959 0.81107,3.20911 2.43213,3.20911 1.05103,0 1.78717,-0.5213 2.20724,-1.56512 l 2.25201,1.17303 c -1.04825,1.86548 -2.62119,2.79901 -4.71768,2.79901 -1.61771,0 -2.91263,-0.4967 -3.88647,-1.48956 -0.97217,-0.99341 -1.45938,-2.36273 -1.45938,-4.10797 0,-1.71558 0.49448,-3.07709 1.48288,-4.08563 0.98782,-1.00793 2.24527,-1.51251 3.77347,-1.51251 2.21619,0 3.80368,0.87488 4.76132,2.62286 l -2.431,1.22051 z" />
</g>
</g>
<path
inkscape:connector-curvature="0"
d="m 297.29639,74.91064 -116.22951,0 c -1.24658,0 -2.26074,1.01465 -2.26074,2.26123 l 0,39.49561 c 0,0.28174 0.22852,0.51074 0.51025,0.51074 l 119.73,0 c 0.28174,0 0.51074,-0.229 0.51074,-0.51074 l 0,-39.4956 c 0,-1.24659 -1.01416,-2.26124 -2.26074,-2.26124 z m -116.22951,1.02149 116.22951,0 c 0.68359,0 1.23926,0.55615 1.23926,1.23975 0,0 0,15.91943 0,27.41846 l -83.07375,0 c -3.04492,5.50537 -8.91113,9.24365 -15.64355,9.24365 -6.73535,0 -12.6001,-3.73486 -15.64355,-9.24365 l -4.34814,0 c 0,-11.49902 0,-27.41846 0,-27.41846 -2e-5,-0.6836 0.55663,-1.23975 1.24022,-1.23975 z"
id="path294" />
<g
id="g313"
transform="translate(16.172332,0)">
<circle
cx="242.56226"
cy="90.224609"
r="10.8064"
id="circle315"
style="fill:#ffffff" />
<g
id="g317">
<path
inkscape:connector-curvature="0"
d="m 245.68994,87.09766 c 0,-0.4165 -0.33789,-0.75342 -0.75391,-0.75342 l -4.77246,0 c -0.41602,0 -0.75391,0.33691 -0.75391,0.75342 l 0,4.77295 1.33105,0 0,5.65234 3.61719,0 0,-5.65234 1.33203,0 0,-4.77295 1e-5,0 z"
id="path319" />
<circle
cx="242.5498"
cy="84.083008"
r="1.63232"
id="circle321" />
</g>
<path
inkscape:connector-curvature="0"
d="m 242.53467,78.31836 c -3.23145,0 -5.96826,1.12744 -8.20752,3.38379 -2.29785,2.33301 -3.44629,5.09521 -3.44629,8.28418 0,3.18897 1.14844,5.93213 3.44629,8.22705 2.29785,2.29443 5.03418,3.44189 8.20752,3.44189 3.21289,0 5.99805,-1.15674 8.35352,-3.47168 2.2207,-2.19678 3.33008,-4.92969 3.33008,-8.19727 0,-3.26758 -1.12891,-6.02881 -3.3877,-8.28418 -2.25879,-2.25634 -5.02442,-3.38378 -8.2959,-3.38378 z m 0.0293,2.09961 c 2.64844,0 4.89746,0.93359 6.74707,2.80078 1.87012,1.84717 2.80469,4.10352 2.80469,6.76758 0,2.68359 -0.91504,4.91113 -2.74609,6.68066 -1.92773,1.90576 -4.19629,2.8584 -6.80566,2.8584 -2.60937,0 -4.8584,-0.94287 -6.74658,-2.82959 -1.88965,-1.88623 -2.8335,-4.12256 -2.8335,-6.70947 0,-2.58643 0.9541,-4.84229 2.8623,-6.76758 1.83057,-1.86719 4.07031,-2.80078 6.71777,-2.80078 z"
id="path323"
style="clip-rule:evenodd;fill-rule:evenodd" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:20.2165451px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="236.42627"
y="113.75954"
id="text3393"
sodipodi:linespacing="125%"
transform="scale(0.999944,1.000056)"><tspan
sodipodi:role="line"
id="tspan3395"
x="236.42627"
y="113.75954"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.84473801px;font-family:Helvetica;-inkscape-font-specification:'Helvetica Bold'"> BY 4.0 DE</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:30px;line-height:80.00000119%;font-family:Sans;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none"
x="306.42627"
y="140.1428"
id="text2992-5-5-3"
sodipodi:linespacing="80.000001%"><tspan
sodipodi:role="line"
x="306.42627"
y="140.1428"
id="url"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12px;line-height:80.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';text-align:end;text-anchor:end;fill:#f2f4f5;fill-opacity:1;stroke:none">https://creativecommons.org/licenses/by/4.0/</tspan></text>
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:80.00000119%;font-family:Sans;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none"
x="30.53125"
y="1542.3694"
id="text2992-5-5-3-3"
sodipodi:linespacing="80.000001%"><tspan
sodipodi:role="line"
x="30.53125"
y="1542.3694"
id="url-6"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;line-height:80.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';text-align:start;text-anchor:start;fill:#f2f4f5;fill-opacity:1;stroke:none">Photo: Hauke Stieler</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,242 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1920"
height="1080"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="pause.svg">
<defs
id="defs20">
<filter
id="filter3772"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3774"
flood-opacity="0.5"
flood-color="rgb(255,255,255)"
result="flood" />
<feComposite
id="feComposite3776"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3778"
in="composite"
stdDeviation="3"
result="blur" />
<feOffset
id="feOffset3780"
dx="1"
dy="1"
result="offset" />
<feComposite
id="feComposite3782"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="400.88988"
inkscape:cy="724.07855"
inkscape:document-units="px"
inkscape:current-layer="g3091x"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1021"
inkscape:window-x="1280"
inkscape:window-y="27"
inkscape:window-maximized="1">
<sodipodi:guide
orientation="0,1"
position="0,1080"
id="guide2996"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
orientation="0,1"
position="0,0"
id="guide2998" />
<sodipodi:guide
orientation="1,0"
position="0,0"
id="guide3000" />
<sodipodi:guide
orientation="1,0"
position="1920,0"
id="guide3002"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
orientation="1,0"
position="32,0"
id="guide3029" />
<sodipodi:guide
orientation="0,1"
position="0,1048"
id="guide3031"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1888,0"
orientation="1,0"
id="guide4168"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Background"
inkscape:groupmode="layer"
id="layer_background"
transform="translate(0,-476)">
<g
id="g_background"
transform="translate(-162.78572,1251.3215)">
<image
xlink:href="/Users/thorti/Git/c3voc/intro-outro-generator/fossgis24/artwork/Titelbild_FOSSGIS2024_fullhd.png"
x="162.78572"
y="-775.32147"
id="image_background"
height="1080"
width="1920" />
<image
xlink:href="/Users/thorti/Git/c3voc/intro-outro-generator/fossgis24/artwork/fossgis24_logo.png"
y="-743.32147"
x="1801.7858"
id="image_logo"
height="249"
width="249" />
</g>
<g
id="g4170"
transform="matrix(1.3478261,0,0,1.3478261,2.8702446e-7,-525.56523)">
<g
transform="matrix(1.875,0,0,1,-8.2519531e-7,504.00003)"
id="g3091x">
<rect
id="rect_banderole_1"
width="759.74194"
height="230"
x="0"
y="777"
ry="0.0062701544"
style="fill:#333333;fill-opacity:0.70196078" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:21.67332268px;line-height:90.00000119%;font-family:Sans;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none"
x="16.542841"
y="752.40576"
id="text2992-5-5-3-3"
sodipodi:linespacing="90.000001%"
transform="scale(0.73029674,1.3693064)"><tspan
sodipodi:role="line"
x="16.542841"
y="752.40576"
id="url-6"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.66932869px;line-height:80.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';text-align:start;text-anchor:start;fill:#f2f4f5;fill-opacity:1;stroke:none">Photo: Hauke Stieler</tspan></text>
</g>
<g
transform="translate(-8.2519531e-7,504.00003)"
id="text1"
style="opacity:0.25">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:90.00000119%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="75.964493"
y="879.83752"
id="text2992"
sodipodi:linespacing="90.000001%"><tspan
sodipodi:role="line"
x="75.964493"
y="879.83752"
id="tspan2996"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#c2ced2;fill-opacity:1;stroke:none"> Hamburg</tspan><tspan
sodipodi:role="line"
x="75.964493"
y="915.23755"
id="tspan3002"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#c2ced2;fill-opacity:1;stroke:none">20. - 23. März 2024</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:90.00000119%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="77.218193"
y="837.2262"
id="text2992-5"
sodipodi:linespacing="90.000001%"><tspan
sodipodi:role="line"
id="tspan2994-9"
x="77.218193"
y="837.2262"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;fill-opacity:1;stroke:none">FOSSGIS Konferenz</tspan><tspan
sodipodi:role="line"
x="77.218193"
y="875.62622"
id="tspan2998-1"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;fill-opacity:1;stroke:none">2024</tspan><tspan
id="tspan3018"
sodipodi:role="line"
x="77.218193"
y="914.02618"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;fill-opacity:1;stroke:none" /><tspan
sodipodi:role="line"
x="77.218193"
y="934.56445"
id="tspan3002-3"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;fill-opacity:1;stroke:none">www.fossgis-konferenz.de/2024</tspan></text>
</g>
<g
transform="translate(-8.2519531e-7,504.00003)"
id="text2"
style="opacity:1">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:90.00000119%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="77.218193"
y="837.2262"
id="text39"
sodipodi:linespacing="90.000001%"><tspan
sodipodi:role="line"
x="77.218193"
y="837.2262"
id="tspan41"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:90.00000119%;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold';fill:#f2f4f5;fill-opacity:1;stroke:none">Gleich geht's weiter...</tspan></text>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 9.2 KiB

145
god2024/__init__.py Normal file
View file

@ -0,0 +1,145 @@
#!/usr/bin/python3
from renderlib import *
from schedulelib import *
from easing import *
# URL to Schedule-XML
scheduleUrl = 'https://import.c3voc.de/schedule/god2024.xml?showall=yes'
titlemap = {
}
def introFrames(p):
givenFrame = 0
nr = p['$id'];
# 1 Sekunden nix
frames = 1*fps
for i in range(0, frames):
givenFrame += 1
yield (
('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
('layer1', 'style', 'opacity', "%.4f" % 0), # nix
# ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
)
# 1 Sekunde Text Fadein
frames = 1*fps
for i in range(0, frames):
givenFrame += 1
yield (
('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
('layer1', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
# ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
)
# 5 Sekunden Text
frames = 5*fps
for i in range(0, frames):
givenFrame += 1
yield (
('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
('layer1', 'style', 'opacity', "%.4f" %1),
# ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
)
def outroFrames(p):
xml = etree.parse('god2024/artwork/outro.svg').getroot()
frames = int(5*fps)
for i in range(0, frames):
yield ()
def pauseFrames(p):
# 1 sekunden fade in
frames = 1*fps
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
)
# 1 sekunde sehen
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % 1),
)
# 1 sekunde fadeout
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
)
# 1 sekunde bild
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % 0),
)
def debug():
render(
'intro.svg',
'../intro.ts',
introFrames,
{
'$id': 65,
'$title': 'OWASP Juice Shop 10th anniversary: Is it still fresh?'.upper(),
'$subtitle': '',
'$personnames': 'Jannik Hollenbach'.upper(),
#'only_render_frame': 353
'only_rerender_frames_after': 225
}
)
# render(
# 'pause.svg',
# '../pause.ts',
# pauseFrames
# )
def tasks(queue, args, id_list, skip_list):
if not 'outro' in skip_list:
# place a task for the outro into the queue
queue.put(Rendertask(
infile = 'outro.svg',
outfile = 'outro.ts',
sequence = outroFrames
))
if not 'pause' in skip_list:
# place the pause-sequence into the queue
queue.put(Rendertask(
infile = 'pause.svg',
outfile = 'pause.ts',
sequence = pauseFrames
))
# iterate over all events extracted from the schedule xml-export
for event in events(scheduleUrl, titlemap):
# skip events which will not be recorded
if event['room'] not in ('Da Capo',) or event['track'] == 'Nomnom':
print("skipping room %s (%s [%s])" % (event['room'], event['title'], event['id']))
continue
# when id_list is not empty, only render events which are in id_list
if id_list and int(event['id']) not in id_list:
print("skipping id (%s [%s])" % (event['title'], event['id']))
continue
# generate a task description and put them into the queue
queue.put(Rendertask(
infile = 'intro.svg',
outfile = str(event['id']) + ".ts",
sequence = introFrames,
parameters = {
'$id': event['id'],
'$title': event['title'].upper(),
'$subtitle': event['subtitle'],
'$personnames': event['personnames'].upper(),
}
))

101
god2024/artwork/intro.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.9 MiB

131
god2024/artwork/outro.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 2.4 MiB

78
god2024/artwork/pause.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.9 MiB

View file

@ -1,15 +1,13 @@
[default] [meta]
schedule = https://projects.alpaka.space/media/jhber19-schedule.xml schedule = https://projects.alpaka.space/media/jhber19-schedule.xml
template = intro-alpha.mov template = intro-alpha.mov
alpha = true alpha = true
prores = true prores = true
fontfile = true inout_type = n
inout = n
[title] [title]
in = 175 in = 175
out = 260 out = 260
fontfamily =
fontfile = SourceSansPro-Bold.otf fontfile = SourceSansPro-Bold.otf
fontsize = 90 fontsize = 90
fontcolor = #ffffff fontcolor = #ffffff
@ -19,7 +17,6 @@ y = 450
[speaker] [speaker]
in = 175 in = 175
out = 260 out = 260
fontfamily =
fontfile = SourceSansPro-Regular.otf fontfile = SourceSansPro-Regular.otf
fontsize = 36 fontsize = 36
fontcolor = #ffffff fontcolor = #ffffff
@ -29,11 +26,10 @@ y = 900
[text] [text]
in = 200 in = 200
out = 250 out = 250
fontfamily =
fontfile = SourceSansPro-Regular.otf fontfile = SourceSansPro-Regular.otf
fontsize = 45 fontsize = 45
fontcolor = #c68100 fontcolor = #c68100
x = (w-text_w)/2 x = (w-text_w)/2
y = 927 y = 927
text = '' ; text =

View file

@ -1,37 +1,35 @@
[default] [meta]
schedule = https://releasing.c3voc.de/releases/jhjue2020/schedule-jhjue20.xml schedule = https://releasing.c3voc.de/releases/jhjue2020/schedule-jhjue20.xml
; intro_template.ts was derived from a png which was derived from jhjue-20-intro.svg ; intro_template.ts was derived from a png which was derived from jhjue-20-intro.svg
; ffmpeg -loop 1 -i jh20-jue/jh20-jue-intro.png -ar 48000 -ac 2 -f s16le -i /dev/zero -c:v mpeg2video -pix_fmt:v yuv420p -qscale:v 2 -qmin:v 2 -qmax:v 7 -keyint_min 0 -bf 0 -g 0 -intra:0 -maxrate:0 90M -c:a mp2 -b:a 384k -t 5 jh20-jue/jh20-jue_intro_template.ts ; ffmpeg -loop 1 -i jh20-jue/jh20-jue-intro.png -ar 48000 -ac 2 -f s16le -i /dev/zero -c:v mpeg2video -pix_fmt:v yuv420p -qscale:v 2 -qmin:v 2 -qmax:v 7 -keyint_min 0 -bf 0 -g 0 -intra:0 -maxrate:0 90M -c:a mp2 -b:a 384k -t 5 jh20-jue/jh20-jue_intro_template.ts
template = jh20-jue_intro_template.ts template = jh20-jue_intro_template.ts
alpha = false alpha = false
prores = false prores = false
; enable using a font file
fontfile = true
; in and out time format: t for seconds, n for frame number ; in and out time format: t for seconds, n for frame number
inout = n inout = n
; fields for title and speaker names are empty in the template.ts, so we'll render them in via ffmpeg ;; Some font settings can have defaults, which can be overridden in the
;; 'title', 'speaker' and 'text' sections below.
[default]
;; default font
fontfile = ebisu.ttf
;; default font color
fontcolor = #ffffff
;; fields for title and speaker names are empty in the template.ts, so we'll render them in via ffmpeg
[title] [title]
; inframe for title ; inframe for title
in = 20 in = 20
; outframe for totle ; outframe for title
out = 225 out = 225
; title font (either font family or file, see default setting above)
fontfamily =
fontfile = ebisu.ttf
; title font size ; title font size
fontsize = 70 fontsize = 70
; title color
fontcolor = #ffffff
; title position from upper left corner
x = 600 x = 600
y = 865 y = 865
[speaker] [speaker]
in = 40 in = 40
out = 225 out = 225
fontfamily =
fontfile = ebisu.ttf
fontsize = 40 fontsize = 40
fontcolor = #eeeeee fontcolor = #eeeeee
x = 600 x = 600
@ -41,13 +39,10 @@ y = 950
[text] [text]
in = 3 in = 3
out = 4 out = 4
fontfamily =
fontfile = ebisu.ttf
fontsize = 45 fontsize = 45
fontcolor = #ffffff
x = 640 x = 640
y = 1000 y = 1000
text = '' ; text =
; build intros via ; build intros via

View file

@ -1,15 +1,13 @@
[default] [meta]
schedule = https://pretalx.c3voc.de/jugend-hackt-rhein-neckar-2021/schedule/export/schedule.xml schedule = https://pretalx.c3voc.de/jugend-hackt-rhein-neckar-2021/schedule/export/schedule.xml
template = jh21-rn-template.ts template = jh21-rn-template.ts
alpha = false alpha = false
prores = false prores = false
fontfile = true inout_type = t
inout = t
[title] [title]
in = 1 in = 1
out = 6.5 out = 6.5
fontfamily =
fontfile = SourceSansPro-Semibold.ttf fontfile = SourceSansPro-Semibold.ttf
fontsize = 85 fontsize = 85
fontcolor = #ffffff fontcolor = #ffffff
@ -19,7 +17,6 @@ y = 877
[speaker] [speaker]
in = 2 in = 2
out = 6.5 out = 6.5
fontfamily =
fontfile = SourceSansPro-Semibold.ttf fontfile = SourceSansPro-Semibold.ttf
fontsize = 45 fontsize = 45
fontcolor = #ffffff fontcolor = #ffffff
@ -29,11 +26,10 @@ y = 954
[text] [text]
in = 3 in = 3
out = 6.5 out = 6.5
fontfamily =
fontfile = SourceSansPro-Semibold.ttf fontfile = SourceSansPro-Semibold.ttf
fontsize = 45 fontsize = 45
fontcolor = #ffffff fontcolor = #ffffff
x = 1920 x = 1920
y = 1080 y = 1080
text = '' ; text =

View file

@ -1,39 +1,52 @@
[default] [meta]
schedule = https://pretalx.c3voc.de/jhhh23/schedule/export/schedule.xml schedule = https://pretalx.c3voc.de/jhhh23/schedule/export/schedule.xml
;; path to background video
template = intro-background.ts template = intro-background.ts
;; whether background video uses transparency (needs to be .mov)
alpha = false alpha = false
;; whether background video is prores 4444
prores = false prores = false
fontfile = true ;; in and out time format: t for seconds, n for frame number
inout = t inout_type = t
;; fade-in duration (seconds), leave out or set to zero to disable
;fade_duration = 0.5
;; Some font settings can have defaults, which can be overridden in the
;; 'title', 'speaker' and 'text' sections below.
[default]
;; default font
fontfile = SourceSansPro-Semibold.ttf
;; default font color
fontcolor = #ffffff
;; fields for title and speaker names are empty in the template.ts, so we'll render them in via ffmpeg
;; parameters are:
;; - in: start frame/ time
;; - out: end frame/ time
;; - fontfile: font file
;; - fontcolor: font color
;; - fontsize: font size (pixel)
;; - x: horizontal position (top left corner)
;; - y: vertical position (top left corner)
[title] [title]
in = 1 in = 1
out = 9.5 out = 9.5
fontfamily =
fontfile = SourceSansPro-Semibold.ttf
fontsize = 67 fontsize = 67
fontcolor = #ffffff
x = 400 x = 400
y = 870 y = 870
[speaker] [speaker]
in = 2 in = 2
out = 9 out = 9
fontfamily =
fontfile = SourceSansPro-Semibold.ttf
fontsize = 50 fontsize = 50
fontcolor = #ffffff
x = 400 x = 400
y = 950 y = 950
;; optional extra text, comment out "text" field to disable
[text] [text]
in = 0 in = 0
out = 0 out = 0
fontfamily =
fontfile = SourceSansPro-Semibold.ttf
fontsize = 0 fontsize = 0
fontcolor = #ffffff
x = 0 x = 0
y = 0 y = 0
text = '' ;text = some additional text

BIN
jugendhackt/source.xcf Normal file

Binary file not shown.

View file

@ -11,8 +11,6 @@ import sys
import os import os
import re import re
from xml.sax.saxutils import escape as xmlescape
# Parse arguments # Parse arguments
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description='C3VOC Intro-Outro-Generator - Variant to use with apple Motion Files', description='C3VOC Intro-Outro-Generator - Variant to use with apple Motion Files',
@ -57,6 +55,20 @@ parser.add_argument('--num-audio-streams', dest='naudio', type=int, default=1, h
number of audio-streams to generate. defaults to 1 number of audio-streams to generate. defaults to 1
''') ''')
parser.add_argument('--no-cleanup', action='store_true', help='''
keep temp-dir for debugging purposes
''')
parser.add_argument('--snapshot-sec', type=int, default=3, help='''
number of seconds into the final clip when to take a snapshot (for inspection purposes or as thumbnail)
''')
parser.add_argument('--setting-path', default='hd1080p.compressorsetting', help='''
filename in the script-dir (where this python script resides),
the work-dir (where the .motn-file resides) or absolute path to
a .compressorsetting file
''')
args = parser.parse_args() args = parser.parse_args()
@ -101,9 +113,22 @@ def describe_event(event):
def event_print(event, message): def event_print(event, message):
print("{} {}".format(describe_event(event), message)) print("{} {}".format(describe_event(event), message))
def find_settingpath():
artwork_dir = os.path.dirname(args.motn)
setting_path = os.path.join(artwork_dir, args.setting_path)
if os.path.exists(setting_path):
return setting_path
setting_path = os.path.join(os.path.dirname(__file__), args.setting_path)
if os.path.exists(setting_path):
return setting_path
return args.setting_path
tempdir = tempfile.TemporaryDirectory() tempdir = tempfile.TemporaryDirectory()
print('working in ' + tempdir.name) print('working in ' + tempdir.name)
settingpath = find_settingpath()
def fmt_command(command, **kwargs): def fmt_command(command, **kwargs):
@ -128,6 +153,13 @@ def run_output(command, **kwargs):
os.system(f'{cmd} >{t.name} 2>&1') os.system(f'{cmd} >{t.name} 2>&1')
return t.read().decode('utf-8') return t.read().decode('utf-8')
def xmlescape(xml):
xml = xml.replace("&", "&amp;")
xml = xml.replace("<", "&lt;")
xml = xml.replace(">", "&gt;")
xml = xml.replace("\"", "&quot;")
xml = xml.replace("'", "&apos;")
return xml
def enqueue_job(event): def enqueue_job(event):
event_id = str(event['id']) event_id = str(event['id'])
@ -144,10 +176,11 @@ def enqueue_job(event):
fp.write(xmlstr) fp.write(xmlstr)
compressor_info = run_output( compressor_info = run_output(
'/Applications/Compressor.app/Contents/MacOS/Compressor -batchname {batchname} -jobpath {jobpath} -settingpath hd1080p.compressorsetting -locationpath {locationpath}', '/Applications/Compressor.app/Contents/MacOS/Compressor -batchname {batchname} -jobpath {jobpath} -settingpath {settingpath} -locationpath {locationpath}',
batchname=describe_event(event), batchname=describe_event(event),
jobpath=work_doc, jobpath=work_doc,
locationpath=intermediate_clip) locationpath=intermediate_clip,
settingpath=settingpath)
match = re.search(r"<jobID ([A-Z0-9\-]+) ?\/>", compressor_info) match = re.search(r"<jobID ([A-Z0-9\-]+) ?\/>", compressor_info)
if not match: if not match:
@ -202,6 +235,7 @@ def finalize_job(job_id, event):
intermediate_clip = os.path.join(tempdir.name, event_id + '.mov') intermediate_clip = os.path.join(tempdir.name, event_id + '.mov')
final_clip = os.path.join(os.path.dirname(args.motn), event_id + '.ts') final_clip = os.path.join(os.path.dirname(args.motn), event_id + '.ts')
copy_clip = os.path.join(os.path.dirname(args.motn), event_id + '.mov') copy_clip = os.path.join(os.path.dirname(args.motn), event_id + '.mov')
snapshot_file = os.path.join(os.path.dirname(args.motn), event_id + '.png')
shutil.copy(intermediate_clip, copy_clip) shutil.copy(intermediate_clip, copy_clip)
@ -211,6 +245,11 @@ def finalize_job(job_id, event):
vcodec=args.vcodec, vcodec=args.vcodec,
acodec=args.acodec) acodec=args.acodec)
run('ffmpeg -y -hide_banner -loglevel error -i {input} -ss {snapshot_sec} -frames:v 1 -vf scale="iw*sar:ih" -f image2 -y -c png {output}',
input=intermediate_clip,
output=snapshot_file,
snapshot_sec=str(args.snapshot_sec))
event_print(event, "finalized intro to " + final_clip) event_print(event, "finalized intro to " + final_clip)
@ -250,5 +289,9 @@ while len(active_jobs) > 0:
finalize_job(job_id, event) finalize_job(job_id, event)
print('all done, cleaning up ' + tempdir.name) if args.no_cleanup:
tempdir.cleanup() print('all done, *NOT* cleaning up, *TEMPFILES REMAIN* in ' + tempdir.name)
else:
print('all done, cleaning up ' + tempdir.name)
tempdir.cleanup()

View file

@ -1,329 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim: tabstop=4 shiftwidth=4 expandtab # vim: tabstop=4 shiftwidth=4 expandtab
import os print("ERROR: The functionality of this script was added to 'make-ffmpeg.py'!")
import sys print("Specify meta.fade_duration = 0.5 in the config.ini for the same effect.")
import subprocess
import renderlib
import argparse
import shlex
from PIL import ImageFont
from configparser import ConfigParser
import json
# Parse arguments
parser = argparse.ArgumentParser(
description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg',
usage="./make-ffmpeg.py yourproject/",
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('project', action="store", metavar='Project folder', type=str, help='''
Path to your project folder
''')
parser.add_argument('--debug', action="store_true", default=False, help='''
Run script in debug mode and render with placeholder texts,
not parsing or accessing a schedule.
This argument must not be used together with --id
Usage: ./make-ffmpeg.py yourproject/ --debug
''')
parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help='''
Only render the given ID(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337
''')
parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help='''
Only render the given room(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal"
''')
parser.add_argument('--skip', nargs='+', action="store", type=str, help='''
Skip ID(s) not needed to be rendered.
Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337
''')
parser.add_argument('--force', action="store_true", default=False, help='''
Force render if file exists.
''')
args = parser.parse_args()
if (args.skip is None):
args.skip = []
def headline(str):
print("##################################################")
print(str)
print("##################################################")
print()
def error(str):
headline(str)
parser.print_help()
sys.exit(1)
cparser = ConfigParser()
cparser.read(os.path.join(os.path.dirname(args.project), 'config.ini'))
template = cparser['default']['template']
alpha = cparser['default']['alpha']
prores = cparser['default']['prores']
fade_duration = 0.5
title_in = float(cparser['title']['in'])
title_out = float(cparser['title']['out'])
title_duration = title_out - title_in
title_font = cparser['title']['font']
title_fontsize = int(cparser['title']['fontsize'])
title_fontcolor = cparser['title']['fontcolor']
title_x = int(cparser['title']['x'])
title_y = int(cparser['title']['y'])
speaker_in = float(cparser['speaker']['in'])
speaker_out = float(cparser['speaker']['out'])
speaker_duration = speaker_out - speaker_in
speaker_font = cparser['speaker']['font']
speaker_fontsize = int(cparser['speaker']['fontsize'])
speaker_fontcolor = cparser['speaker']['fontcolor']
speaker_x = int(cparser['speaker']['x'])
speaker_y = int(cparser['speaker']['y'])
text_in = float(cparser['text']['in'])
text_out = float(cparser['text']['out'])
text_duration = text_out - text_in
text_font = cparser['text']['font']
text_fontsize = int(cparser['text']['fontsize'])
text_fontcolor = cparser['text']['fontcolor']
text_x = int(cparser['text']['x'])
text_y = int(cparser['text']['y'])
text_text = cparser['text']['text']
font_t = os.path.join(os.path.dirname(args.project), title_font)
font_s = os.path.join(os.path.dirname(args.project), speaker_font)
font_tt = os.path.join(os.path.dirname(args.project), text_font)
fileformat = os.path.splitext(template)[1]
infile = os.path.join(os.path.dirname(args.project), template)
schedule = cparser['default']['schedule']
if not (os.path.exists(os.path.join(args.project, template))):
error("Template file {} in Project Path is missing".format(template))
for ffile in (title_font, speaker_font, text_font):
if not (os.path.exists(os.path.join(args.project, ffile))):
error("Font file {} in Project Path is missing".format(ffile))
if not (os.path.exists(os.path.join(args.project, 'config.ini'))):
error("config.ini file in Project Path is missing")
if alpha == 'true' and not fileformat == '.mov':
error("Alpha can only be rendered with .mov source files")
if not args.project:
error("The Project Path is a required argument")
if not args.debug and not schedule:
error("Either specify --debug or supply a schedule in config.ini")
if args.debug:
persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko']
events = [{
'id': 'debug',
'title': 'wallet.fail',
'subtitle': 'Hacking the most popular cryptocurrency hardware wallets',
'persons': persons,
'personnames': ', '.join(persons),
'room': 'Borg',
}]
else:
events = list(schedulelib.events(schedule))
def describe_event(event):
return "#{}: {}".format(event['id'], event['title'])
def event_print(event, message):
print("{} {}".format(describe_event(event), message))
def fmt_command(command, **kwargs):
args = {}
for key, value in kwargs.items():
args[key] = shlex.quote(value)
command = command.format(**args)
return shlex.split(command)
def run(command, **kwargs):
return subprocess.check_call(
fmt_command(command, **kwargs),
stderr=subprocess.STDOUT,
stdout=subprocess.DEVNULL)
def fit_text(string: str, frame_width):
split_line = [x.strip() for x in string.split()]
lines = ""
w = 0
line_num = 0
line = ""
for word in split_line:
w, _ = translation_font.getsize(" ".join([line, word]))
print("{}, {}".format(w, line))
if w > (frame_width):
print("too wide, breaking")
lines += line.strip() + "\n"
line = ""
line += word + " "
lines += line.strip()
return lines
def fit_title(string: str):
global translation_font
translation_font = ImageFont.truetype(font_t, size=title_fontsize-10, encoding="unic")
title = fit_text(string, 1080)
return title
def fit_speaker(string: str):
global translation_font
translation_font = ImageFont.truetype(font_s, size=speaker_fontsize-10, encoding="unic")
speaker = fit_text(string, 1080)
return speaker
def enqueue_job(event):
event_id = str(event['id'])
if event_id in args.skip:
event_print(event, "skipping " + str(event['id']))
return
if (os.path.exists(os.path.join(args.project, event_id + '.ts')) or os.path.exists(os.path.join(args.project, event_id + '.mov'))) and not args.force:
event_print(event, "file exist, skipping " + str(event['id']))
return
event_title = str(event['title'])
event_personnames = str(event['personnames'])
event_title = event_title.replace('"', '')
event_title = event_title.replace('\'', '')
event_personnames = event_personnames.replace('"', '')
t = fit_title(event_title)
s = fit_speaker(event_personnames)
print(s)
if args.debug:
print('Title: ', t)
print('Speaker: ', s)
outfile = os.path.join(os.path.dirname(args.project), event_id + '.ts')
videofilter = "drawtext=fontfile={fontfile}:fontsize={fontsize}:fontcolor={fontcolor}:x={x}:y={y}:text='{text}':".format(
fontfile=font_t,
fontsize=title_fontsize,
fontcolor=title_fontcolor,
x=title_x,
y=title_y,
text=t)
videofilter += "alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))',".format(
fade_in_start_time=title_in,
fade_in_end_time=title_in + fade_duration,
fade_out_start_time=title_in + fade_duration + title_duration,
fade_out_end_time=title_in + fade_duration + title_duration + fade_duration,
fade_duration=fade_duration
)
videofilter += "drawtext=fontfile={fontfile}:fontsize={fontsize}:fontcolor={fontcolor}:x={x}:y={y}:text='{text}':".format(
fontfile=font_s,
fontsize=speaker_fontsize,
fontcolor=speaker_fontcolor,
x=speaker_x,
y=speaker_y,
text=s)
videofilter += "alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))',".format(
fade_in_start_time=speaker_in,
fade_in_end_time=speaker_in + fade_duration,
fade_out_start_time=speaker_in + fade_duration + speaker_duration,
fade_out_end_time=speaker_in + fade_duration + speaker_duration + fade_duration,
fade_duration=fade_duration
)
videofilter += "drawtext=fontfile={fontfile}:fontsize={fontsize}:fontcolor={fontcolor}:x={x}:y={y}:text={text}:".format(
fontfile=font_tt,
fontsize=text_fontsize,
fontcolor=text_fontcolor,
x=text_x,
y=text_y,
text=text_text)
videofilter += "alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))'".format(
fade_in_start_time=text_in,
fade_in_end_time=text_in + fade_duration,
fade_out_start_time=text_in + fade_duration + text_duration,
fade_out_end_time=text_in + fade_duration + text_duration + fade_duration,
fade_duration=fade_duration
)
if fileformat == '.mov':
if alpha == 'true':
if prores == 'true':
cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -vcodec prores_ks -pix_fmt yuva444p10le -profile:v 4444 -shortest -movflags faststart -f mov "{2}"'.format(
infile, videofilter, outfile)
else:
cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -shortest -c:v qtrle -movflags faststart -f mov "{2}"'.format(
infile, videofilter, outfile)
else:
cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format(
infile, videofilter, outfile)
else:
cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -pix_fmt:v yuv420p -qscale:v 2 -qmin:v 2 -qmax:v 7 -keyint_min 0 -bf 0 -g 0 -maxrate:0 90M -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format(
infile, videofilter, outfile)
if args.debug:
print(cmd)
run(cmd)
return event_id
if args.ids:
if len(args.ids) == 1:
print("enqueuing {} job".format(len(args.ids)))
else:
print("enqueuing {} jobs".format(len(args.ids)))
else:
if len(events) == 1:
print("enqueuing {} job".format(len(events)))
else:
print("enqueuing {} jobs".format(len(events)))
for event in events:
if args.ids and event['id'] not in args.ids:
continue
if args.rooms and event['room'] not in args.rooms:
print("skipping room %s (%s)" % (event['room'], event['title']))
continue
event_print(event, "enqueued as " + str(event['id']))
job_id = enqueue_job(event)
if not job_id:
event_print(event, "job was not enqueued successfully, skipping postprocessing")
continue
print('all done')

View file

@ -1,155 +1,167 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim: tabstop=4 shiftwidth=4 expandtab # vim: tabstop=4 shiftwidth=4 expandtab
"""See jugendhackt/config.ini for some config file documentation."""
import os import os
import sys import sys
import subprocess import subprocess
import schedulelib
import argparse import argparse
import shlex
from PIL import ImageFont
from configparser import ConfigParser
import json
import platform
import ssl import ssl
from configparser import ConfigParser
from pathlib import PurePath
import platform
from PIL import ImageFont
import schedulelib
ssl._create_default_https_context = ssl._create_unverified_context ssl._create_default_https_context = ssl._create_unverified_context
# Parse arguments FRAME_WIDTH = 1920
parser = argparse.ArgumentParser(
description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg',
usage="./make-ffmpeg.py yourproject/",
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('project', action="store", metavar='Project folder', type=str, help='''
Path to your project folder
''')
parser.add_argument('--debug', action="store_true", default=False, help='''
Run script in debug mode and render with placeholder texts,
not parsing or accessing a schedule.
This argument must not be used together with --id
Usage: ./make-ffmpeg.py yourproject/ --debug
''')
parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help='''
Only render the given ID(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337
''')
parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help='''
Only render the given room(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal"
''')
parser.add_argument('--skip', nargs='+', action="store", type=str, help='''
Skip ID(s) not needed to be rendered.
Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337
''')
parser.add_argument('--force', action="store_true", default=False, help='''
Force render if file exists.
''')
args = parser.parse_args()
if (args.skip is None):
args.skip = []
def headline(str): class TextConfig:
inpoint: float
outpoint: float
x: int
y: int
fontfile_path: str
fontsize: int
fontcolor: str
bordercolor: str = None # border is added, if a color is set
def uses_fontfile(self):
return self.fontfile_path is not None
def parse(self, cparser_sect, default_fontfile, default_fontcolor):
self.inpoint = cparser_sect.getfloat('in')
self.outpoint = cparser_sect.getfloat('out')
self.x = cparser_sect.getint('x')
self.y = cparser_sect.getint('y')
self.fontcolor = cparser_sect.get('fontcolor', default_fontcolor)
fontfile = cparser_sect.get('fontfile', default_fontfile)
self.fontfile_path = str(PurePath(args.project, fontfile).as_posix())
if not os.path.exists(self.fontfile_path):
error("Font file {} in Project Path is missing".format(self.fontfile_path))
self.fontsize = cparser_sect.getint('fontsize')
self.bordercolor = cparser_sect.get('bordercolor', None)
def fit_text(self, text: str) -> list[str]:
if not text:
return [""]
font = ImageFont.truetype(
self.fontfile_path, size=self.fontsize, encoding="unic")
return fit_text(text, (FRAME_WIDTH-self.x-100), font)
def get_ffmpeg_filter(self, inout_type: str, fade_time: float, text: list[str]):
if not text:
return ""
text_duration = self.outpoint - self.inpoint
filter_str = ""
for idx, line in enumerate(text):
filter_str += "drawtext=enable='between({},{},{})':x={}:y={}".format(
inout_type, self.inpoint, self.outpoint, self.x, self.y + (idx*self.fontsize))
filter_str += ":fontfile='{}':fontsize={}:fontcolor={}:text={}".format(
self.fontfile_path, self.fontsize, self.fontcolor, ffmpeg_escape_str(line))
if self.bordercolor is not None:
filter_str += ":borderw={}:bordercolor={}".format(
self.fontsize / 30, self.bordercolor)
if fade_time > 0:
filter_str += ":alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))'".format(
fade_in_start_time=self.inpoint,
fade_in_end_time=self.inpoint + fade_time,
fade_out_start_time=self.inpoint + fade_time + text_duration,
fade_out_end_time=self.inpoint + fade_time + text_duration + fade_time,
fade_duration=fade_time)
filter_str += ","
return filter_str[:-1]
class Config:
schedule: str
template_file: str # video background
alpha: bool = False
prores: bool = False
inout_type: str = "t" # in and out time format: t for seconds, n for frame number
fade_duration: float = 0 # fade duration in seconds, 0 to disable
fileext: str
title: TextConfig
speaker: TextConfig
text: TextConfig
extra_text: str = "" # additional text
def parse_config(filename) -> Config:
if not os.path.exists(filename):
error("config.ini file in Project Path is missing")
conf = Config()
cparser = ConfigParser()
cparser.read(filename)
meta = cparser['meta']
conf.schedule = meta.get('schedule')
infile = PurePath(args.project, meta.get('template'))
conf.template_file = str(infile)
conf.alpha = meta.getboolean('alpha', conf.alpha)
conf.prores = meta.getboolean('prores', conf.prores)
conf.inout_type = meta.get('inout_type', conf.inout_type)
conf.fade_duration = meta.getfloat('fade_duration', conf.fade_duration)
defaults = cparser['default']
default_fontfile = defaults.get('fontfile', None)
default_fontcolor = defaults.get('fontcolor', "#ffffff")
conf.title = TextConfig()
conf.title.parse(cparser['title'], default_fontfile, default_fontcolor)
conf.speaker = TextConfig()
conf.speaker.parse(cparser['speaker'], default_fontfile, default_fontcolor)
conf.text = TextConfig()
conf.text.parse(cparser['text'], default_fontfile, default_fontcolor)
conf.extra_text = cparser['text'].get('text', '')
conf.fileext = infile.suffix
if not os.path.exists(conf.template_file):
error("Template file {} in Project Path is missing".format(conf.template_file))
if conf.alpha and conf.fileext != '.mov':
error("Alpha can only be rendered with .mov source files")
if not args.project:
error("The Project Path is a required argument")
if not args.debug and not conf.schedule:
error("Either specify --debug or supply a schedule in config.ini")
return conf
def error(err_str):
print("##################################################") print("##################################################")
print(str) print(err_str)
print("##################################################") print("##################################################")
print() print()
def error(str):
headline(str)
parser.print_help() parser.print_help()
sys.exit(1) sys.exit(1)
cparser = ConfigParser()
cparser.read(os.path.join(os.path.dirname(args.project), 'config.ini'))
template = cparser['default']['template']
alpha = cparser['default']['alpha']
prores = cparser['default']['prores']
fontfile = cparser['default']['fontfile'] # use a font file instead of a font family
inout = cparser['default']['inout'] # in and out time format: t for seconds, n for frame number
title_in = cparser['title']['in']
title_out = cparser['title']['out']
title_fontfamily = cparser['title']['fontfamily']
title_fontfile = cparser['title']['fontfile']
title_fontsize = cparser['title']['fontsize']
title_fontcolor = cparser['title']['fontcolor']
title_x = cparser['title']['x']
title_y = cparser['title']['y']
speaker_in = cparser['speaker']['in']
speaker_out = cparser['speaker']['out']
speaker_fontfamily = cparser['speaker']['fontfamily']
speaker_fontfile = cparser['speaker']['fontfile']
speaker_fontsize = cparser['speaker']['fontsize']
speaker_fontcolor = cparser['speaker']['fontcolor']
speaker_x = cparser['speaker']['x']
speaker_y = cparser['speaker']['y']
text_in = cparser['text']['in']
text_out = cparser['text']['out']
text_fontfamily = cparser['text']['fontfamily']
text_fontfile = cparser['text']['fontfile']
text_fontsize = cparser['text']['fontsize']
text_fontcolor = cparser['text']['fontcolor']
text_x = cparser['text']['x']
text_y = cparser['text']['y']
text_text = cparser['text']['text']
font_t = os.path.join(os.path.dirname(args.project), title_fontfile)
font_s = os.path.join(os.path.dirname(args.project), speaker_fontfile)
font_tt = os.path.join(os.path.dirname(args.project), text_fontfile)
fileformat = os.path.splitext(template)[1]
infile = os.path.join(os.path.dirname(args.project), template)
schedule = cparser['default']['schedule']
if not (os.path.exists(os.path.join(args.project, template))):
error("Template file {} in Project Path is missing".format(template))
for ffile in (title_fontfile, speaker_fontfile, text_fontfile):
if not (os.path.exists(os.path.join(args.project, ffile))):
error("Font file {} in Project Path is missing".format(ffile))
if not (os.path.exists(os.path.join(args.project, 'config.ini'))):
error("config.ini file in Project Path is missing")
if alpha == 'true' and not fileformat == '.mov':
error("Alpha can only be rendered with .mov source files")
if not args.project:
error("The Project Path is a required argument")
if not args.debug and not schedule:
error("Either specify --debug or supply a schedule in config.ini")
if args.debug:
persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko',]
events = [{
'id': 'debug',
'title': 'wallet.fail',
'subtitle': 'Hacking the most popular cryptocurrency hardware wallets',
'persons': persons,
'personnames': ', '.join(persons),
'room': 'Borg',
}]
else:
events = list(schedulelib.events(schedule))
def describe_event(event): def describe_event(event):
return "#{}: {}".format(event['id'], event['title']) return "#{}: {}".format(event['id'], event['title'])
@ -158,164 +170,184 @@ def event_print(event, message):
print("{} {}".format(describe_event(event), message)) print("{} {}".format(describe_event(event), message))
def fmt_command(command, **kwargs): def fit_text(string: str, max_width: int, font: ImageFont) -> list[str]:
args = {} """Break text into array of strings which fit certain a width (in pixels) for the specified font."""
for key, value in kwargs.items():
args[key] = shlex.quote(value)
command = command.format(**args)
return shlex.split(command)
def run(command, **kwargs):
return subprocess.check_call(
fmt_command(command, **kwargs),
stderr=subprocess.STDOUT,
stdout=subprocess.DEVNULL)
def fit_text(string: str, frame_width):
split_line = [x.strip() for x in string.split()] split_line = [x.strip() for x in string.split()]
lines = "" lines = []
w = 0 w = 0
line_num = 0 line = []
line = ""
for word in split_line: for word in split_line:
left, top, right, bottom = translation_font.getbbox(" ".join([line, word])) new_line = line + [word.rstrip(':')]
width, height = right - left, bottom - top w = font.getlength(" ".join(new_line))
if width > (frame_width - (2 * 6)): if w > max_width:
lines += line.strip() + "\n" lines.append(' '.join(line))
line = "" line = []
line += word + " " line.append(word.rstrip(':'))
if word.endswith(':'):
lines.append(' '.join(line))
line = []
if line:
lines.append(' '.join(line))
lines += line.strip()
return lines return lines
def fit_title(string: str, fontsize: int, x_offset: int): def ffmpeg_escape_str(text: str) -> str:
global translation_font # Escape according to https://ffmpeg.org/ffmpeg-filters.html#Notes-on-filtergraph-escaping
translation_font = ImageFont.truetype( # and don't put the string in quotes afterwards!
font_t, size=fontsize, encoding="unic") text = text.replace(",", r"\,")
title = fit_text(string, (1920-x_offset-100)) text = text.replace(':', r"\\:")
text = text.replace("'", r"\\\'")
return title return text
def fit_speaker(string: str, fontsize: int, x_offset: int): def enqueue_job(conf: Config, event):
global translation_font
translation_font = ImageFont.truetype(
font_s, size=fontsize, encoding="unic")
speaker = fit_text(string, (1920-x_offset-100))
return speaker
def enqueue_job(event):
event_id = str(event['id']) event_id = str(event['id'])
outfile = str(PurePath(args.project, event_id + '.ts'))
outfile_mov = str(PurePath(args.project, event_id + '.mov'))
if event_id in args.skip: if event_id in args.skip:
event_print(event, "skipping " + str(event['id'])) event_print(event, "skipping " + str(event['id']))
return return
if (os.path.exists(os.path.join(args.project, event_id + '.ts')) or os.path.exists(os.path.join(args.project, event_id + '.mov'))) and not args.force: if (os.path.exists(outfile) or os.path.exists(outfile_mov)) and not args.force:
event_print(event, "file exist, skipping " + str(event['id'])) event_print(event, "file exist, skipping " + str(event['id']))
return return
event_title = str(event['title']) event_title = str(event['title'])
event_personnames = str(event['personnames']) event_personnames = str(event['personnames'])
event_title = event_title.replace('"', '\\"')
event_title = event_title.replace('\'', '')
event_personnames = event_personnames.replace('"', '\\"')
t = fit_title(event_title, int(title_fontsize), int(title_x)) title = conf.title.fit_text(event_title)
t = t.replace(':', "\:") # the ffmpeg command needs colons to be escaped speakers = conf.speaker.fit_text(event_personnames)
s = fit_speaker(event_personnames, int(speaker_fontsize), int(speaker_x)) extra_text = conf.text.fit_text(conf.extra_text)
if args.debug: if args.debug:
print('Title: ', t) print('Title: ', title)
print('Speaker: ', s) print('Speaker: ', speakers)
outfile = os.path.join(os.path.dirname(args.project), event_id + '.ts')
if platform.system() == 'Windows': if platform.system() == 'Windows':
ffmpeg_path = './ffmpeg.exe' ffmpeg_path = './ffmpeg.exe'
font_t_win = "/".join(font_t.split("\\"))
font_s_win = "/".join(font_s.split("\\"))
font_tt_win = "/".join(font_tt.split("\\"))
else: else:
ffmpeg_path = 'ffmpeg' ffmpeg_path = 'ffmpeg'
if fontfile == 'true': videofilter = conf.title.get_ffmpeg_filter(conf.inout_type, conf.fade_duration, title) + ","
if platform.system() == 'Windows': videofilter += conf.speaker.get_ffmpeg_filter(conf.inout_type,
videofilter = "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format( conf.fade_duration, speakers) + ","
title_in, title_out, font_t_win, title_fontsize, title_fontcolor, title_x, title_y, t, inout) videofilter += conf.text.get_ffmpeg_filter(conf.inout_type, conf.fade_duration, extra_text)
videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
speaker_in, speaker_out, font_s_win, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}'".format(
text_in, text_out, font_tt_win, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout)
else:
videofilter = "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
title_in, title_out, font_t, title_fontsize, title_fontcolor, title_x, title_y, t, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
speaker_in, speaker_out, font_s, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}'".format(
text_in, text_out, font_tt, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout)
else:
videofilter = "drawtext=enable='between({8},{0},{1})':font='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
title_in, title_out, title_fontfamily, title_fontsize, title_fontcolor, title_x, title_y, t, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':font='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
speaker_in, speaker_out, speaker_fontfamily, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':font='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}'".format(
text_in, text_out, text_fontfamily, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout)
if fileformat == '.mov': cmd = [ffmpeg_path, '-y', '-i', conf.template_file, '-vf', videofilter]
if alpha == 'true':
if prores == 'true': if conf.fileext == '.mov' and conf.alpha:
cmd = '{3} -y -i "{0}" -vf "{1}" -vcodec prores_ks -pix_fmt yuva444p10le -profile:v 4444 -shortest -movflags faststart -f mov "{2}"'.format( if conf.prores:
infile, videofilter, outfile, ffmpeg_path) cmd += ['-vcodec', 'prores_ks', '-pix_fmt', 'yuva444p10le', '-profile:v',
else: '4444', '-shortest', '-movflags', 'faststart', '-f', 'mov', outfile_mov]
cmd = '{3} -y -i "{0}" -vf "{1}" -shortest -c:v qtrle -movflags faststart -f mov "{2}"'.format(
infile, videofilter, outfile, ffmpeg_path)
else: else:
cmd = '{3} -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format( cmd += ['-shortest', '-c:v', 'qtrle', '-movflags',
infile, videofilter, outfile, ffmpeg_path) 'faststart', '-f', 'mov', outfile_mov]
else: else:
cmd = '{3} -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format( cmd += ['-map', '0:0', '-c:v', 'mpeg2video', '-q:v', '2', '-aspect', '16:9', '-map',
infile, videofilter, outfile, ffmpeg_path) '0:1', '-c:a', 'mp2', '-b:a', '384k', '-shortest', '-f', 'mpegts', outfile]
if args.debug: if args.debug:
print(cmd) print(cmd)
run(cmd) subprocess.check_call(cmd,
stderr=subprocess.STDOUT,
stdout=subprocess.DEVNULL
)
return event_id return event_id
if args.ids: if __name__ == "__main__":
if len(args.ids) == 1: # Parse arguments
print("enqueuing {} job".format(len(args.ids))) parser = argparse.ArgumentParser(
description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg',
usage="./make-ffmpeg.py yourproject/",
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('project', action="store", metavar='Project folder', type=str, help='''
Path to your project folder
''')
parser.add_argument('--debug', action="store_true", default=False, help='''
Run script in debug mode and render with placeholder texts,
not parsing or accessing a schedule.
This argument must not be used together with --id
Usage: ./make-ffmpeg.py yourproject/ --debug
''')
parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help='''
Only render the given ID(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337
''')
parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help='''
Only render the given room(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal"
''')
parser.add_argument('--skip', nargs='+', action="store", type=str, help='''
Skip ID(s) not needed to be rendered.
Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337
''')
parser.add_argument('--force', action="store_true", default=False, help='''
Force render if file exists.
''')
args = parser.parse_args()
if (args.skip is None):
args.skip = []
config = parse_config(PurePath(args.project, 'config.ini'))
if args.debug:
persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko',]
events = [{
'id': 'debug',
'title': 'wallet.fail and the longest talk title to test if the template is big enough',
'subtitle': 'Hacking the most popular cryptocurrency hardware wallets',
'persons': persons,
'personnames': ', '.join(persons),
'room': 'Borg',
}]
else: else:
print("enqueuing {} jobs".format(len(args.ids))) events = list(schedulelib.events(config.schedule))
else:
if len(events) == 1: if args.ids:
print("enqueuing {} job".format(len(events))) if len(args.ids) == 1:
print("enqueuing {} job".format(len(args.ids)))
else:
print("enqueuing {} jobs".format(len(args.ids)))
else: else:
print("enqueuing {} jobs".format(len(events))) if len(events) == 1:
print("enqueuing {} job".format(len(events)))
else:
print("enqueuing {} jobs".format(len(events)))
for event in events:
if args.ids and event['id'] not in args.ids:
continue
for event in events: if args.rooms and event['room'] not in args.rooms:
if args.ids and event['id'] not in args.ids: print("skipping room %s (%s)" % (event['room'], event['title']))
continue continue
if args.rooms and event['room'] not in args.rooms: event_print(event, "enqueued as " + str(event['id']))
print("skipping room %s (%s)" % (event['room'], event['title']))
continue
event_print(event, "enqueued as " + str(event['id'])) job_id = enqueue_job(config, event)
if not job_id:
event_print(event, "job was not enqueued successfully, skipping postprocessing")
continue
job_id = enqueue_job(event) print('all done')
if not job_id:
event_print(event, "job was not enqueued successfully, skipping postprocessing")
continue
print('all done')

View file

@ -1,16 +1,14 @@
[default] [meta]
#schedule = https://talks.mrmcd.net/2019/schedule/export/schedule.xml #schedule = https://talks.mrmcd.net/2019/schedule/export/schedule.xml
schedule = file:///home/thorti/git/c3voc/intro-outro-generator/mrmcd2019/schedule.xml schedule = file:///home/thorti/git/c3voc/intro-outro-generator/mrmcd2019/schedule.xml
template = mrmcd2019.mov template = mrmcd2019.mov
alpha = false alpha = false
prores = false prores = false
fontfile = true inout_type = n
inout = n
[title] [title]
in = 50 in = 50
out = 225 out = 225
fontfamily =
fontfile = Jura-Bold.ttf fontfile = Jura-Bold.ttf
fontsize = 80 fontsize = 80
fontcolor = #47acda fontcolor = #47acda
@ -20,7 +18,6 @@ y = 540
[speaker] [speaker]
in = 75 in = 75
out = 225 out = 225
fontfamily =
fontfile = Jura-Regular.ttf fontfile = Jura-Regular.ttf
fontsize = 50 fontsize = 50
fontcolor = #094762 fontcolor = #094762
@ -30,10 +27,9 @@ y = 950
[text] [text]
in = 242 in = 242
out = 324 out = 324
fontfamily =
fontfile = Jura-Regular.ttf fontfile = Jura-Regular.ttf
fontsize = 45 fontsize = 45
fontcolor = #c68100 fontcolor = #c68100
x = (w-text_w)/2 x = (w-text_w)/2
y = 927 y = 927
text = '' ; text =

148
osmodevcon24/__init__.py Normal file
View file

@ -0,0 +1,148 @@
#!/usr/bin/python3
from renderlib import *
from schedulelib import *
from easing import *
# URL to Schedule-XML
scheduleUrl = 'https://pretalx.sysmocom.de/osmodevcon2024/schedule/export/schedule.xml'
def introFrames(args):
#fade in title
frames = 3*fps
for i in range(0, frames):
yield(
('title', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
)
# fade in subtitle and names
frames = 1*fps
for i in range(0, frames):
yield(
('title', 'style', 'opacity', 1),
('subtitle', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
('personnames', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
)
#show whole image for 2 seconds
frames = 2*fps
for i in range(0, frames):
yield(
('title', 'style', 'opacity', 1),
('personnames', 'style', 'opacity', 1),
('subtitle', 'style', 'opacity', 1),
)
def backgroundFrames(parameters):
frames = 5*fps
for i in range(0, frames):
yield(
('logo', 'style', 'opacity', 1),
)
def outroFrames(args):
frames = 2*fps
for i in range(0, frames):
yield(
('logo', 'style', 'opacity', 1),
('sublogo', 'style', 'opacity', 1),
('cclogo', 'style', 'opacity', 1),
)
# fade out
frames = 3*fps
for i in range(0, frames):
yield(
('logo', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -1, frames)),
('sublogo', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -1, frames)),
('cclogo', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -1, frames)),
)
def pauseFrames(args):
#fade in pause
frames = 4*fps
for i in range(0, frames):
yield(
('pause', 'style', 'opacity', "%.4f" % easeInCubic(i, 0.2, 1, frames)),
)
# fade out
frames = 4*fps
for i in range(0, frames):
yield(
('pause', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -0.8, frames)),
)
def debug():
render('intro.svg',
'../intro.ts',
introFrames,
{
'$id': 7776,
'$title': 'Configuring + running GPRS/EDGE data services with OsmoPCU, OsmoSGSN and OpenGGSN',
'$subtitle': 'With some subtitle!',
'$personnames': 'Alexander Chemeris + Harald Welte'
}
)
render('outro.svg',
'../outro.ts',
outroFrames
)
render(
'background.svg',
'../background.ts',
backgroundFrames
)
render('pause.svg',
'../pause.ts',
pauseFrames
)
def tasks(queue, args, idlist, skiplist):
# iterate over all events extracted from the schedule xml-export
for event in events(scheduleUrl):
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 them into the queue
queue.put(Rendertask(
infile = 'intro.svg',
outfile = str(event['id'])+".ts",
sequence = introFrames,
parameters = {
'$id': event['id'],
'$title': event['title'],
'$subtitle': event['subtitle'],
'$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
))
# place the pause-sequence into the queue
if not "pause" in skiplist:
queue.put(Rendertask(
infile = 'pause.svg',
outfile = 'pause.ts',
sequence = pauseFrames
))
# place the background-sequence into the queue
if not "bg" in skiplist:
queue.put(Rendertask(
infile = 'background.svg',
outfile = 'background.ts',
sequence = backgroundFrames
))

View file

@ -0,0 +1,946 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="508mm"
height="285.74997mm"
viewBox="0 0 1800 1012.4999"
id="svg2"
version="1.1"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="background.svg"
inkscape:export-filename="background.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs4">
<linearGradient
id="linearGradient3374-5-7-7-0">
<stop
id="stop3376-8-6-4-2"
style="stop-color:#729fcf;stop-opacity:1"
offset="0" />
<stop
id="stop3378-6-7-4-9"
style="stop-color:#729fcf;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3362-8-6-0-9">
<stop
id="stop3364-4-5-78-9"
style="stop-color:#3465a4;stop-opacity:1"
offset="0" />
<stop
id="stop3366-7-6-6-4"
style="stop-color:#3465a4;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="24.837126"
y1="44.528019"
x2="21.036427"
y2="21.041553"
id="linearGradient3991-3-88-5"
xlink:href="#linearGradient7101-4-9-4-1"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient7101-4-9-4-1">
<stop
id="stop7103-0-4-31-0"
style="stop-color:#babdb6;stop-opacity:1"
offset="0" />
<stop
id="stop7105-6-8-4-3"
style="stop-color:#ffffff;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="39.06765"
y1="28.5"
x2="39.421204"
y2="10.934953"
id="linearGradient3993-1-9-7"
xlink:href="#linearGradient6979-9-2-2-8"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient6979-9-2-2-8">
<stop
id="stop6981-9-9-0-8"
style="stop-color:#888a85;stop-opacity:1"
offset="0" />
<stop
id="stop6983-0-3-6-6"
style="stop-color:#555753;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<linearGradient
id="linearGradient7131-6-1-5-7">
<stop
id="stop7133-4-5-2-6"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop7135-6-9-5-0"
style="stop-color:#d3d7cf;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<linearGradient
id="linearGradient7153-0-1-9-75">
<stop
id="stop7155-8-7-3-9"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop7157-5-7-7-7"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="24.837126"
y1="44.528019"
x2="21.036427"
y2="21.041553"
id="linearGradient3991-3-88-5-3"
xlink:href="#linearGradient7101-4-9-4-1"
gradientUnits="userSpaceOnUse" />
<linearGradient
x1="39.06765"
y1="28.5"
x2="39.421204"
y2="10.934953"
id="linearGradient3993-1-9-7-2"
xlink:href="#linearGradient6979-9-2-2-8"
gradientUnits="userSpaceOnUse" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<linearGradient
x1="24.837126"
y1="44.528019"
x2="21.036427"
y2="21.041553"
id="linearGradient3991-3-88-5-3-4"
xlink:href="#linearGradient7101-4-9-4-1"
gradientUnits="userSpaceOnUse" />
<linearGradient
x1="39.06765"
y1="28.5"
x2="39.421204"
y2="10.934953"
id="linearGradient3993-1-9-7-2-4"
xlink:href="#linearGradient6979-9-2-2-8"
gradientUnits="userSpaceOnUse" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-3"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-1"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-7"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-6"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2-0"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7-6"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0-3"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60-6"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2-0-4"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7-6-7"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0-3-4"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60-6-0"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
r="4.5250292"
fy="8.0709476"
fx="10.28125"
cy="8.0709476"
cx="10.28125"
gradientTransform="matrix(4.9499444,0,0,4.9510321,-11.38809,35.312197)"
gradientUnits="userSpaceOnUse"
id="radialGradient3637-3"
xlink:href="#linearGradient3374-5-7-7-0"
inkscape:collect="always" />
<radialGradient
r="4.5250292"
fy="9.8424416"
fx="10.28125"
cy="9.8424416"
cx="10.28125"
gradientTransform="matrix(23.169932,0,0,7.6402677,-198.71238,8.843597)"
gradientUnits="userSpaceOnUse"
id="radialGradient3639-5"
xlink:href="#linearGradient3362-8-6-0-9"
inkscape:collect="always" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2-0-9"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7-6-1"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0-3-2"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60-6-9"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2-0-9-7"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7-6-1-5"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0-3-2-9"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60-6-9-8"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-9"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-1"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-2"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-9"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497476"
inkscape:cx="-330.66755"
inkscape:cy="386.73989"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
units="mm"
inkscape:window-width="956"
inkscape:window-height="1041"
inkscape:window-x="960"
inkscape:window-y="37"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
inkscape:measure-start="63.3968,-113.628"
inkscape:measure-end="34.3452,-129.3"
inkscape:snap-page="true"
inkscape:pagecheckerboard="true"
gridtolerance="5"
objecttolerance="10"
guidetolerance="10"
inkscape:lockguides="false">
<inkscape:grid
type="xygrid"
id="grid20483"
originx="0"
originy="-0.00012144696" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Background"
transform="translate(0,-67.5)"
style="display:inline">
<rect
style="opacity:1;fill:#1a1a1a;fill-opacity:1;stroke:none;stroke-width:1.00031257;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect20497"
width="1800"
height="1012.4999"
x="0"
y="67.5"
inkscape:label="bg color" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Text"
style="display:inline"
transform="translate(0,-67.5)">
<flowRoot
xml:space="preserve"
id="title"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:0;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="matrix(0.9375,0,0,0.9375,596.82417,403.33401)"
inkscape:label="title"
inkscape:transform-center-x="4.0178571"
inkscape:transform-center-y="-24.107143"><flowRegion
id="flowRegion20435"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#555555;fill-opacity:1"><rect
id="rect20437"
width="604.28571"
height="189.99998"
x="61.42857"
y="67.714287"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#555555;fill-opacity:1" /></flowRegion><flowPara
id="flowPara24792"
style="font-size:192px">Pause</flowPara></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot25337"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion25339"><rect
id="rect25341"
width="14.285714"
height="90"
x="902.85712"
y="472.85715" /></flowRegion><flowPara
id="flowPara25343" /></flowRoot> <flowRoot
inkscape:transform-center-y="-24.107143"
inkscape:transform-center-x="4.0178571"
inkscape:label="title"
transform="matrix(0.9375,0,0,0.9375,604.85988,449.04839)"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:0;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="pause"
xml:space="preserve"><flowRegion
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#555555;fill-opacity:1"
id="flowRegion25395"><rect
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#555555;fill-opacity:1"
y="67.714287"
x="61.42857"
height="189.99998"
width="604.28571"
id="rect25393" /></flowRegion><flowPara
style="font-size:192px"
id="flowPara25397">Pause</flowPara></flowRoot> <g
id="g441"
transform="matrix(0.84639363,0,0,0.84639363,37.064912,38.785126)">
<text
id="text3760-7"
y="243.6349"
x="277.56836"
style="font-style:normal;font-weight:normal;font-size:81.56085968px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:2.03902125"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:130.49736023px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';fill:#a00000;fill-opacity:1;stroke-width:2.03902125"
y="243.6349"
x="277.56836"
id="tspan3762-0"
sodipodi:role="line">o</tspan></text>
<path
inkscape:connector-curvature="0"
id="path3959-9-26-3"
d="m 221.54901,178.00783 -8.8372,15.20901 -4.0423,-6.95739 1.1988,54.79873 c 3.8707,-2.70354 5.2943,1.46986 5.3524,-0.6173 l 1.4178,-50.79232 c 3.0015,-1.56596 6.002,-2.21826 8.8729,-2.21826 5.22,0 7.2929,1.82538 7.4234,6.52328 l 0.5775,46.96519 c 3.6204,-1.02991 6.8905,0.79083 6.9055,-0.35065 l 0.6452,-48.85683 c 2.8709,-1.82699 7.1579,-4.15375 10.1592,-4.15375 5.22,0 6.2837,2.61406 6.3918,8.87693 l 0.7847,45.42003 c 2.4547,-0.3861 5.9417,1.23813 5.9736,-0.39459 l 0.9002,-45.80627 c 0.2308,-11.74253 1.3452,-17.49097 -11.7046,-17.49097 -5.3503,0 -11.6124,1.56672 -16.0494,4.04615 -2.4795,-2.60972 -6.1326,-4.04615 -11.7441,-4.04615 -1.5299,0 -2.9125,-0.0694 -4.2254,-0.15573 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:64px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Andale Mono';writing-mode:lr-tb;display:inline;fill:#a00000;fill-opacity:1;stroke:#a00000;stroke-width:2.03902125;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;stroke:#e19c9c;stroke-width:10.19510746;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
id="path3981-0-4-1"
d="m 212.71081,193.21678 -9.1897,-15.80983 -9.1896,-15.80995 h 18.3793 18.3792 l -9.1896,15.80995 z" />
<path
inkscape:connector-curvature="0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:10.24006462;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3983-4-9-2"
d="M 261.34211,239.81102 V 183.28218" />
<path
inkscape:connector-curvature="0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:10.19510746;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3985-4-0-9"
d="M 236.92411,239.78722 V 199.37075" />
<path
inkscape:connector-curvature="0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:9.52051163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3951-0-4-91-2"
d="m 212.70941,240.14133 -0.022,-23.96402" />
<g
id="text5473"
style="font-style:normal;font-weight:normal;font-size:16.93333244px;line-height:125%;font-family:Sans;letter-spacing:0.03704167px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
transform="matrix(7.7065378,0,0,7.7065378,-370.09593,-1045.102)"
aria-label="Os">
<path
inkscape:connector-curvature="0"
id="path5483"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';letter-spacing:0.03704167px;fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
d="m 60.829899,161.23206 c 0,4.8768 0.8636,6.1468 3.048,6.1468 2.2352,0 3.2004,-1.54094 3.2004,-6.1976 0,-4.572 -0.8128,-5.96054 -3.014133,-5.96054 -2.1844,0 -3.234267,1.50707 -3.234267,6.01134 z m 1.540934,0.33866 c 0,-3.6576 0.474133,-4.94453 1.659466,-4.94453 1.2192,0 1.557867,1.20227 1.557867,4.58893 0,3.4544 -0.423334,4.75827 -1.642533,4.75827 -1.202267,0 -1.5748,-1.25307 -1.5748,-4.40267 z" />
<path
inkscape:connector-curvature="0"
id="path5485"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';letter-spacing:0.03704167px;fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
d="m 70.886976,158.59046 c -1.896533,0 -2.760133,0.8128 -2.760133,1.99813 0,0.5588 0.2032,1.1684 0.9652,1.79493 l 1.642533,1.40547 c 0.508,0.4572 0.677333,0.8636 0.677333,1.3208 0,0.67733 -0.508,1.04987 -1.371599,1.04987 -0.6604,0 -1.202267,-0.13547 -1.693334,-0.42334 -0.186266,0.3048 -0.237066,0.59267 -0.237066,0.79587 0,0.59267 0.8636,0.8636 2.065866,0.8636 1.7272,0 2.794,-0.84667 2.794,-2.35373 0,-0.84667 -0.270933,-1.40547 -0.999067,-2.11667 l -1.5748,-1.27 c -0.575733,-0.47413 -0.677333,-0.74507 -0.677333,-1.04987 0,-0.52493 0.541867,-0.8128 1.337733,-0.8128 0.643467,0 1.151467,0.13547 1.659467,0.44027 0.186267,-0.2032 0.3048,-0.47413 0.3048,-0.69427 0,-0.33866 -0.389467,-0.94826 -2.1336,-0.94826 z" />
</g>
</g>
<g
aria-label="DevCon"
transform="matrix(6.5227642,0,0,6.5227642,-489.80588,-735.6063)"
style="font-style:normal;font-weight:bold;font-size:16.93333244px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Yanone Kaffeesatz Bold';letter-spacing:0px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text5477">
<path
d="m 91.538186,154.66105 c -0.372533,0 -0.474133,0.11853 -0.474133,0.33867 v 11.51466 h 2.1844 c 2.286,0 3.234267,-1.99813 3.234267,-6.51933 0,-4.35187 -1.0668,-5.334 -3.318934,-5.334 z m 2.760134,5.1308 c 0,4.30107 -0.474134,4.9276 -0.999067,4.9276 h -0.338667 v -8.3312 h 0.321734 c 0.6096,0 1.016,0.37253 1.016,3.4036 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5488"
inkscape:connector-curvature="0" />
<path
d="m 100.15963,157.87838 c -1.591729,0 -2.980262,0.7112 -2.980262,4.80907 0,3.21733 1.083733,3.99627 2.624666,3.99627 1.320796,0 2.404536,-0.37254 2.404536,-1.04987 0,-0.38947 -0.0508,-0.93133 -0.1524,-1.27 -0.59267,0.28787 -1.18534,0.47413 -1.79494,0.47413 -0.812796,0 -1.049863,-0.47413 -1.100663,-1.54093 0.829734,-0.0169 2.099733,-0.0847 2.929463,-0.254 0.16934,-0.6604 0.23707,-1.59173 0.23707,-2.40453 0,-1.96427 -0.8128,-2.76014 -2.16747,-2.76014 z m -0.253996,1.64254 c 0.423336,0 0.575736,0.16933 0.575736,1.25306 0,0.27094 -0.0169,0.67734 -0.0847,0.88054 -0.254,0.11853 -0.778933,0.1524 -1.253066,0.1524 0.0508,-1.54094 0.237067,-2.286 0.762,-2.286 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5490"
inkscape:connector-curvature="0" />
<path
d="m 104.26941,165.75238 c 0.1016,0.47414 0.3048,0.84667 0.79586,0.84667 0.3556,0 0.98214,-0.0169 1.3716,-0.0847 l 1.69334,-8.46666 c -1.94734,0 -1.94734,0 -1.99814,0.37253 l -0.23706,2.06587 c -0.16934,1.45626 -0.32174,4.04706 -0.32174,4.04706 h -0.0339 c 0,0 -0.1524,-2.5908 -0.33867,-4.04706 l -0.3048,-2.4384 c -2.16747,0 -2.1844,0 -2.06587,0.5588 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5492"
inkscape:connector-curvature="0" />
<path
d="m 112.00926,154.40705 c -1.524,0 -3.38666,1.016 -3.38666,6.57013 0,4.74134 0.9144,5.7912 2.82786,5.7912 1.28694,0 2.06587,-0.4572 2.06587,-1.25306 0,-0.4064 -0.11853,-0.82974 -0.254,-1.1176 -0.32173,0.16933 -0.79587,0.254 -1.3208,0.254 -0.94827,0 -1.3208,-0.88054 -1.3208,-3.82694 0,-3.69146 0.88053,-4.572 1.84573,-4.572 0.37254,0 0.67734,0.13547 0.88054,0.28787 0.13546,-0.28787 0.27093,-0.67733 0.27093,-1.13453 0,-0.508 -0.16933,-0.99907 -1.60867,-0.99907 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5494"
inkscape:connector-curvature="0" />
<path
d="m 113.8288,162.26412 c 0,3.79306 0.84667,4.4196 2.67547,4.4196 1.8288,0 2.77707,-1.2192 2.77707,-4.48734 0,-3.42053 -0.82974,-4.318 -2.6416,-4.318 -1.79494,0 -2.81094,1.3208 -2.81094,4.38574 z m 2.0828,-0.0169 c 0,-2.40453 0.28787,-2.7432 0.6604,-2.7432 0.49107,0 0.62654,0.3048 0.62654,2.7432 0,2.60774 -0.32174,2.86174 -0.64347,2.86174 -0.42333,0 -0.64347,-0.22014 -0.64347,-2.86174 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5496"
inkscape:connector-curvature="0" />
<path
d="m 120.08673,166.51438 c 1.86266,0 1.89653,0 1.89653,-0.33866 v -6.46854 c 0.18627,-0.13546 0.42333,-0.2032 0.64347,-0.2032 0.47413,0 0.5588,0.27094 0.5588,1.15147 v 5.85893 c 1.91346,0 1.96426,0 1.96426,-0.33866 v -6.11294 c 0,-1.69333 -0.72813,-2.1844 -2.4384,-2.1844 -0.84666,0 -2.09973,0.3048 -2.62466,0.5588 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5498"
inkscape:connector-curvature="0" />
</g>
<g
aria-label="2019"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:135.91038513px;line-height:101.93280029px;font-family:Galette;-inkscape-font-specification:'Galette Bold';letter-spacing:0px;word-spacing:0px;fill:#3566a5;fill-opacity:1;stroke:none;stroke-width:4.07731199px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text1093"
transform="matrix(0.84639363,0,0,0.84639363,-1098.677,81.683415)">
<path
d="m 1450.8965,383.02967 c 4.6209,-2.44639 13.4551,-4.07731 17.8042,-4.07731 4.8928,0 8.0188,2.58229 8.0188,7.20325 0,11.28056 -15.3579,23.51249 -26.7744,43.49132 -2.99,5.30051 -3.5337,7.20325 -3.5337,12.09602 0,0.40774 0,2.5823 0.5437,4.21323 h 44.8504 c 3.3978,0 3.5337,-3.12594 3.5337,-15.76561 0,0 -7.3392,1.49502 -18.6197,1.49502 h -10.0574 c 12.5037,-20.25065 27.5898,-31.80303 27.5898,-48.11228 0,-12.36785 -5.4364,-19.16336 -20.7943,-19.16336 -12.2319,0 -24.4639,3.39776 -24.4639,7.61098 0,2.31047 0.136,7.20325 1.9028,11.14465 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#3566a5;fill-opacity:1;stroke-width:4.07731199px"
id="path1095"
inkscape:connector-curvature="0" />
<path
d="m 1500.8287,405.7267 c 0,25.82298 4.2132,41.45267 24.0561,41.45267 19.5711,0 24.8716,-15.49378 24.8716,-46.48135 0,-23.78432 -7.2032,-36.28807 -24.5998,-36.28807 -17.1247,0 -24.3279,14.13468 -24.3279,41.31675 z m 16.5811,0.54364 c 0,-17.39652 1.2231,-28.54118 8.5623,-28.54118 6.2519,0 7.7469,8.42645 7.7469,22.96886 0,24.46387 -2.7182,32.89031 -8.2905,32.89031 -7.0674,0 -8.0187,-6.79552 -8.0187,-27.31799 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#3566a5;fill-opacity:1;stroke-width:4.07731199px"
id="path1097"
inkscape:connector-curvature="0" />
<path
d="m 1560.6823,381.53465 c 0,0 5.8442,-1.3591 12.9115,-1.63092 l -1.2232,51.78186 c -12.6396,0 -17.2606,0.81546 -17.2606,4.21322 0,3.53367 0.1359,6.65961 0.4078,10.05737 h 45.2581 c 3.3978,0 3.3978,-3.26185 3.3978,-14.81424 0,0 -4.0773,0.54365 -8.2906,0.54365 h -7.6109 l 1.6309,-66.46018 c -0.6796,-0.54364 -2.7182,-0.81546 -3.9414,-0.81546 -7.2033,0 -27.5898,4.62095 -27.5898,7.74689 0,3.66958 0.6795,6.5237 2.3104,9.37781 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#3566a5;fill-opacity:1;stroke-width:4.07731199px"
id="path1099"
inkscape:connector-curvature="0" />
<path
d="m 1622.7106,445.68436 c -3.3978,0 -6.9314,-0.67956 -9.6497,-1.49502 -0.8154,2.85412 -1.3591,7.47507 -1.3591,10.05737 0,4.48504 5.7083,5.84415 13.0474,5.84415 24.1921,0 33.434,-17.39653 33.8417,-53.27687 -0.6795,-34.79306 -4.0773,-43.62724 -23.6484,-43.62724 -16.3092,0 -25.5511,10.05737 -25.5511,33.9776 0,17.39653 7.6109,27.86163 18.4838,27.86163 7.7469,0 12.096,-2.31048 15.7656,-6.93143 -0.9514,14.95014 -5.0287,27.58981 -20.9302,27.58981 z m 9.9214,-34.65715 c -5.5723,0 -8.2905,-6.11597 -8.2905,-15.49379 0,-12.77557 4.621,-18.89154 10.8728,-18.89154 6.9315,0 8.8342,6.38779 8.8342,27.31799 v 0.81546 c -3.6696,4.75686 -7.4751,6.25188 -11.4165,6.25188 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#3566a5;fill-opacity:1;stroke-width:4.07731199px"
id="path1101"
inkscape:connector-curvature="0" />
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="title"
style="display:none">
<g
style="display:inline"
id="g3732-6"
transform="matrix(2.0475567,0,0,2.0475567,979.07911,-71.674635)">
<path
inkscape:connector-curvature="0"
d="m 60.69548,67.493897 c 0,11.5675 -9.48796,20.9448 -21.19195,20.9448 -11.703989,0 -21.191949,-9.3773 -21.191949,-20.9448 0,-11.5674 9.48796,-20.9447 21.191949,-20.9447 11.70399,0 21.19195,9.3773 21.19195,20.9447 z"
id="path3544-1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;opacity:0.8;fill:url(#radialGradient3637-3);fill-opacity:1;stroke:url(#radialGradient3639-5);stroke-width:1.46151388;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<g
transform="matrix(1.4615138,0,0,2.5218672,4.4272,31.547917)"
id="g3546-8"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:#000000;fill-opacity:1;stroke:none">
<path
inkscape:connector-curvature="0"
d="m 24,13 -8.1875,15.225744 c 11.445471,0 5.976697,0 16.34375,0 z m 0,4.96875 4,7.421875 h -7.953125 z"
id="path3548-79"
style="fill:url(#linearGradient3991-3-88-5);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3993-1-9-7);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
d="M 26.355979,42.522608 20,21.277828 13.644021,42.522609"
transform="matrix(1,0,0,0.57953638,4,2.7937247)"
id="path3550-2"
style="fill:none;stroke:#ffffff;stroke-width:1.31358945px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
inkscape:connector-curvature="0"
d="m 53.38791,67.493897 c 0,7.6681 -6.21625,13.8844 -13.88438,13.8844 -7.66813,0 -13.884379,-6.2163 -13.884379,-13.8844 0,-7.6681 6.216249,-13.8844 13.884379,-13.8844 7.66813,0 13.88438,6.2163 13.88438,13.8844 z"
id="path3552-0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:url(#radialGradient3995-7-4-0-2-2-0-9);fill-opacity:1;stroke:url(#radialGradient3997-3-3-4-7-7-6-1);stroke-width:1.46151388;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<g
transform="matrix(3.2735609,0,0,3.2593101,-24.33091,59.292917)"
id="g3554-2"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:#000000;fill-opacity:1;stroke:none">
<path
inkscape:connector-curvature="0"
d="M 11,2.25 C 11,3.2164983 10.195512,4 9.203125,4 8.2107383,4 7.40625,3.2164983 7.40625,2.25 7.40625,1.2835017 8.2107383,0.5 9.203125,0.5 10.195512,0.5 11,1.2835017 11,2.25 Z"
transform="matrix(1.1130433,0,0,1.1428572,9.2565233,-0.07142864)"
id="path3556-3"
style="fill:url(#radialGradient3999-1-4-6-0-0-3-2);fill-opacity:1;stroke:#555753;stroke-width:0.39671427;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
d="M 20,1.5 C 20,1.7761424 19.776142,2 19.5,2 19.223858,2 19,1.7761424 19,1.5 19,1.2238576 19.223858,1 19.5,1 19.776142,1 20,1.2238576 20,1.5 Z"
transform="matrix(1.8125,0,0,1.8125,-16.465404,-0.9288198)"
id="path3558-7"
style="fill:#ffffff;fill-opacity:1;stroke:none" />
</g>
<path
inkscape:connector-curvature="0"
d="m 44.61882,67.441097 c 0,2.8124 -2.2902,5.0924 -5.1153,5.0924 -2.8251,0 -5.1153,-2.28 -5.1153,-5.0924 0,-2.8125 2.2902,-5.0924 5.1153,-5.0924 2.8251,0 5.1153,2.2799 5.1153,5.0924 z"
id="path3560-5"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:url(#radialGradient4001-9-6-9-6-60-6-9);stroke-width:1.46151364;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:131.04367065px;line-height:125%;font-family:Sans;letter-spacing:0.28665793px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:2.04755735"
x="1104.8673"
y="136.28465"
id="text3743-6-9"><tspan
sodipodi:role="line"
id="tspan3745-0-2"
x="1104.8673"
y="136.28465"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:131.04367065px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';letter-spacing:0.28665793px;fill:#a00000;fill-opacity:1;stroke-width:2.04755735"
dx="0 0">Os</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:81.90226746px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:2.04755735"
x="1288.4238"
y="136.28465"
id="text3760-7-2"><tspan
sodipodi:role="line"
id="tspan3762-0-8"
x="1288.4238"
y="136.28465"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:131.04367065px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';fill:#a00000;fill-opacity:1;stroke-width:2.04755735">o</tspan></text>
<text
id="text4707-97"
y="137.59502"
x="1338.8434"
style="font-style:normal;font-weight:bold;font-size:131.04367065px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Yanone Kaffeesatz Bold';letter-spacing:0px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:2.04755735"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:131.04367065px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:2.04755735"
y="137.59502"
x="1338.8434"
id="tspan4705-36"
sodipodi:role="line">Con</tspan></text>
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:64px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Andale Mono';writing-mode:lr-tb;display:inline;fill:#a00000;fill-opacity:1;stroke:#a00000;stroke-width:2.04755735;stroke-opacity:1"
d="m 1232.1703,70.382814 -8.8741,15.272702 -4.0593,-6.9865 1.2039,55.028084 c 3.887,-2.71488 5.3164,1.47605 5.3748,-0.61985 l 1.4237,-51.004974 c 3.0141,-1.57252 6.0272,-2.227521 8.9101,-2.227521 5.2418,0 7.3232,1.833021 7.4545,6.550591 l 0.5798,47.161764 c 3.6356,-1.03422 6.9193,0.79411 6.9344,-0.35191 l 0.6478,-49.061364 c 2.883,-1.834611 7.188,-4.171091 10.202,-4.171091 5.2417,0 6.3099,2.625001 6.4185,8.914071 l 0.7878,45.610104 c 2.4651,-0.38781 5.9664,1.24339 5.9987,-0.39591 l 0.9038,-45.998034 c 0.2319,-11.791681 1.3508,-17.564192 -11.7533,-17.564192 -5.3728,0 -11.6612,1.57328 -16.1166,4.063111 -2.4899,-2.620651 -6.1586,-4.063111 -11.7935,-4.063111 -1.5361,0 -2.9245,-0.0721 -4.243,-0.15595 z"
id="path3959-9-26-3-1"
inkscape:connector-curvature="0" />
<path
d="m 1223.2952,85.655406 -9.2281,-15.875942 -9.2281,-15.876132 h 18.4562 18.4561 l -9.2281,15.876132 z"
id="path3981-0-4-1-2"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;stroke:#e19c9c;stroke-width:10.23778343;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
d="M 1272.1299,132.44473 V 75.679295"
id="path3983-4-9-2-9"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:10.28292942;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
d="M 1247.6099,132.4208 V 91.835136"
id="path3985-4-0-9-3"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:10.23778343;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
d="m 1223.2938,132.77645 -0.022,-24.06433"
id="path3951-0-4-91-2-1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:9.56036377;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<text
id="text4707-9"
y="138.64339"
x="1700.7795"
style="font-style:normal;font-weight:bold;font-size:131.04367065px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Yanone Kaffeesatz Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;display:inline;fill:#3566a5;fill-opacity:1;stroke:none;stroke-width:2.04755735"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:131.04367065px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';text-align:end;text-anchor:end;fill:#3566a5;fill-opacity:1;stroke-width:2.04755735"
y="138.64339"
x="1700.7795"
id="tspan4705-3"
sodipodi:role="line">2018</tspan></text>
</g>
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="subtitle"
style="display:none">
<g
style="display:inline"
id="g1750"
transform="matrix(19.592171,0,0,19.592171,-1582.9761,-2384.3012)">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.16364908px;line-height:100%;font-family:Galette;-inkscape-font-specification:'Galette Bold';letter-spacing:0px;word-spacing:0px;fill:#3465a4;fill-opacity:1;stroke:none;stroke-width:0.02372737px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="167.53929"
y="132.21951"
id="text1124"><tspan
sodipodi:role="line"
id="tspan1122"
x="167.53929"
y="132.21951"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';text-align:end;letter-spacing:0px;text-anchor:end;fill:#3465a4;fill-opacity:1;stroke-width:0.02372737px">0x2B || <tspan
style="letter-spacing:0px;fill:#a00000;fill-opacity:1"
id="tspan1454">!</tspan>0x2B</tspan><tspan
sodipodi:role="line"
x="167.53929"
y="135.49736"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';text-align:end;letter-spacing:0px;text-anchor:end;fill:#3465a4;fill-opacity:1;stroke-width:0.02372737px"
id="tspan1126">18-19 Oct. 2018</tspan><tspan
sodipodi:role="line"
x="167.53929"
y="138.77521"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';text-align:end;letter-spacing:0px;text-anchor:end;fill:#3465a4;fill-opacity:1;stroke-width:0.02372737px"
id="tspan1128">Berl n</tspan></text>
<g
transform="matrix(0.20459945,0,0,0.20459945,152.35276,113.27741)"
id="g27740">
<g
id="g28309">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.98000004;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.24451828;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 3820.6562,472.26172 c -40.3422,0 -73.1445,32.3975 -73.1445,72.32812 0,30.32091 18.9212,56.28015 45.6875,67.02735 l 1.8555,-5.95508 c -24.2644,-9.91834 -41.2988,-33.51066 -41.2988,-61.07227 0,-36.51604 29.8935,-66.08398 66.9003,-66.08398 37.0069,0 66.8985,29.56794 66.8985,66.08398 0,24.66524 -13.6587,46.14338 -33.918,57.50977 -2.3907,1.34129 -4.8745,2.53952 -7.4355,3.58594 l 1.8535,5.96875 c 2.9828,-1.19355 5.8704,-2.56971 8.6426,-4.125 22.1465,-12.42531 37.1035,-35.96788 37.1035,-62.93946 0,-39.93062 -32.8023,-72.32812 -73.1446,-72.32812 z m 7.5,137.99414 c -2.4618,0.2706 -4.962,0.41602 -7.5,0.41602 -2.5028,0 -4.9696,-0.14473 -7.4003,-0.40821 l -1.8633,6.05469 c 3.0363,0.3807 6.1241,0.59767 9.2636,0.59766 3.182,0 6.3161,-0.2044 9.3926,-0.59571 z"
id="path3544-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ssccsssscccsscsccccc"
transform="matrix(0.04785074,0,0,0.04785074,-118.05951,92.995687)" />
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#a00000;stroke-width:6.34386444px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3811.3887,563.87891 -30.2735,97.13867 h 78.9297 l -30.1523,-97.125 c -2.8017,1.31925 -5.9315,2.05859 -9.2364,2.05859 -3.3169,0 -6.4581,-0.74396 -9.2675,-2.07226 z m 9.2675,11.66406 19.3165,61.84961 h -38.4082 z"
transform="matrix(0.04785074,0,0,0.04785074,-118.05951,92.995687)"
id="path3548-6"
inkscape:connector-curvature="0" />
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;stroke:#a00000;stroke-width:0.3038334;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3556-1"
d="m 65.796938,119.04618 c 0,0.56924 -0.463484,1.03071 -1.035215,1.03071 -0.571734,0 -1.035215,-0.46147 -1.035215,-1.03071 0,-0.56925 0.463481,-1.03071 1.035215,-1.03071 0.571731,0 1.035215,0.46146 1.035215,1.03071 z"
inkscape:connector-curvature="0" />
</g>
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;stroke:#3465a4;stroke-width:0.29880485;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
id="path3552-8"
d="m 66.957088,119.05451 c 0,1.21246 -0.982899,2.19537 -2.195365,2.19537 -1.212466,0 -2.195365,-0.98291 -2.195365,-2.19537 0,-1.21246 0.982899,-2.19537 2.195365,-2.19537 1.212466,0 2.195365,0.98291 2.195365,2.19537 z"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 55 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 113 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 123 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 68 KiB

View file

@ -1,5 +1,5 @@
pillow pillow>=8.0.0
cssutils==1.0.2 cssutils==1.0.2
lxml==4.9.1 lxml~=5.3
svg.path==4.0.2 svg.path~=6.0
Wand==0.6.5 Wand~=0.6.5

View file

@ -100,6 +100,12 @@ def events(scheduleUrl, titlemap={}):
url = event.find('url').text.strip() url = event.find('url').text.strip()
else: else:
url = '' url = ''
if event.find('track') is not None and event.find('track').text is not None:
track = event.find('track').text
else:
track = ''
# yield a tupel with the event-id, event-title and person-names # yield a tupel with the event-id, event-title and person-names
yield { yield {
'day': day.get('index'), 'day': day.get('index'),
@ -109,7 +115,7 @@ def events(scheduleUrl, titlemap={}):
'persons': personnames, 'persons': personnames,
'personnames': ', '.join(personnames), 'personnames': ', '.join(personnames),
'room': room.attrib['name'], 'room': room.attrib['name'],
'track': event.find('track').text, 'track': track,
'url': url 'url': url
} }

BIN
vcfb24/Computerfont.ttf Normal file

Binary file not shown.

Binary file not shown.

37
vcfb24/config.ini Normal file
View file

@ -0,0 +1,37 @@
[meta]
schedule = http://vcfb.de/2024/schedule.xml
# ffmpeg -loop 1 -i intro.png -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -c:v libx264 -tune stillimage -pix_fmt yuv420p -c:a aac -r 25 -t 10 intro.mp4
template = intro.mp4
alpha = false
prores = false
inout_type = t
fade_duration = 0.5
[title]
in = 1
out = 9.5
fontfile = Computerfont.ttf
fontsize = 100
fontcolor = #ffffff
x = 85
y = 122
[speaker]
in = 2
out = 9
fontfile = SourceSansPro-Semibold.ttf
fontsize = 65
fontcolor = #ffffff
x = 85
y = 861
[text]
in = 0
out = 0
fontfile = Computerfont.ttf
fontsize = 0
fontcolor = #ffffff
x = 0
y = 0
; text =

15584
vcfb24/intro.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 2.1 MiB

6231
vcfb24/lower-third.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1 MiB

1668
vcfb24/outro.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 935 KiB

6626
vcfb24/pause.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1,015 KiB