From 909bf79673557015781ff2355bb13cb310e7b9ec Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sun, 22 Oct 2023 20:59:53 +0200 Subject: [PATCH] [TIDY] Refactor renderlib into two parts Most of the make scripts only need the schedule part of the renderlib. The schedule part has way less dependencies (e.g. no ImageMagick), so those scripts can be used without them now. --- archconf2020/__init__.py | 2 +- make-adobe-after-effects.py | 4 +- make-apple-motion.py | 4 +- make-blender.py | 4 +- make-ffmpeg-fade.py | 32 +++++----- make-ffmpeg.py | 6 +- renderlib.py | 104 ------------------------------- schedulelib.py | 120 ++++++++++++++++++++++++++++++++++++ 8 files changed, 146 insertions(+), 130 deletions(-) create mode 100644 schedulelib.py 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 +