diff --git a/00_example_render_byid/__init__.py b/00_example_render_byid/__init__.py
new file mode 100644
index 0000000..865f8d0
--- /dev/null
+++ b/00_example_render_byid/__init__.py
@@ -0,0 +1,278 @@
+#!/usr/bin/python3
+
+from renderlib import *
+from easing import *
+
+# URL to Schedule-XML
+scheduleUrl = 'https://2016.mrmcd.net/fahrplan/schedule.xml'
+
+def introFrames(args):
+#fade in pillgroup0
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('pillgroup0', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup1', 'style', 'opacity', 0),
+ ('pillgroup2', 'style', 'opacity', 0),
+ ('pillgroup3', 'style', 'opacity', 0),
+ ('pillgroup4', 'style', 'opacity', 0),
+ ('logotext', 'style', 'opacity', 0),
+ ('title', 'style', 'opacity', 0),
+ ('subtitle', 'style', 'opacity', 0),
+ ('persons', 'style', 'opacity', 0),
+ ('id', 'style', 'opacity', 0),
+ )
+#fade in and move in pillgroup 1-4 of thorax + fade in logotext
+ y12start = 1450
+ y12end = 917.679
+ x3start = 610
+ x4start = 610
+ frames = 2*fps
+ for i in range(0, frames):
+ y12 = (y12end-y12start) - ((i+1) * ((y12end-y12start)/frames))
+ x3 = -x3start + ((i+1) * (x3start/frames))
+ x4 = x4start - ((i+1) * ((x4start)/frames))
+ #print("---------------------------------------------------")
+ #print (i, "/", frames)
+ #print(y12)
+ #print(x3)
+ #print(x4)
+ #print("---------------------------------------------------")
+ yield (
+ ('pillgroup1', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup2', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup3', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup4', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('logotext', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup1', 'attr', 'transform', 'translate(0, %.4f)' % (y12)),
+ ('pillgroup2', 'attr', 'transform', 'translate(0, %.4f)' % (y12)),
+ ('pillgroup3', 'attr', 'transform', 'translate(%.4f, 0)' % (x3)),
+ ('pillgroup4', 'attr', 'transform', 'translate(%.4f, 0)' % (x4)),
+ )
+#show pillgroup 0-4 + logotext for 1 second
+ frames = 1*fps
+ for i in range(0, frames):
+ yield(
+ ('pillgroup0', 'style', 'opacity', 1),
+ ('pillgroup1', 'style', 'opacity', 1),
+ ('pillgroup2', 'style', 'opacity', 1),
+ ('pillgroup3', 'style', 'opacity', 1),
+ ('pillgroup4', 'style', 'opacity', 1),
+ ('logotext', 'style', 'opacity', 1),
+ )
+#move pillgroup 0-4 + logotext to right
+ frames = 2*fps
+ for i in range(0, frames):
+ xshift = (i+1) * 490/frames
+ #print(xshift)
+ yield(
+ ('pillgroup0', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('pillgroup1', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('pillgroup2', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('pillgroup3', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('pillgroup4', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('logotext', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ )
+#fade in title, subtitle, persons and id
+ frames = 2*fps
+ for i in range(0, frames):
+ yield(
+ ('title', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('subtitle', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('persons', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('id', '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),
+ ('subtitle', 'style', 'opacity', 1),
+ ('persons', 'style', 'opacity', 1),
+ ('id', 'style', 'opacity', 1),
+ )
+
+def backgroundFrames(parameters):
+ # 40 Sekunden
+
+ frames = 20*fps
+ for i in range(0, frames):
+ xshift = (i+1) * 300/frames
+ yshift = ((i+1) * (150/frames))
+ yield(
+ ('pillgroup', 'attr', 'transform', 'translate(%.4f, %.4f)' % (xshift, yshift)),
+ )
+
+ frames = 20*fps
+ for i in range(0, frames):
+ xshift = 300 - ((i+1) * (300/frames))
+ yshift = 150 - ((i+1) * (150/frames))
+ yield(
+ ('pillgroup', 'attr', 'transform', 'translate(%.4f, %.4f)' % (xshift, yshift)),
+ )
+
+def outroFrames(args):
+#fadein outro graphics
+ frames = 3*fps
+ for i in range(0, frames):
+ yield(
+ ('pillgroup', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('logotext', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('c3voclogo', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('c3voctext', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('bysalogo', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('bysatext', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ )
+ frames = 3*fps
+ for i in range(0, frames):
+ yield(
+ ('pillgroup', 'style', 'opacity', 1),
+ ('logotext', 'style', 'opacity', 1),
+ ('c3voclogo', 'style', 'opacity', 1),
+ ('c3voctext', 'style', 'opacity', 1),
+ ('bysalogo', 'style', 'opacity', 1),
+ ('bysatext', 'style', 'opacity', 1),
+ )
+
+def pauseFrames(args):
+#fade heartgroups
+ frames = int(0.5*fps)
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+
+def debug():
+ render('intro.svg',
+ '../intro.ts',
+ introFrames,
+ {
+ '$id': 7776,
+ '$title': 'StageWar live!',
+ '$subtitle': 'Metal Konzert',
+ '$persons': 'www.stagewar.de'
+ }
+ )
+
+ 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 000000 in idlist:
+ continue
+ if event['room'] not in ('Chirurgie (Saal 1.04)', 'Kreißsaal (Saal 1.11)'):
+ print("skipping room %s (%s)" % (event['room'], event['title']))
+ continue
+ if not (idlist==None):
+ if int(event['id']) not in idlist:
+ print("skipping id %s (%s)" % (event['id'], event['title']))
+ 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'],
+ '$persons': 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
+ ))
diff --git a/00_example_render_byid/artwork/background.bak.svg b/00_example_render_byid/artwork/background.bak.svg
new file mode 100644
index 0000000..1589fd4
--- /dev/null
+++ b/00_example_render_byid/artwork/background.bak.svg
@@ -0,0 +1,26816 @@
+
+
+
+
diff --git a/00_example_render_byid/artwork/background.bak2.svg b/00_example_render_byid/artwork/background.bak2.svg
new file mode 100644
index 0000000..2beb6d1
--- /dev/null
+++ b/00_example_render_byid/artwork/background.bak2.svg
@@ -0,0 +1,18468 @@
+
+
+
+
diff --git a/00_example_render_byid/artwork/background.svg b/00_example_render_byid/artwork/background.svg
new file mode 100644
index 0000000..b197838
--- /dev/null
+++ b/00_example_render_byid/artwork/background.svg
@@ -0,0 +1,18482 @@
+
+
+
+
diff --git a/00_example_render_byid/artwork/by-sa.svg b/00_example_render_byid/artwork/by-sa.svg
new file mode 100644
index 0000000..60b44e3
--- /dev/null
+++ b/00_example_render_byid/artwork/by-sa.svg
@@ -0,0 +1,74 @@
+
+
+
\ No newline at end of file
diff --git a/00_example_render_byid/artwork/intro.svg b/00_example_render_byid/artwork/intro.svg
new file mode 100644
index 0000000..2420f6a
--- /dev/null
+++ b/00_example_render_byid/artwork/intro.svg
@@ -0,0 +1,9880 @@
+
+
+
+
diff --git a/00_example_render_byid/artwork/intro_bak.svg b/00_example_render_byid/artwork/intro_bak.svg
new file mode 100644
index 0000000..aa9fc1b
--- /dev/null
+++ b/00_example_render_byid/artwork/intro_bak.svg
@@ -0,0 +1,9680 @@
+
+
+
+
diff --git a/00_example_render_byid/artwork/intro_path.svg b/00_example_render_byid/artwork/intro_path.svg
new file mode 100644
index 0000000..7c7e0b1
--- /dev/null
+++ b/00_example_render_byid/artwork/intro_path.svg
@@ -0,0 +1,9694 @@
+
+
+
+
diff --git a/00_example_render_byid/artwork/intro_source.svg b/00_example_render_byid/artwork/intro_source.svg
new file mode 100644
index 0000000..3a33c27
--- /dev/null
+++ b/00_example_render_byid/artwork/intro_source.svg
@@ -0,0 +1,4055 @@
+
+
+
+
diff --git a/00_example_render_byid/artwork/outro.svg b/00_example_render_byid/artwork/outro.svg
new file mode 100644
index 0000000..a3f77c3
--- /dev/null
+++ b/00_example_render_byid/artwork/outro.svg
@@ -0,0 +1,9993 @@
+
+
+
+
diff --git a/00_example_render_byid/artwork/pause.svg b/00_example_render_byid/artwork/pause.svg
new file mode 100644
index 0000000..f239a1f
--- /dev/null
+++ b/00_example_render_byid/artwork/pause.svg
@@ -0,0 +1,6815 @@
+
+
+
+
diff --git a/00_example_render_byid/artwork/ws_mrmcd16.svg b/00_example_render_byid/artwork/ws_mrmcd16.svg
new file mode 100644
index 0000000..976d778
--- /dev/null
+++ b/00_example_render_byid/artwork/ws_mrmcd16.svg
@@ -0,0 +1,7792 @@
+
+
+
+
\ No newline at end of file
diff --git a/00_example_render_byid/artwork/ws_mrmcd16_logo.svg b/00_example_render_byid/artwork/ws_mrmcd16_logo.svg
new file mode 100644
index 0000000..453b0f5
--- /dev/null
+++ b/00_example_render_byid/artwork/ws_mrmcd16_logo.svg
@@ -0,0 +1,7686 @@
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index be36265..18ef3f2 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,8 @@ Okay, let's go.
- Install python3, python3-lxml, python3-cssutils, inkscape and libav-tools
- Fork this repo on github and clone your personal fork to your local system.
- - Copy one of the existing setups (I'd suggest Datengarten `dg` for a start).
+ - Copy one of the existing setup: 00_example_render_byid
+ - If you are using a newer version of intro-outro-generator, don't copy any of the other projects, as the __init.py__ may not contain all mandatory parameters in the tasks function.
- Open `artwork/intro.svg` (preroll template) in inkscape and modify it. You can also just create a new one. For the VOC-Setup you should use a Pixel-Resolution of `1920×1080` (or for the legacy SD/.dv-Pipeline `1024×576`).
- Group things together that should be animated together (like subtitle and speaker-text)
- Use Flow-Text (in Inkscape drag an Area of Text instead of just placing a single line). This way the text will automatically wrap inside the specified area if it gets too long.
@@ -34,6 +35,48 @@ Okay, let's go.
- Viewing through those pngs to check if all intros are looking good with the real-world titles- and person-names
- Viewing through the pngs is faster then opening each clip and waiting 5 seconds.
+Quick start
+--------------------
+
+Start your own project by copying "00_example_render_byid" folder which contains all changes to use the new features.
+
+Just type ./make.py or ./make.py -h in the main directory and you'll get the following help information.
+
+usage: make.py [-h] [--debug] [--id ID [ID ...]] [--skip SKIP [SKIP ...]]
+ yourproject/
+
+C3VOC Intro-Outro-Generator
+
+positional arguments:
+ yourproject/
+ Path to your project is a required argument.
+ Usage: ./make.py yourproject/
+ Without any further argument(s) given, your whole project will be rendered.
+
+
+optional arguments:
+ -h, --help show this help message and exit
+ --debug
+ Run script in debug mode and just render the debug values
+ given in your projects __init.py__
+ This argument must not be used together with --id
+ Usage: ./make.py yourproject/ --debug
+
+ --id ID [ID ...]
+ Only render the given ID(s) from your projects schedule.
+ This argument must not be used together with --debug
+ Usage: ./make.py yourproject/ --id 4711 0815 4223 1337
+ To skip all IDs (just generate intro/outro/background files) use it with --id 000000
+
+ --skip SKIP [SKIP ...]
+
+ Skip outro, pause and/or background files in rendering if not needed.
+ This argument must not be used together with --debug
+ Usage: ./make.py yourproject/ --skip pause out bg
+ Example - only generate outro: ./make.py yourproject/ --skip pause bg
+ Example - only generate pause and background: ./make.py yourproject/ --skip out
+
+
The Frame-Generators
--------------------
The animation sequence is controlled by the three frame-generator routines vorspanFrames, abspannFrames and pauseFrames. Each of them yields one tupel per frame. This Frame-Tupel contains one Sub-Tupel per Animated Element, which has one of two forms:
diff --git a/make.py b/make.py
index c029a3c..e5d642f 100755
--- a/make.py
+++ b/make.py
@@ -11,15 +11,62 @@ import multiprocessing
from threading import Thread, Lock
from queue import Queue
import renderlib
+import argparse
+
+# Parse arguments
+parser = argparse.ArgumentParser(description='C3VOC Intro-Outro-Generator', usage="see help with option -h", formatter_class=argparse.RawTextHelpFormatter)
+parser.add_argument('projectpath', action="store", metavar='yourproject/', type=str, help='''
+ Path to your project is a required argument.
+ Usage: ./make.py yourproject/
+ Without any further argument(s) given, your whole project will be rendered.
+ ''')
+parser.add_argument('--debug', action="store_true", default=False, help='''
+ Run script in debug mode and just render the debug values
+ given in your projects __init.py__
+ This argument must not be used together with --id
+ Usage: ./make.py yourproject/ --debug
+ ''')
+parser.add_argument('--id', 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.py yourproject/ --id 4711 0815 4223 1337
+ To skip all IDs (just generate intro/outro/background files) use it with --id 000000
+ ''')
+parser.add_argument('--skip', nargs='+', action="store", type=str, help='''
+ Skip outro, pause and/or background files in rendering if not needed.
+ This argument must not be used together with --debug
+ Usage: ./make.py yourproject/ --skip pause out bg
+ Example - only generate outro: ./make.py yourproject/ --skip pause bg
+ Example - only generate pause and background: ./make.py yourproject/ --skip out
+ ''')
-# Project-Name
if len(sys.argv) < 2:
- print("you must specify a project-name as first argument, eg. './make.py sotmeu14'")
+ parser.print_help()
sys.exit(1)
-args = sys.argv[1:]
+args = parser.parse_args()
-projectname = args.pop(0).strip('/')
+if not (args.debug==False or args.id==None):
+ print("##################################################")
+ print("Error! You must not use --debug and --id together!")
+ print("##################################################")
+ parser.print_help()
+ sys.exit(1)
+
+if not (args.debug==False or args.skip==None):
+ print("####################################################")
+ print("Error! You must not use --debug and --skip together!")
+ print("####################################################")
+ parser.print_help()
+ sys.exit(1)
+
+print(args)
+
+# Set values from argparse
+projectname=args.projectpath.strip('/')
+projectpath=args.projectpath
+
+# Check if project exists
try:
project = renderlib.loadProject(projectname)
except ImportError:
@@ -28,7 +75,8 @@ except ImportError:
# using --debug skips the threading, the network fetching of the schedule and
# just renders one type of video
-renderlib.debug = ('--debug' in sys.argv)
+renderlib.debug = args.debug
+#sys.exit(1)
def render(infile, outfile, sequence, parameters={}, workdir=os.path.join(projectname, 'artwork')):
task = renderlib.Rendertask(infile=infile, outfile=outfile, sequence=sequence, parameters=parameters, workdir=workdir)
@@ -53,7 +101,7 @@ if renderlib.debug:
tasks = Queue()
# call into project which generates the tasks
-project.tasks(tasks, args)
+project.tasks(tasks, projectpath, args.id, args.skip)
# one working thread per cpu
num_worker_threads = multiprocessing.cpu_count()
@@ -65,7 +113,7 @@ for _ in range(num_worker_threads):
# this lock ensures, that only one thread at a time is writing to stdout
# and avoids output from multiple threads intermixing
-printLock = Lock()
+printLock = Lock()
def tprint(str):
# aquire lock
printLock.acquire()
diff --git a/mrmcd2016/__init__.py b/mrmcd2016/__init__.py
new file mode 100644
index 0000000..6078795
--- /dev/null
+++ b/mrmcd2016/__init__.py
@@ -0,0 +1,269 @@
+#!/usr/bin/python3
+
+from renderlib import *
+from easing import *
+
+# URL to Schedule-XML
+scheduleUrl = 'https://2016.mrmcd.net/fahrplan/schedule.xml'
+
+def introFrames(args):
+#fade in pillgroup0
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('pillgroup0', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup1', 'style', 'opacity', 0),
+ ('pillgroup2', 'style', 'opacity', 0),
+ ('pillgroup3', 'style', 'opacity', 0),
+ ('pillgroup4', 'style', 'opacity', 0),
+ ('logotext', 'style', 'opacity', 0),
+ ('title', 'style', 'opacity', 0),
+ ('subtitle', 'style', 'opacity', 0),
+ ('persons', 'style', 'opacity', 0),
+ ('id', 'style', 'opacity', 0),
+ )
+#fade in and move in pillgroup 1-4 of thorax + fade in logotext
+ y12start = 1450
+ y12end = 917.679
+ x3start = 610
+ x4start = 610
+ frames = 2*fps
+ for i in range(0, frames):
+ y12 = (y12end-y12start) - ((i+1) * ((y12end-y12start)/frames))
+ x3 = -x3start + ((i+1) * (x3start/frames))
+ x4 = x4start - ((i+1) * ((x4start)/frames))
+ #print("---------------------------------------------------")
+ #print (i, "/", frames)
+ #print(y12)
+ #print(x3)
+ #print(x4)
+ #print("---------------------------------------------------")
+ yield (
+ ('pillgroup1', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup2', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup3', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup4', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('logotext', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('pillgroup1', 'attr', 'transform', 'translate(0, %.4f)' % (y12)),
+ ('pillgroup2', 'attr', 'transform', 'translate(0, %.4f)' % (y12)),
+ ('pillgroup3', 'attr', 'transform', 'translate(%.4f, 0)' % (x3)),
+ ('pillgroup4', 'attr', 'transform', 'translate(%.4f, 0)' % (x4)),
+ )
+#show pillgroup 0-4 + logotext for 1 second
+ frames = 1*fps
+ for i in range(0, frames):
+ yield(
+ ('pillgroup0', 'style', 'opacity', 1),
+ ('pillgroup1', 'style', 'opacity', 1),
+ ('pillgroup2', 'style', 'opacity', 1),
+ ('pillgroup3', 'style', 'opacity', 1),
+ ('pillgroup4', 'style', 'opacity', 1),
+ ('logotext', 'style', 'opacity', 1),
+ )
+#move pillgroup 0-4 + logotext to right
+ frames = 2*fps
+ for i in range(0, frames):
+ xshift = (i+1) * 490/frames
+ #print(xshift)
+ yield(
+ ('pillgroup0', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('pillgroup1', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('pillgroup2', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('pillgroup3', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('pillgroup4', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ ('logotext', 'attr', 'transform', 'translate(%.4f, 0)' % (xshift)),
+ )
+#fade in title, subtitle, persons and id
+ frames = 2*fps
+ for i in range(0, frames):
+ yield(
+ ('title', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('subtitle', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('persons', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
+ ('id', '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),
+ ('subtitle', 'style', 'opacity', 1),
+ ('persons', 'style', 'opacity', 1),
+ ('id', 'style', 'opacity', 1),
+ )
+
+def backgroundFrames(parameters):
+ # 40 Sekunden
+
+ frames = 20*fps
+ for i in range(0, frames):
+ xshift = (i+1) * 300/frames
+ yshift = ((i+1) * (150/frames))
+ yield(
+ ('pillgroup', 'attr', 'transform', 'translate(%.4f, %.4f)' % (xshift, yshift)),
+ )
+
+ frames = 20*fps
+ for i in range(0, frames):
+ xshift = 300 - ((i+1) * (300/frames))
+ yshift = 150 - ((i+1) * (150/frames))
+ yield(
+ ('pillgroup', 'attr', 'transform', 'translate(%.4f, %.4f)' % (xshift, yshift)),
+ )
+
+def outroFrames(args):
+#fadein outro graphics
+ frames = 3*fps
+ for i in range(0, frames):
+ yield(
+ ('pillgroup', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('logotext', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('c3voclogo', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('c3voctext', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('bysalogo', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ ('bysatext', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
+ )
+ frames = 3*fps
+ for i in range(0, frames):
+ yield(
+ ('pillgroup', 'style', 'opacity', 1),
+ ('logotext', 'style', 'opacity', 1),
+ ('c3voclogo', 'style', 'opacity', 1),
+ ('c3voctext', 'style', 'opacity', 1),
+ ('bysalogo', 'style', 'opacity', 1),
+ ('bysatext', 'style', 'opacity', 1),
+ )
+
+def pauseFrames(args):
+#fade heartgroups
+ frames = int(0.5*fps)
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 0.25, 0.75, frames)),
+ )
+ for i in range(0, frames):
+ yield (
+ ('heartgroup1', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup2', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ ('heartgroup3', 'style', 'opacity', easeInQuad(i, 1, -0.75, frames)),
+ )
+
+def debug():
+ render('intro.svg',
+ '../intro.ts',
+ introFrames,
+ {
+ '$id': 7776,
+ '$title': 'StageWar live!',
+ '$subtitle': 'Metal Konzert',
+ '$persons': 'www.stagewar.de'
+ }
+ )
+
+ render('outro.svg',
+ '../outro.ts',
+ outroFrames
+ )
+
+ render(
+ 'background.svg',
+ '../background.ts',
+ backgroundFrames
+ )
+
+ render('pause.svg',
+ '../pause.ts',
+ pauseFrames
+ )
+
+
+def tasks(queue, args):
+ # iterate over all events extracted from the schedule xml-export
+ for event in events(scheduleUrl):
+ if event['room'] not in ('Chirurgie (Saal 1.04)', 'Kreißsaal (Saal 1.11)'):
+ print("skipping room %s (%s)" % (event['room'], event['title']))
+ 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'],
+ '$persons': event['personnames']
+ }
+ ))
+
+ # place a task for the outro into the queue
+ queue.put(Rendertask(
+ infile = 'outro.svg',
+ outfile = 'outro.ts',
+ sequence = outroFrames
+ ))
+
+ # place the pause-sequence into the queue
+ queue.put(Rendertask(
+ infile = 'pause.svg',
+ outfile = 'pause.ts',
+ sequence = pauseFrames
+ ))
+
+ # place the pause-sequence into the queue
+ queue.put(Rendertask(
+ infile = 'background.svg',
+ outfile = 'background.ts',
+ sequence = backgroundFrames
+ ))
diff --git a/mrmcd2016/artwork/background.bak.svg b/mrmcd2016/artwork/background.bak.svg
new file mode 100644
index 0000000..1589fd4
--- /dev/null
+++ b/mrmcd2016/artwork/background.bak.svg
@@ -0,0 +1,26816 @@
+
+
+
+
diff --git a/mrmcd2016/artwork/background.bak2.svg b/mrmcd2016/artwork/background.bak2.svg
new file mode 100644
index 0000000..2beb6d1
--- /dev/null
+++ b/mrmcd2016/artwork/background.bak2.svg
@@ -0,0 +1,18468 @@
+
+
+
+
diff --git a/mrmcd2016/artwork/background.svg b/mrmcd2016/artwork/background.svg
new file mode 100644
index 0000000..b197838
--- /dev/null
+++ b/mrmcd2016/artwork/background.svg
@@ -0,0 +1,18482 @@
+
+
+
+
diff --git a/mrmcd2016/artwork/by-sa.svg b/mrmcd2016/artwork/by-sa.svg
new file mode 100644
index 0000000..60b44e3
--- /dev/null
+++ b/mrmcd2016/artwork/by-sa.svg
@@ -0,0 +1,74 @@
+
+
+
\ No newline at end of file
diff --git a/mrmcd2016/artwork/intro.svg b/mrmcd2016/artwork/intro.svg
new file mode 100644
index 0000000..2420f6a
--- /dev/null
+++ b/mrmcd2016/artwork/intro.svg
@@ -0,0 +1,9880 @@
+
+
+
+
diff --git a/mrmcd2016/artwork/intro_bak.svg b/mrmcd2016/artwork/intro_bak.svg
new file mode 100644
index 0000000..aa9fc1b
--- /dev/null
+++ b/mrmcd2016/artwork/intro_bak.svg
@@ -0,0 +1,9680 @@
+
+
+
+
diff --git a/mrmcd2016/artwork/intro_path.svg b/mrmcd2016/artwork/intro_path.svg
new file mode 100644
index 0000000..7c7e0b1
--- /dev/null
+++ b/mrmcd2016/artwork/intro_path.svg
@@ -0,0 +1,9694 @@
+
+
+
+
diff --git a/mrmcd2016/artwork/intro_source.svg b/mrmcd2016/artwork/intro_source.svg
new file mode 100644
index 0000000..3a33c27
--- /dev/null
+++ b/mrmcd2016/artwork/intro_source.svg
@@ -0,0 +1,4055 @@
+
+
+
+
diff --git a/mrmcd2016/artwork/outro.svg b/mrmcd2016/artwork/outro.svg
new file mode 100644
index 0000000..a3f77c3
--- /dev/null
+++ b/mrmcd2016/artwork/outro.svg
@@ -0,0 +1,9993 @@
+
+
+
+
diff --git a/mrmcd2016/artwork/pause.svg b/mrmcd2016/artwork/pause.svg
new file mode 100644
index 0000000..f239a1f
--- /dev/null
+++ b/mrmcd2016/artwork/pause.svg
@@ -0,0 +1,6815 @@
+
+
+
+
diff --git a/mrmcd2016/artwork/ws_mrmcd16.svg b/mrmcd2016/artwork/ws_mrmcd16.svg
new file mode 100644
index 0000000..976d778
--- /dev/null
+++ b/mrmcd2016/artwork/ws_mrmcd16.svg
@@ -0,0 +1,7792 @@
+
+
+
+
\ No newline at end of file
diff --git a/mrmcd2016/artwork/ws_mrmcd16_logo.svg b/mrmcd2016/artwork/ws_mrmcd16_logo.svg
new file mode 100644
index 0000000..453b0f5
--- /dev/null
+++ b/mrmcd2016/artwork/ws_mrmcd16_logo.svg
@@ -0,0 +1,7686 @@
+
+
+
+
\ No newline at end of file