[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.
This commit is contained in:
Jannik Beyerstedt 2023-10-22 20:59:53 +02:00
parent 85bf295be6
commit 909bf79673
8 changed files with 146 additions and 130 deletions

View file

@ -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"]))

View file

@ -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):

View file

@ -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):

View file

@ -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):

View file

@ -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,

View file

@ -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'

View file

@ -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

120
schedulelib.py Normal file
View file

@ -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