intro-outro-generator/nixcon2015/__init__.py
2024-02-07 20:09:24 +01:00

139 lines
3.6 KiB
Python

#!/usr/bin/python3
from renderlib import *
from schedulelib import *
from easing import *
import math
# URL to Schedule-XML
scheduleUrl = 'https://n621.de/fud/nixcon.xml'
# For (really) too long titles
titlemap = {
#708: "Neue WEB-Anwendungen des LGRB Baden-Württemberg im Überblick"
}
def introFrames(params):
move=40
# wait
frames = 1*fps
for i in range(0, frames):
yield (
)
deltas = {}
for segment in range(1, 7):
angle = 60 * (segment - 1)
dist = 1000
dx = -dist * math.cos(math.radians(angle))
dy = -dist * math.sin(math.radians(angle))
deltas[segment] = (dx, dy)
# fly out
frames = int(1.5*fps)
for i in range(0, frames):
placements = []
for segment in range(1, 7):
x = easeInCubic(i, 0, deltas[segment][0], frames)
y = easeInCubic(i, 0, deltas[segment][1], frames)
opacity = 1 - easeInCubic(i, 0, 1, int(0.8*frames))
placements.extend([
('segment%u' % segment, 'attr', 'transform', 'translate(%.4f, %.4f)' % (x, y)),
('segment%u' % segment, 'style', 'opacity', '%.4f' % opacity)
])
logotext_dx = easeInCubic(i, 0, 2000, frames)
logotext_opacity = 1 - easeInCubic(i, 0, 1, 20)
placements.extend([
('logotext', 'attr', 'transform', 'translate(%.4f, 0)' % logotext_dx),
('logotext', 'style', 'opacity', '%.4f' % logotext_opacity),
])
if i > int(frames/2):
sub_frames = frames - int(frames/2)
sub_i = i - int(frames/2)
talk_opacity = easeInCubic(sub_i, 0, 1, sub_frames)
placements.extend([
('title', 'style', 'opacity', '%.4f' % talk_opacity),
('person', 'style', 'opacity', '%.4f' % talk_opacity),
])
yield placements
# wait
frames = int(2.5*fps)
for i in range(0, frames):
yield (
('title', 'style', 'opacity', '%.4f' % 1),
('person', 'style', 'opacity', '%.4f' % 1),
)
def outroFrames(params):
frames = 2*fps
for i in range(0, frames):
yield (
('layer1', 'style', 'opacity', '%.4f' % 1),
)
frames = int(0.5*fps)
for i in range(0, frames):
opacity = 1 - easeInCubic(i, 0, 1, frames)
yield (
('layer1', 'style', 'opacity', '%.4f' % opacity),
)
frames = int(0.2 * fps)
for i in range(0, frames):
yield (
('layer1', 'style', 'opacity', '%.4f' % 0),
)
def debug():
render(
'outro.svg',
'../outro.dv',
outroFrames
)
render(
'intro.svg',
'../intro.dv',
introFrames,
{
'$id': 904,
'$title': 'The sorry state of Python packaging and how it reflects in Nix',
'$personnames': 'Domen Kožar'
}
)
def tasks(queue, params):
# iterate over all events extracted from the schedule xml-export
for event in events(scheduleUrl, titlemap):
# generate a task description and put them into the queue
queue.put(Rendertask(
infile = 'intro.svg',
outfile = str(event['id'])+".dv",
sequence = introFrames,
parameters = {
'$id': event['id'],
'$title': event['title'],
'$subtitle': event['subtitle'],
'$personnames': event['personnames']
}
))
# place a task for the outro into the queue
queue.put(Rendertask(
infile = 'outro.svg',
outfile = 'outro.dv',
sequence = outroFrames
))