diff --git a/archconf2020/__init__.py b/archconf2020/__init__.py index 4690ed7..1d08f63 100644 --- a/archconf2020/__init__.py +++ b/archconf2020/__init__.py @@ -320,7 +320,7 @@ def debug(): def tasks(queue, args, idlist, skiplist): # iterate over all events extracted from the schedule xml-export - for event in renderlib.events(scheduleUrl): + for event in schedulelib.events(scheduleUrl): if not (idlist == []): if 000000 in idlist: print("skipping id (%s [%s])" % (event["title"], event["id"])) diff --git a/make-adobe-after-effects.py b/make-adobe-after-effects.py index abb9434..8e431e5 100755 --- a/make-adobe-after-effects.py +++ b/make-adobe-after-effects.py @@ -2,7 +2,7 @@ # vim: tabstop=4 shiftwidth=4 expandtab import subprocess -import renderlib +import schedulelib import argparse import tempfile import shlex @@ -139,7 +139,7 @@ elif args.bgloop: }] else: - events = list(renderlib.events(args.schedule)) + events = list(schedulelib.events(args.schedule)) def describe_event(event): diff --git a/make-apple-motion.py b/make-apple-motion.py index 3b91046..73899d9 100755 --- a/make-apple-motion.py +++ b/make-apple-motion.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # vim: tabstop=4 shiftwidth=4 expandtab -import renderlib +import schedulelib import argparse import tempfile import shutil @@ -91,7 +91,7 @@ if args.develop: }] else: - events = list(renderlib.events(args.schedule)) + events = list(schedulelib.events(args.schedule)) def describe_event(event): diff --git a/make-blender.py b/make-blender.py index e9d11a8..80908b8 100644 --- a/make-blender.py +++ b/make-blender.py @@ -7,7 +7,7 @@ The blender project must be configured to use mkv/matroska as output file format """ import subprocess -import renderlib +import schedulelib import argparse import tempfile import shlex @@ -147,7 +147,7 @@ elif args.bgloop: }] else: - events = list(renderlib.events(args.schedule)) + events = list(schedulelib.events(args.schedule)) def describe_event(event): diff --git a/make-ffmpeg-fade.py b/make-ffmpeg-fade.py index fe86164..0fc8233 100755 --- a/make-ffmpeg-fade.py +++ b/make-ffmpeg-fade.py @@ -143,7 +143,7 @@ if args.debug: }] else: - events = list(renderlib.events(schedule)) + events = list(schedulelib.events(schedule)) def describe_event(event): return "#{}: {}".format(event['id'], event['title']) @@ -231,11 +231,11 @@ def enqueue_job(event): outfile = os.path.join(os.path.dirname(args.project), event_id + '.ts') videofilter = "drawtext=fontfile={fontfile}:fontsize={fontsize}:fontcolor={fontcolor}:x={x}:y={y}:text='{text}':".format( - fontfile = font_t, - fontsize = title_fontsize, - fontcolor = title_fontcolor, - x = title_x, - y = title_y, + fontfile = font_t, + fontsize = title_fontsize, + fontcolor = title_fontcolor, + x = title_x, + y = title_y, text = t) videofilter += "alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))',".format( fade_in_start_time = title_in, @@ -245,11 +245,11 @@ def enqueue_job(event): fade_duration = fade_duration ) videofilter += "drawtext=fontfile={fontfile}:fontsize={fontsize}:fontcolor={fontcolor}:x={x}:y={y}:text='{text}':".format( - fontfile = font_s, - fontsize = speaker_fontsize, - fontcolor = speaker_fontcolor, - x = speaker_x, - y = speaker_y, + fontfile = font_s, + fontsize = speaker_fontsize, + fontcolor = speaker_fontcolor, + x = speaker_x, + y = speaker_y, text = s) videofilter += "alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))',".format( fade_in_start_time = speaker_in, @@ -259,11 +259,11 @@ def enqueue_job(event): fade_duration = fade_duration ) videofilter += "drawtext=fontfile={fontfile}:fontsize={fontsize}:fontcolor={fontcolor}:x={x}:y={y}:text={text}:".format( - fontfile = font_tt, - fontsize = text_fontsize, - fontcolor = text_fontcolor, - x = text_x, - y = text_y, + fontfile = font_tt, + fontsize = text_fontsize, + fontcolor = text_fontcolor, + x = text_x, + y = text_y, text = text_text) videofilter += "alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))'".format( fade_in_start_time = text_in, diff --git a/make-ffmpeg.py b/make-ffmpeg.py index 89f12ce..9fb7bc1 100755 --- a/make-ffmpeg.py +++ b/make-ffmpeg.py @@ -4,7 +4,7 @@ import os import sys import subprocess -import renderlib +import schedulelib import argparse import shlex from PIL import ImageFont @@ -146,7 +146,7 @@ if args.debug: }] else: - events = list(renderlib.events(schedule)) + events = list(schedulelib.events(schedule)) def describe_event(event): return "#{}: {}".format(event['id'], event['title']) @@ -238,7 +238,7 @@ def enqueue_job(event): ffmpeg_path = './ffmpeg.exe' font_t_win = "/".join(font_t.split("\\")) font_s_win = "/".join(font_s.split("\\")) - font_tt_win = "/".join(font_tt.split("\\")) + font_tt_win = "/".join(font_tt.split("\\")) else: ffmpeg_path = 'ffmpeg' diff --git a/renderlib.py b/renderlib.py index b84ef75..37f1dae 100644 --- a/renderlib.py +++ b/renderlib.py @@ -235,110 +235,6 @@ def rendertask(task): # remove the generated svg ensureFilesRemoved(os.path.join(task.workdir, '.gen.svg')) -# Download the Events-Schedule and parse all Events out of it. Yield a tupel for each Event -def downloadSchedule(scheduleUrl): - print("downloading schedule") - - # download the schedule - response = urlopen(scheduleUrl) - - # read xml-source - xml = response.read() - - # parse into ElementTree - parser = etree.XMLParser(huge_tree=True) - return etree.fromstring(xml, parser) - -def getSchedule(scheduleUrl): - global scheduleTree - if not scheduleTree: - scheduleTree=downloadSchedule(scheduleUrl) - return scheduleTree - - -def persons(scheduleUrl, personmap={}, taglinemap={}, forEventId=None): - schedule = getSchedule(scheduleUrl) - # iterate all days - for day in schedule.iter('day'): - # iterate all rooms - for room in day.iter('room'): - # iterate events on that day in this room - for event in room.iter('event'): - eventid = int(event.get("id")) - if event != None and not eventid == forEventId: - continue - # aggregate names of the persons holding this talk - persons_seen = [] - if event.find('persons') is not None: - for person in event.find('persons').iter('person'): - id = int(person.get("id")) - person = re.sub(r'\s+', ' ', person.text).strip() - match = re.search(r'\((.*?)\)', person) - tagline = '' - if not match is None: - tagline = match.group(1) - person = person.split(" (")[0] - if id in taglinemap: - tagline = taglinemap[id] - if id in personmap: - person = personmap[id] - if not id in persons_seen: - persons_seen.append(id) - yield { - 'id': id, - 'person': person, - 'tagline': tagline - } - -def events(scheduleUrl, titlemap={}): - schedule = getSchedule(scheduleUrl) - # iterate all days - for day in schedule.iter('day'): - # iterate all rooms - for room in day.iter('room'): - # iterate events on that day in this room - for event in room.iter('event'): - # aggregate names of the persons holding this talk - personnames = [] - if event.find('persons') is not None: - for person in event.find('persons').iter('person'): - try: - personname = re.sub(r'\s+', ' ', person.text).strip() - except: - personnames.append(str('None')) - personnames.append(personname) - - id = int(event.get('id')) - - if id in titlemap: - title = titlemap[id] - elif event.find('title') is not None and event.find('title').text is not None: - title = re.sub(r'\s+', ' ', event.find('title').text).strip() - else: - title = '' - - if event.find('subtitle') is not None and event.find('subtitle').text is not None: - subtitle = re.sub(r'\s+', ' ', event.find('subtitle').text).strip() - else: - subtitle = '' - - if event.find('url') is not None and event.find('url').text is not None: - url = event.find('url').text.strip() - else: - url = '' - # yield a tupel with the event-id, event-title and person-names - yield { - 'day': day.get('index'), - 'id': id, - 'title': title, - 'subtitle': subtitle, - 'persons': personnames, - 'personnames': ', '.join(personnames), - 'room': room.attrib['name'], - 'track': event.find('track').text, - 'url': url - } - try: from termcolor import colored diff --git a/schedulelib.py b/schedulelib.py new file mode 100644 index 0000000..3fabdf4 --- /dev/null +++ b/schedulelib.py @@ -0,0 +1,120 @@ +# vim: tabstop=4 shiftwidth=4 expandtab + +import re +from lxml import etree +from urllib.request import urlopen + +scheduleTree=None + + +# Download the Events-Schedule and parse all Events out of it. Yield a tupel for each Event +def downloadSchedule(scheduleUrl): + print("downloading schedule") + + # download the schedule + response = urlopen(scheduleUrl) + + # read xml-source + xml = response.read() + + # parse into ElementTree + parser = etree.XMLParser(huge_tree=True) + return etree.fromstring(xml, parser) + +def getSchedule(scheduleUrl): + global scheduleTree + if not scheduleTree: + scheduleTree=downloadSchedule(scheduleUrl) + return scheduleTree + + +def persons(scheduleUrl, personmap={}, taglinemap={}, forEventId=None): + schedule = getSchedule(scheduleUrl) + # iterate all days + for day in schedule.iter('day'): + # iterate all rooms + for room in day.iter('room'): + # iterate events on that day in this room + for event in room.iter('event'): + eventid = int(event.get("id")) + if event != None and not eventid == forEventId: + continue + # aggregate names of the persons holding this talk + persons_seen = [] + if event.find('persons') is not None: + for person in event.find('persons').iter('person'): + id = int(person.get("id")) + person = re.sub(r'\s+', ' ', person.text).strip() + match = re.search(r'\((.*?)\)', person) + tagline = '' + if not match is None: + tagline = match.group(1) + person = person.split(" (")[0] + if id in taglinemap: + tagline = taglinemap[id] + if id in personmap: + person = personmap[id] + if not id in persons_seen: + persons_seen.append(id) + yield { + 'id': id, + 'person': person, + 'tagline': tagline + } + +def events(scheduleUrl, titlemap={}): + schedule = getSchedule(scheduleUrl) + # iterate all days + for day in schedule.iter('day'): + # iterate all rooms + for room in day.iter('room'): + # iterate events on that day in this room + for event in room.iter('event'): + # aggregate names of the persons holding this talk + personnames = [] + if event.find('persons') is not None: + for person in event.find('persons').iter('person'): + try: + personname = re.sub(r'\s+', ' ', person.text).strip() + except: + personnames.append(str('None')) + personnames.append(personname) + + id = int(event.get('id')) + + if id in titlemap: + title = titlemap[id] + elif event.find('title') is not None and event.find('title').text is not None: + title = re.sub(r'\s+', ' ', event.find('title').text).strip() + else: + title = '' + + if event.find('subtitle') is not None and event.find('subtitle').text is not None: + subtitle = re.sub(r'\s+', ' ', event.find('subtitle').text).strip() + else: + subtitle = '' + + if event.find('url') is not None and event.find('url').text is not None: + url = event.find('url').text.strip() + else: + url = '' + # yield a tupel with the event-id, event-title and person-names + yield { + 'day': day.get('index'), + 'id': id, + 'title': title, + 'subtitle': subtitle, + 'persons': personnames, + 'personnames': ', '.join(personnames), + 'room': room.attrib['name'], + 'track': event.find('track').text, + 'url': url + } + + +try: + from termcolor import colored +except ImportError: + def colored(str, col): + return str +