389 lines
11 KiB
Python
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
|
|
))
|