From d5fe3abc6212b13027d9c57047432d3ead38bd13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20Ils=C3=B8?= Date: Mon, 25 Jul 2016 22:21:54 +0200 Subject: [PATCH 1/2] guadec16: initial commit this adds intro, pause and outro art for the guadec16 conference. --- guadec16/__init__.py | 174 ++++++++ guadec16/artwork/intro.svg | 515 +++++++++++++++++++++ guadec16/artwork/outro.svg | 887 +++++++++++++++++++++++++++++++++++++ guadec16/artwork/pause.svg | 441 ++++++++++++++++++ 4 files changed, 2017 insertions(+) create mode 100644 guadec16/__init__.py create mode 100644 guadec16/artwork/intro.svg create mode 100644 guadec16/artwork/outro.svg create mode 100644 guadec16/artwork/pause.svg diff --git a/guadec16/__init__.py b/guadec16/__init__.py new file mode 100644 index 0000000..805e094 --- /dev/null +++ b/guadec16/__init__.py @@ -0,0 +1,174 @@ +#!/usr/bin/python + +import subprocess +import os.path +from renderlib import * +from easing import * + +# URL to Schedule-XML +scheduleUrl = 'https://static.gnome.org/guadec-2016/schedule.xml' + +# For (really) too long titles +titlemap = { + # +} + +def bounce(i, min, max, frames): + if i == frames - 1: + return 0 + + if i <= frames/2: + return easeInOutQuad(i, min, max, frames/2) + else: + return max - easeInOutQuad(i - frames/2, min, max, frames/2) + +def introFrames(parameters): + firstmove=2100 + move=100 + + + # 0.5 seconds blue + frames = int(fps/2) + for i in range(0, frames): + yield ( + ('fadetoblack', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames-1)), + ('title', 'style', 'opacity', "0"), + ('longtitle', 'style', 'opacity', "0"), + ('presentedby', 'style', 'opacity', "0"), + ('speaker', 'style', 'opacity', "0"), + ('longspeaker', 'style', 'opacity', "0"), + ('overlay', 'style', 'opacity', "0"), + ('guadeclogo', 'style', 'opacity', "0"), + ('onhold', 'style', 'opacity', "0"), + ('onlinediscussion', 'style', 'opacity', "0"), + ) + + # 0.5 seconds background fade in + frames = int(fps/2) + for i in range(0, frames): + yield ( + ('guadeclogo', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames-1)), + ('overlay', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames-1)), + ('overlay', 'attr', 'transform', 'translate(0, %.4f)' % easeOutQuad(i, firstmove, -firstmove, frames-1)), + ) + + # 0.6 seconds still + frames = int(fps/1.75) + for i in range(0, frames): + yield () + + # 0.2 seconds title text fade in + frames = int(fps/5) + for i in range(0, frames): + yield ( + ('title', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames-1)), + ('longtitle', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames-1)), + ('titletranslator', 'attr', 'transform', 'translate(0, %.4f)' % easeOutQuad(i, -move, move, frames-1)), + ) + + # 0.2 seconds presented by text fade in + frames = int(fps/5) + for i in range(0, frames): + yield ( + ('presentedby', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames-1)), + ('presentedby', 'attr', 'transform', 'translate(0, %.4f)' % easeOutQuad(i, -move, move, frames-1)), + ) + # 0.2 seconds speaker/onhold text fade in + frames = int(fps/5) + for i in range(0, frames): + yield ( + ('speaker', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames-1)), + ('longspeaker', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames-1)), + ('speakertranslator', 'attr', 'transform', 'translate(0, %.4f)' % easeOutQuad(i, -move, move, frames-1)), + ('onhold', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames-1)), + ('onhold', 'attr', 'transform', 'translate(0, %.4f)' % easeOutQuad(i, -move, move, frames-1)), + ('onlinediscussion', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames-1)), + ) + + # 4 seconds still + frames = 4*fps + for i in range(0, frames): + yield ( + ('title', 'style', 'opacity', "1"), + ('longtitle', 'style', 'opacity', "1"), + ('presentedby', 'style', 'opacity', "1"), + ('onhold', 'style', 'opacity', "1"), + ('speaker', 'style', 'opacity', "1"), + ('longspeaker', 'style', 'opacity', "1"), + ) + +def outroFrames(p): + # 7 seconds of slow scaling, fade to black at the end + frames = 7*fps + for i in range(0, frames): + scale = easeLinear(i, 1.3, 0.3 , frames-1) + opacity = 0 + if i > int(frames*0.7): + opacity = easeLinear(int(i-frames*0.7), 0, 1, int(frames-frames*0.7)-1) + yield ( + ('guadeclogoscale', 'attr', 'transform', 'scale({scale},{scale})'.format(scale=scale),), + ('fadetoblack', 'style', 'opacity', '{opac}'.format(opac=opacity),), + ) + + # 2 seconds of black + frames = 2*fps + for i in range(0, frames): + yield ( + ('fadetoblack', 'style', 'opacity', "1"), + ) + + +def debug(): + render( + 'intro.svg', + '../intro.ts', + introFrames, + { + '$title': "Long Long Long title is LONG", + '$sub': 'Long Long Long Long subtitle is LONGER', + '$speaker': 'Long Name of Dr. Dr. Prof. Dr. Long Long' + } + ) + + render( + 'pause.svg', + '../pause.ts', + introFrames, + ) + + render( + 'outro.svg', + '../outro.ts', + outroFrames + ) + +def tasks(queue, args): + # iterate over all events extracted from the schedule xml-export + for event in events(scheduleUrl): + + if len(args) > 0: + if not str(event['id']) in args: + continue + + if len(event['title']) < 71: + params = { + '$title': event['title'], + '$longtitle': '', + '$speaker': '', + '$longspeaker': event['personnames'] + } + else: + params = { + '$title': '', + '$longtitle': event['title'], + '$speaker': '', + '$longspeaker': event['personnames'] + } + + # generate a task description and put it into the queue + queue.put(Rendertask( + infile = 'intro.svg', + outfile = str(event['id'])+".ts", + sequence = introFrames, + parameters = params + )) diff --git a/guadec16/artwork/intro.svg b/guadec16/artwork/intro.svg new file mode 100644 index 0000000..2442d57 --- /dev/null +++ b/guadec16/artwork/intro.svg @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + $speaker $longspeaker + + PRESENTED BY + + + $title $longtitle + + + diff --git a/guadec16/artwork/outro.svg b/guadec16/artwork/outro.svg new file mode 100644 index 0000000..7a6ecb7 --- /dev/null +++ b/guadec16/artwork/outro.svg @@ -0,0 +1,887 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + The + Conference + + + + + + + + + + + + + + + + + + + TM + + + + + + + + Karlsruhe August 15th - 17th, 2016 + + + + + + + + + + + + + + + + + + + + + + + + + + + + VERSION 4.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The + Conference + + + + + + + + + + + + + + + + + + + TM + + + + + + + + Karlsruhe August 15th - 17th, 2016 + + + diff --git a/guadec16/artwork/pause.svg b/guadec16/artwork/pause.svg new file mode 100644 index 0000000..ffc8d60 --- /dev/null +++ b/guadec16/artwork/pause.svg @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + Join the online discussion on social media with #GUADEC2016. + + + On Hold. + + + From 046ce1cfa38e52b42141e8fd11f3e1e675664489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20Ils=C3=B8?= Date: Wed, 10 Aug 2016 13:41:37 +0200 Subject: [PATCH 2/2] guadec16: add streaming overlay --- guadec16/artwork/overlays/s1_hd.png | Bin 0 -> 21406 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 guadec16/artwork/overlays/s1_hd.png diff --git a/guadec16/artwork/overlays/s1_hd.png b/guadec16/artwork/overlays/s1_hd.png new file mode 100644 index 0000000000000000000000000000000000000000..58fd8b9bfaa2241a48828175f7a1f7dc2b7c1859 GIT binary patch literal 21406 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 b1S-#@(D6>nZ&hUFfUiI@N>h literal 0 HcmV?d00001