intro-outro-generator/DS2018/__init__.py
mopox 132d0bb0c7
Add files via upload
Datenspuren 2018 intros
2018-09-19 17:58:40 +02:00

389 lines
11 KiB
Python

#!/usr/bin/python3
from renderlib import *
from easing import *
# code and artwork by mole
# URL to Schedule-XML
scheduleUrl = 'https://datenspuren.de/2018/fahrplan/schedule.xml'
def introFrames(args):
# (0.5 sec) show loading text
frames = int(fps/2)
loading=6+1
r = range(0, frames)
for i in r:
n = int(((loading/frames)*i)) if (i < r[-1]) else loading;
yield (
('t-loading-'+str(n), 'style', 'display', 'inline'),
)
# (3 sec) loading progress bar
frames = 3*fps
overlaysize = 1280
display = 'inline';
r = range(0, frames)
for i in r:
overlaypos = easeInCubic(i, 0, overlaysize, frames) if (i < r[-1]) else overlaysize
if (i % 4 == 0):
display = 'inline' if (display == 'none') else 'none';
else:
display = 'inline' if (i == r[-1]) else display
yield (
('g-t-loading', 'style', 'display', display),
('overlay', 'attr', 'transform', 'translate(%.4f, 0)' % (overlaypos)),
)
# (1 sec) move loading text to ds text coords
frames = int(1*fps)
loadingXdelta = 265.331+50
loading -= 1
r = range(0, frames)
for i in r:
loadingpos = easeInQuad(i, 0, loadingXdelta, frames) if (i < r[-1]) else loadingXdelta
n = abs(int((loading/frames*i)-loading))+1
loadingdisplay = 'none' if (n != abs(int((loading/frames*(i+1))-loading))+1) or (i == r[-1]) else 'inline'
yield (
('g-t-loading', 'attr', 'transform', 'translate(-%.4f, 0)' % (loadingpos)),
('t-loading-'+str(n), 'style', 'display', loadingdisplay),
)
# (1 sec) show ds2018 text
frames = int(1*fps)
datenspuren = 10+1
t2018Xdelta = 462.583
r = range(0, frames)
for i in r:
n = int((datenspuren/frames)*i) if (i < r[-1]) else datenspuren
t2018pos = easeInCubic(i, 0, t2018Xdelta, frames) if (i < r[-1]) else t2018Xdelta
t2018opacity = easeInQuad(i, 0, 1, frames) if (i < r[-1]) else 1
inlayopacity = easeInQuad(i, 1, -1, frames) if (i < r[-1]) else 0
yield (
('t-datenspuren-'+str(n), 'style', 'display', 'inline'),
('t-2018', 'attr', 'transform', 'translate(%.4f, 0)' % (t2018pos)),
('t-2018', 'style', 'opacity', '%.4f' % (t2018opacity)),
('inlay-19', 'style', 'opacity', '%.4f' % (inlayopacity)),
)
# (1 sec) move logo up
frames = 1*fps
logoYdelta = 260
r = range(0, frames)
for i in r:
logopos = easeInQuad(i, 0, logoYdelta, frames) if (i < r[-1]) else logoYdelta
yield (
('g-logo', 'attr', 'transform', 'translate(0, -%.4f)' % (logopos)),
)
# (1 sec) swipe info background
infosize = 1280
frames = 1*fps
r = range(0, frames)
for i in r:
infopos = i * (infosize / frames) if (i < r[-1]) else infosize;
yield (
('bginfo', 'attr', 'transform', 'translate(%.4f, 0)' % (infopos)),
)
# (1 sec) show data about talk
frames = 1*fps
r = range(0, frames)
for i in r:
opacity = easeInQuad(i, 0, 1, frames) if (i < r[-1]) else 1
yield (
('t-id', 'style', 'opacity', '%.4f' % (opacity)),
('t-title', 'style', 'opacity', '%.4f' % (opacity)),
('t-subtitle', 'style', 'opacity', '%.4f' % (opacity)),
)
# (1 sec) animate spacer and bounce names in
frames = 1*fps
spsize = 360
speakerXdelta = 1920-50
r = range(0, frames)
for i in range(0, frames):
sppos = i * (spsize / frames) if (i < r[-1]) else spsize
speakerpos = i * ( speakerXdelta/ frames) if (i < r[-1]) else speakerXdelta
yield (
('spacer', 'attr', 'transform', 'translate(%.4f, 0)' % (sppos)),
('g-t-speaker', 'attr', 'transform', 'translate(-%.4f, 0)' % (speakerpos)),
)
# (2 sec) show hackspace logos
frames = 2*fps
r = range(0, frames)
for i in r:
opacity = easeInCubic(i, 0, 1, frames) if (i == r[-1]) else 1
yield (
('c3d2', 'style', 'opacity', '%.4f' % (opacity)),
('t-zentralwerk', 'style', 'opacity', '%.4f' % (opacity)),
)
# (3 sec) wait some frames for reading the info texts
frames = 3*fps
beep = 0
dir = 1
r = range(0, frames)
for i in r:
yield(
('hb-'+str(beep+1),'style', 'display', 'none'),
('hb-'+str(beep), 'style', 'display', 'inline'),
('hb-'+str(beep-1),'style', 'display', 'none'),
)
if (i % 3 == 0):
# direction
if (beep == 24):
dir = 0
elif (beep == 0) and (i != 3):
dir = 1
# heartbeep
if (dir == 1):
beep += 1
else:
beep -= 1
# last frame
if (i == r[-int(frames/fps)-1]):
beep == 0;
# cut turn around frames
if (i == r[-int(frames/fps)]):
break
def backgroundFrames(parameters):
# (24 sec + 1frame) heartbeat
frames = 24*fps
beep = 0
dir = 1
r = range(0, frames)
for i in r:
yield(
('hb-'+str(beep+1),'style', 'display', 'none'),
('hb-'+str(beep), 'style', 'display', 'inline'),
('hb-'+str(beep-1),'style', 'display', 'none'),
)
if (i % 3 == 0):
# direction
if (beep == 24):
dir = 0
elif (beep == 0) and (i != 3):
dir = 1
# heartbeep
if (dir == 1):
beep += 1
else:
beep -= 1
# cut over lapping frames coz of turnaround
if (i == r[-24]):
break
def outroFrames(args):
# (2 sec) hide 2018 text
frames = int(2*fps)
datenspuren = 10+1
r = range(0, frames)
for i in range(0, frames):
n = abs(int((datenspuren/frames)*i)-datenspuren) if (i < r[-1]) else 1
t2018opacity = easeInQuad(i, 1, -1, frames) if (i < r[-1]) else 0
inlayopacity = easeInCubic(i, 0, 1, frames) if (i < r[-1]) else 1
yield(
('t-2018', 'style', 'opacity', '%.4f' % (t2018opacity)),
('inlay-19', 'style', 'opacity', '%.4f' % (inlayopacity)),
('t-datenspuren-'+ str(n), 'style', 'display', 'none'),
)
# (1 sec) fade unloading text
frames = int(1*fps)
loading = 9
r = range(0, frames)
for i in r:
n = int((loading/frames)*i) if (i < r[-1]) else loading
yield (
('t-loading-'+str(n), 'style', 'display', 'inline'),
)
# (2 sec) unloading progress bar
frames = 2*fps
overlaysize = 1280
display = 'inline';
n = 0
r = range(0, frames)
for i in r:
overlaypos = easeInQuad(i, 0, overlaysize, frames) if (i < r[-1]) else overlaysize
logoopacity = easeInCubic(i, 1, -1, frames) if (i < r[-1]) else 0
if (i < r[-int(frames/6)]):
c3d2opacity = 0
else:
c3d2opacity = easeInQuad(n, 0, 1, int(frames/6)) if (i < r[-1]) else 1
n += 1
if (i % 4 == 0):
display = 'inline' if (display == 'none') else 'none'
yield (
('g-t-loading', 'style', 'display', display),
('overlay', 'attr', 'transform', 'translate(-%.4f, 0)' % (overlaypos)),
('g-logo', 'style', 'opacity', '%.4f' % (logoopacity)),
('c3d2', 'style', 'opacity', '%.4f' % (c3d2opacity)),
)
# (1 sec) c3d2 logo
frames = 2*fps
n = 0
r = range(0, frames)
for i in range(0, frames):
c3d2opacity = easeInQuad(i, 1, -1, frames) if (i < r[-1]) else 0
if (i < r[-int(frames/2)]):
datenknotenopacity = 0
else:
datenknotenopacity = easeInQuad(n, 0, 1, int(frames/2)) if (i < r[-1]) else 1
n += 1
yield(
('c3d2', 'style', 'opacity', '%.4f' % (c3d2opacity)),
('g-datenknoten', 'style', 'opacity', '%.4f' % (datenknotenopacity)),
)
# (1 sec) datenknoten
frames = 1*fps
n = 0
r = range(0, frames)
for i in range(0, frames):
datenknotenopacity = easeInQuad(i, 1, -1, frames) if (i < r[-1]) else 0
if (i < r[-int(frames/2)]):
bysaopacity = 0
else:
bysaopacity = easeInQuad(n, 0, 1, int(frames/2)) if (i < r[-1]) else 1
n += 1
yield(
('g-datenknoten', 'style', 'opacity', '%.4f' % (datenknotenopacity)),
('g-bysa', 'style', 'opacity', '%.4f' % (bysaopacity)),
)
# (2 sec) by sa
frames = 2*fps
n = 0
r = range(0, frames)
for i in range(0, frames):
if (i < r[-int(frames/4)]):
bysaopacity = 1
else:
bysaopacity = easeInQuad(n, 1, -1, int(frames/4)) if (i < r[-1]) else 0
n += 1
yield(
('g-bysa', 'style', 'opacity', '%.4f' % (bysaopacity)),
)
def pauseFrames(args):
# same as background
frames = 24*fps
beep = 0
dir = 1
r = range(0, frames)
for i in r:
yield(
('hb-'+str(beep+1),'style', 'display', 'none'),
('hb-'+str(beep), 'style', 'display', 'inline'),
('hb-'+str(beep-1),'style', 'display', 'none'),
)
if (i % 3 == 0):
# direction
if (beep == 24):
dir = 0
elif (beep == 0) and (i != 3):
dir = 1
# heartbeep
if (dir == 1):
beep += 1
else:
beep -= 1
# cut over lapping frames coz of turnaround
if (i == r[-24]):
break
def debug():
render('intro.svg',
'../intro.ts',
introFrames,
{
'$id': 7776,
'$title': 'StageWar live on stage!',
'$subtitle': 'Metal Konzert - with a long subtitle title that has a tittle which has a long title that is titled until the title breaks the line',
'$persons': 'one girl, another guy and a crowd'
}
)
# 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 event['room'] not in ('Chirurgie (Saal 1.04)', 'Kreißsaal (Saal 1.11)'):
# print("skipping room %s (%s [%s])" % (event['room'], event['title'], event['id']))
# continue
# 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'],
'$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
))