diff --git a/hackmas2024/VDS_New.ttf b/hackmas2024/VDS_New.ttf new file mode 100644 index 0000000..eaef6d8 Binary files /dev/null and b/hackmas2024/VDS_New.ttf differ diff --git a/hackmas2024/config.ini b/hackmas2024/config.ini new file mode 100644 index 0000000..47b77cf --- /dev/null +++ b/hackmas2024/config.ini @@ -0,0 +1,39 @@ +[default] +schedule = https://sessions.hack-mas.at/api/0/xml/schedule +template = 290824_Hackmas_intro_video_v3.mp4 +alpha = false +prores = false +fontfile = true +inout = t + +[title] +in = 13 +out = 21 +fontfamily = +fontfile = VDS_New.ttf +fontsize = 75 +fontcolor = #ffffff +x = 1100 +y = 550 + +[speaker] +in = 2 +out = 9 +fontfamily = +fontfile = VDS_New.ttf +fontsize = 64 +fontcolor = #ffffff +x = 250 +y = 1080 + + +[text] +in = 0 +out = 0 +fontfamily = +fontfile = VDS_New.ttf +fontsize = 0 +fontcolor = #ffffff +x = 0 +y = 0 +text = '' diff --git a/hackmas2024/hackmas2024-intro-slate.png b/hackmas2024/hackmas2024-intro-slate.png new file mode 100644 index 0000000..ca9f9c8 Binary files /dev/null and b/hackmas2024/hackmas2024-intro-slate.png differ diff --git a/hackmas2024/hackmas2024-outro-slate.png b/hackmas2024/hackmas2024-outro-slate.png new file mode 100644 index 0000000..24dbc4a Binary files /dev/null and b/hackmas2024/hackmas2024-outro-slate.png differ diff --git a/hackmas2024/readme.md b/hackmas2024/readme.md new file mode 100644 index 0000000..fedec53 --- /dev/null +++ b/hackmas2024/readme.md @@ -0,0 +1,8 @@ +# Hackmas 2024 Readme + +Get intro-slate from shared storage (provided by event). + +Get outro.ts from shared storage or generate from still images by running: +```sh +ffmpeg -loop 1 -i hackmas2024-outro-slate.png -f lavfi -i anullsrc -c:v mpeg2video -t 10 -aspect 16:9 -c:a mp2 -b:v 15000k -map 0:v -map 1:a outro.ts +``` diff --git a/make-ffmpeg.py b/make-ffmpeg.py index fe4b745..727ff6b 100755 --- a/make-ffmpeg.py +++ b/make-ffmpeg.py @@ -228,7 +228,9 @@ def enqueue_job(event): t = fit_title(event_title, int(title_fontsize), int(title_x)) t = t.replace(':', "\:") # the ffmpeg command needs colons to be escaped + t = t.replace('\'', "’") # the ffmpeg command needs ' to be escaped s = fit_speaker(event_personnames, int(speaker_fontsize), int(speaker_x)) + s = s.replace('\'', "’") # the ffmpeg command needs ' to be escaped if args.debug: print('Title: ', t) @@ -244,6 +246,9 @@ def enqueue_job(event): else: ffmpeg_path = 'ffmpeg' + title_bordersize = int(title_fontsize) / 30 + speaker_bordersize = int(speaker_fontsize) / 30 + text_bordersize = int(text_fontsize) / 30 if fontfile == 'true': if platform.system() == 'Windows': videofilter = "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format( @@ -253,12 +258,12 @@ def enqueue_job(event): videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}'".format( text_in, text_out, font_tt_win, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout) else: - videofilter = "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format( - title_in, title_out, font_t, title_fontsize, title_fontcolor, title_x, title_y, t, inout) - videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format( - speaker_in, speaker_out, font_s, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s, inout) - videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}'".format( - text_in, text_out, font_tt, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout) + videofilter = "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:borderw={9}:x={5}:y={6}:text='{7}',".format( + title_in, title_out, font_t, title_fontsize, title_fontcolor, title_x, title_y, t, inout, title_bordersize) + videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:borderw={9}:x={5}:y={6}:text='{7}',".format( + speaker_in, speaker_out, font_s, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s, inout, speaker_bordersize) + videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:borderw={9}:x={5}:y={6}:text='{7}'".format( + text_in, text_out, font_tt, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout, text_bordersize) else: videofilter = "drawtext=enable='between({8},{0},{1})':font='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format( title_in, title_out, title_fontfamily, title_fontsize, title_fontcolor, title_x, title_y, t, inout) diff --git a/schedulelib.py b/schedulelib.py index 340e4d8..76f0fb4 100644 --- a/schedulelib.py +++ b/schedulelib.py @@ -100,6 +100,12 @@ def events(scheduleUrl, titlemap={}): url = event.find('url').text.strip() else: url = '' + + if event.find('track') is not None: + track = event.find('track').text + else: + track = '' + # yield a tupel with the event-id, event-title and person-names yield { 'day': day.get('index'), @@ -109,7 +115,7 @@ def events(scheduleUrl, titlemap={}): 'persons': personnames, 'personnames': ', '.join(personnames), 'room': room.attrib['name'], - 'track': event.find('track').text, + 'track': track, 'url': url }