From 96f410ba6a4b5d33938e44f851d97cd58b345214 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 18 Mar 2024 14:19:08 +0100 Subject: [PATCH 01/26] make-ffmpeg-fade: fix missing import --- make-ffmpeg-fade.py | 1 + 1 file changed, 1 insertion(+) diff --git a/make-ffmpeg-fade.py b/make-ffmpeg-fade.py index f4e88a3..7339a9d 100755 --- a/make-ffmpeg-fade.py +++ b/make-ffmpeg-fade.py @@ -5,6 +5,7 @@ import os import sys import subprocess import renderlib +import schedulelib import argparse import shlex from PIL import ImageFont From ec29473d53a808d78a56bbbf299200bebf93d4c5 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 18 Mar 2024 14:19:36 +0100 Subject: [PATCH 02/26] make-ffmpeg-fade: use better algorythm for determining lines --- make-ffmpeg-fade.py | 101 +++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 52 deletions(-) diff --git a/make-ffmpeg-fade.py b/make-ffmpeg-fade.py index 7339a9d..976c858 100755 --- a/make-ffmpeg-fade.py +++ b/make-ffmpeg-fade.py @@ -174,21 +174,28 @@ def run(command, **kwargs): def fit_text(string: str, frame_width): split_line = [x.strip() for x in string.split()] - lines = "" + lines = [] w = 0 line_num = 0 - line = "" + line = [] for word in split_line: - w, _ = translation_font.getsize(" ".join([line, word])) - print("{}, {}".format(w, line)) - if w > (frame_width): - print("too wide, breaking") - lines += line.strip() + "\n" - line = "" + new_line = line + [word.rstrip(':')] + w, _ = translation_font.getsize(" ".join(new_line)) + print(w, new_line) + if w > frame_width: + print("too wide, breaking", line) + lines.append(' '.join(line)) + line = [] - line += word + " " + line.append(word.rstrip(':')) - lines += line.strip() + if word.endswith(':'): + print(':, breaking', line) + lines.append(' '.join(line)) + line = [] + + if line: + lines.append(' '.join(line)) return lines @@ -233,48 +240,38 @@ 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, - 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, - fade_in_end_time=title_in + fade_duration, - fade_out_start_time=title_in + fade_duration + title_duration, - fade_out_end_time=title_in + fade_duration + title_duration + fade_duration, - 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, - 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, - fade_in_end_time=speaker_in + fade_duration, - fade_out_start_time=speaker_in + fade_duration + speaker_duration, - fade_out_end_time=speaker_in + fade_duration + speaker_duration + fade_duration, - 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, - 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, - fade_in_end_time=text_in + fade_duration, - fade_out_start_time=text_in + fade_duration + text_duration, - fade_out_end_time=text_in + fade_duration + text_duration + fade_duration, - fade_duration=fade_duration - ) + videofilter = "" + for idx, line in enumerate(t): + 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 + (idx * title_fontsize), + text=line) + 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, + fade_in_end_time=title_in + fade_duration, + fade_out_start_time=title_in + fade_duration + title_duration, + fade_out_end_time=title_in + fade_duration + title_duration + fade_duration, + fade_duration=fade_duration + ) + + for idx, line in enumerate(s): + 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 + (idx * speaker_fontsize), + text=line) + 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, + fade_in_end_time=speaker_in + fade_duration, + fade_out_start_time=speaker_in + fade_duration + speaker_duration, + fade_out_end_time=speaker_in + fade_duration + speaker_duration + fade_duration, + fade_duration=fade_duration + ) if fileformat == '.mov': if alpha == 'true': From 1f8d859bbcd46ffdb09183e3867f84525d61d0ae Mon Sep 17 00:00:00 2001 From: "Janik H." Date: Tue, 2 Apr 2024 01:53:17 +0200 Subject: [PATCH 03/26] init: glt24 --- glt24/__init__.py | 108 ++++++ glt24/artwork/intro.svg | 458 ++++++++++++++++++++++++++ glt24/artwork/outro.svg | 714 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1280 insertions(+) create mode 100644 glt24/__init__.py create mode 100644 glt24/artwork/intro.svg create mode 100644 glt24/artwork/outro.svg diff --git a/glt24/__init__.py b/glt24/__init__.py new file mode 100644 index 0000000..d263276 --- /dev/null +++ b/glt24/__init__.py @@ -0,0 +1,108 @@ +#!/usr/bin/python3 + +from renderlib import * +from schedulelib import * +from easing import * + +# URL to Schedule-XML +scheduleUrl = 'https://pretalx.linuxtage.at/glt24/schedule.xml' + +def introFrames(args): +#fade in tux and set other opacities to 0 + frames = 1*fps + for i in range(0, frames): + yield ( + ('tux', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)), + ('title', 'style', 'opacity', 0), + ('persons', 'style', 'opacity', 0), + ) + +#fade in title and persons + frames = 2*fps + for i in range(0, frames): + yield( + ('title', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), + ('persons', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), + ) + +#show whole image for 5 seconds + frames = 5*fps + for i in range(0, frames): + yield( + ('title', 'style', 'opacity', 1), + ('persons', 'style', 'opacity', 1), + ) + + + +def outroFrames(args): +#fadein outro graphics + frames = 3*fps + for i in range(0, frames): + yield( + ('tux', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)), + ('cctext', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)), + ('logo', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)), + ) + frames = 3*fps + for i in range(0, frames): + yield( + ('tux', 'style', 'opacity', 1), + ('cctext', 'style', 'opacity', 1), + ('logo', 'style', 'opacity', 1), + ) + + +def debug(): + render( + 'intro.svg', + '../intro.ts', + introFrames, + { + '$title': "Long Long Long title is LONG", + '$speaker': 'Long Name of Dr. Dr. Prof. Dr. Long Long' + } + ) + + render('outro.svg', + '../outro.ts', + outroFrames + ) + + +def tasks(queue, args, idlist, skiplist): + # iterate over all events extracted from the schedule xml-export + for event in events(scheduleUrl): + if event['room'] not in ('HS i1', 'HS i2', 'HS i7'): + print("skipping room %s (%s)" % (event['room'], event['title'])) + continue + if event['day'] not in ('2'): + print("skipping day %s" % (event['day'])) + continue + if not (idlist==[]): + if 000000 in idlist: + print("skipping id (%s [%s])" % (event['title'], event['id'])) + continue + if int(event['id']) not in idlist: + print("skipping id (%s [%s])" % (event['title'], event['id'])) + continue + + # generate a task description and put it into the queue + queue.put(Rendertask( + infile = 'intro.svg', + outfile = str(event['id'])+".ts", + sequence = introFrames, + parameters = { + '$title': event['title'], + '$persons': event['personnames'] + } + )) + + # place a task for the outro into the queue + if not "out" in skiplist: + queue.put(Rendertask( + infile = 'outro.svg', + outfile = 'outro.ts', + sequence = outroFrames + )) + diff --git a/glt24/artwork/intro.svg b/glt24/artwork/intro.svg new file mode 100644 index 0000000..219698c --- /dev/null +++ b/glt24/artwork/intro.svg @@ -0,0 +1,458 @@ + + + + + Intro GLT Talk 2 + + + + + + + + + + + + + + + + + + image/svg+xml + + Intro GLT Talk 2 + + + + meisterluk + + + 2 + de + + + CC-BY AT 4.0 + + + + + + + + + + + + + + + + + + + + + + + + + Grazer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $title + $persons + '24 + + diff --git a/glt24/artwork/outro.svg b/glt24/artwork/outro.svg new file mode 100644 index 0000000..f6a6557 --- /dev/null +++ b/glt24/artwork/outro.svg @@ -0,0 +1,714 @@ + + + + + Intro GLT Talk $id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Intro GLT Talk $id + + + + meisterluk + + + $id + $language + + + CC-BY AT 4.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content released under CC-BY AT 3.0 + + + From 58bc29249e54bc3e376d83decb6107efe6708fe4 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Thu, 4 Apr 2024 10:31:05 +0200 Subject: [PATCH 04/26] glt24: make inkscape rendering usable again --- glt24/__init__.py | 16 ++++++++-------- glt24/artwork/intro.svg | 6 +++--- make.py | 4 +++- renderlib.py | 15 +++++++++------ 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/glt24/__init__.py b/glt24/__init__.py index d263276..027fc82 100644 --- a/glt24/__init__.py +++ b/glt24/__init__.py @@ -21,8 +21,8 @@ def introFrames(args): frames = 2*fps for i in range(0, frames): yield( - ('title', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), - ('persons', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), + ('title', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)), + ('persons', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)), ) #show whole image for 5 seconds @@ -59,15 +59,15 @@ def debug(): '../intro.ts', introFrames, { - '$title': "Long Long Long title is LONG", - '$speaker': 'Long Name of Dr. Dr. Prof. Dr. Long Long' + '$title': " Fully declarative Homelab on NixOS ❄️", + '$persons': 'Long Name of Dr. Dr. Prof. Dr. Long Long' } ) - render('outro.svg', - '../outro.ts', - outroFrames - ) + #render('outro.svg', + # '../outro.ts', + # outroFrames + #) def tasks(queue, args, idlist, skiplist): diff --git a/glt24/artwork/intro.svg b/glt24/artwork/intro.svg index 219698c..7a4b2cf 100644 --- a/glt24/artwork/intro.svg +++ b/glt24/artwork/intro.svg @@ -431,10 +431,10 @@ id="tspan5627" x="941.19" y="594.2323" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle">$title + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;opacity:0.5">$title $persons + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;opacity:1">$persons Date: Thu, 4 Apr 2024 11:07:50 +0200 Subject: [PATCH 05/26] glt24: switch to cached xml --- glt24/__init__.py | 3 +- glt24/schedule__2024-03-25_16-57-04.xml | 1618 +++++++++++++++++++++++ 2 files changed, 1620 insertions(+), 1 deletion(-) create mode 100644 glt24/schedule__2024-03-25_16-57-04.xml diff --git a/glt24/__init__.py b/glt24/__init__.py index 027fc82..ba2bf47 100644 --- a/glt24/__init__.py +++ b/glt24/__init__.py @@ -5,7 +5,8 @@ from schedulelib import * from easing import * # URL to Schedule-XML -scheduleUrl = 'https://pretalx.linuxtage.at/glt24/schedule.xml' +#scheduleUrl = 'https://pretalx.linuxtage.at/glt24/schedule.xml' +scheduleUrl = 'file:/home/sophie/coding/voc/intro-outro-generator/glt24/schedule__2024-03-25_16-57-04.xml' def introFrames(args): #fade in tux and set other opacities to 0 diff --git a/glt24/schedule__2024-03-25_16-57-04.xml b/glt24/schedule__2024-03-25_16-57-04.xml new file mode 100644 index 0000000..f9e4388 --- /dev/null +++ b/glt24/schedule__2024-03-25_16-57-04.xml @@ -0,0 +1,1618 @@ + + + + 1.0 + + glt24 + Grazer Linuxtage 2024 + 2024-04-05 + 2024-04-06 + 2 + 00:05 + https://pretalx.linuxtage.at/glt24/schedule/ + Europe/Vienna + + + + + 2024-04-05T13:00:00+02:00 + 13:00 + 03:40 + HS i4 + glt24-410-musikproduktion-mit-freier-software + https://pretalx.linuxtage.at/glt24/talk/NGXNXR/ + + + true + + Musikproduktion mit freier Software + + Anwendung + Workshop (3,5h) + de + Ich bin (u.a.) Hobby-Musiker und arbeite gerade an zwei Alben, +welche ich ausschließlich mit freier Software produziere. +Die Musikrichtung liegt abgesehen von einer instrumentalen Synth-Nummer irgendwo zwischen "Rock-Ballade" und "Metal". +In diesem Workshop möchte ich meinen Prozess von der Entstehung der Songs bis hin zum fertigen Mix durchgehen. + Für den diesjährigen Workshop habe ich mir vorgenommen, daß ich zusammen mit meiner Bandsängerin einen Cover von einem Dio-Klassiker produzieren werde. Welchen genau, verrate ich jedoch noch nicht. :-) +Der Fokus in diesem Jahr wird auf Aufnahme und Schnitt von Gesang bzw. Gitarre und dem Mix liegen. +Die Drums und der Bass-Track wird schon vorbereitet sein, damit wir auch gleich mit dem Aufnehmen loslegen koennen. + +Themengebiete: +1. Ardour + * Ardour Projekt einrichten (Tracks, Groups, Busse, Connection Matrix) +2. Recording + * Hardware: Mikrofone, Audio-Devices, Kabel/Adapter + * Gitarre: direkt oder via Verstärker und Mikrofon(e)? + * GIRATS ;-) + * Schnitt und Timing-Korrekturen +3. Guitarix + * Übersicht der Guitarix-Plugins + * Von der "direct in" Aufnahme zu einem g'scheiten Gitarrensound +4. Mixing (in Ardour) + * Basic Mix: nur Gain, Fader und Pan, aber noch keine Plugins (Ausnahme: Guitarix) + * Advanced Mix: Standard Plugins von LSP (EQ, Compressor, Gate, etc.) + * Visualisierungs-Plugins + * Effekt-Plugins und andere Tricks + * Automatisierung + +Wer kann mitmachen? +Jeder, der unter Linux Musik macht oder machen möchte, aber sich bis jetzt vielleicht gescheut hat, alles bis zum Schluß durchzuziehen. + + +Ergebnis vom Vorjahr: +https://coldwhisper-graz.bandcamp.com/track/diamonds-and-rust-cover + +Ardour Stammtisch Graz: +https://lists.mur.at/mailman/listinfo/ardour-stammtisch-graz + + + Bernhard "Slash" TrummerKatharina Heczendorfer + + + + + + 2024-04-05T17:00:00+02:00 + 17:00 + 02:50 + HS i4 + glt24-452-cloud-native-workshop-from-the-source-code-to-the-deployment-of-a-cloud-service + https://pretalx.linuxtage.at/glt24/talk/VWBVLQ/ + + + true + + Cloud Native Workshop - From the source code to the deployment of a cloud service + + Admin + Workshop (2,8h) + de + Are you a cloud native developer? + +Was bedeutet es, ein "cloud nativer" Entwickler zu sein, wie sieht ein entsprechender Workflow dazu aus, welche Tools kommen zum Einsatz? Wie spielen Konzepte und Tools von GitHub, Hashicorp und Microsoft zusammen? +Die Fragen dazu möchten wir mit euch mittels einer Hands-On Session beantworten. + +Lasst uns gemeinsam mit Hilfe von 'Visual Studio Code' und 'GitHub Codespaces' Cloud Ressourcen mittels 'Infrastructure as Code' definieren und deployen. Zudem werden wir auch zusammen Befehle für das Command Line Interface zu Kubernetes Clustern ausführen. + +Der volle Inhalt: +* Erstellung deines eigenens GitHub Codespaces +* Installieren der Extension für GitHub Codespaces für Visual Studio Code +* Definieren einer Azure ressource mittels einer Terraform Configuration +* Provisionieren der Ressource in einer Azure Subscription mittels Terraform +* Deployment von Kubernetes Jobs auf einem Kubernetes Cluster +* Skalieren der Workloads +* Zerstören der Ressourcen in der Azure Subscription + +Was du dafür brauchst: +* einen Laptop (ideal deinen privaten Laptop) +* einen GitHub Account +* Visual Studio Code + + + + Patrick Koch + + + + + + + + + 2024-04-05T17:00:00+02:00 + 17:00 + 02:50 + HS i11 + glt24-431-vom-anfnger-zum-vim-keyboard-ninja + https://pretalx.linuxtage.at/glt24/talk/HUY9BH/ + + + true + + Vom Anfänger zum vim Keyboard-Ninja + + Anwendung + Workshop (2,8h) + de + In diesem Workshop lernen vim-Novizen alles, um effizient mit dem de-facto Standard-Unix Editor umzugehen. Der Fokus liegt darauf, beim Bearbeiten von Texten und Konfigurationsdateien nur wenige Tastendrücke zu benötigen. Anfänger lernen hier die Philosophie des Editors kennen und können diese hinterher selbst anwenden. + Der vim Editor (und seine Verwandten) ist zwar im Unix-Umfeld umnipräsent, gleichzeitig scheuen sich viele Anwender, diesen einzusetzen. Gerade für Neulinge scheint dieser Editor ein Buch mit sieben Siegeln zu sein und gilt oft als benutzerunfreundlich. Das muss aber nicht so sein. + +In diesem praktischen Workshop lernen wir die Grundlagen des Editors kennen und welche tolle Features dort bereits eingebaut sind. Anfänger lernen die Philosophie von vim kennen und wir werden nach kurzer Zeit schon sehr effizient und mit wenig Aufwand alltägliche Aufgaben erledigen. +Hier ein kleiner Vorgeschmack: +* Zahlen ändern ohne in den INSERT-Modus zu wechseln +* Autovervollständigung von Wörtern, Zeilen, und Pfaden im Dateisystem +* Autokorrektur von häufigen Tippfehlern +* Inhalte des Editors durch die Shell filtern +* Eingabesequenzen mit Makros automatisieren +* die Aktion-Bereich-Objekt Notation effektiv einsetzen + +Hinterher fühlen wir uns bestimmt wie Tastatur-Ninjas, weil wir mit wenig Tastendrücken viel Arbeit erledigen können. Vielleicht wird vim dadurch doch der Lieblingseditor und Standard-Textbearbeitung geht uns viel einfacher von der Hand. + +Hinweis: wir betrachten den Editor in seiner Grundkonfiguration und gehen nicht auf Plugins ein. + + + Benedict Reuschling + + + + + + + + + 2024-04-05T13:00:00+02:00 + 13:00 + 03:40 + HS i12 + glt24-451-ctf-101-introduction-to-capture-the-flag-challenges + https://pretalx.linuxtage.at/glt24/talk/USFBSQ/ + + + true + + CTF 101: Introduction to Capture the Flag Challenges + + Sicherheit + Workshop (3,5h) + de + In diesem Workshop zeigen Mitgleider des CTF Teams LosFuzzys einen kleinen Einblick in das Lösen von CTF Challenges. +Wir erklären was CTF Challenges sind, welche Arten von Challenges es gibt und warum CTFs eine großartige Art sind, um in der Welt der Information Security Fuß zu fassen. + +Im Anschluss haben die Teilnehmer die Möglichkeit selbst CTF Challenges zu lösen, dabei stehen ihnen Mitglieder von LosFuzzys helfend zur Seite. + + /media/glt24/submissions/USFBSQ/logo_losfuzzys_150_zC99vNI.png + + Markus OstermayerKevin SaigerMarcell HaritopoulusHannes Weissteiner + + + + + + + + + 2024-04-05T13:00:00+02:00 + 13:00 + 01:50 + HS i13 + glt24-432-josm-workshop + https://pretalx.linuxtage.at/glt24/talk/BWMP93/ + + + true + + JOSM Workshop + + Anwendung + Workshop (2h) + de + Die ersten Schritte in der OpenStreetMap sind oft leicht gemacht: Webbasierte Editoren wie Id machen es leicht, ein Geschäft oder einen neuer Weg einzuzeichnen. +Doch die ersten Hürden sind nicht weit: Etwa ein Kreisverkehr, über den Busrelationen verlaufen, oder eine große Waldfläche, die als Multipolygon abgebildet ist. +Hier empfiehlt sich JOSM als Editor und um gemeinsam mit Euch die ersten Schritte zu machen, halte ich diesen Workshop. Ich will diesen Workshop dabei als Beitrag verstehen, die Beteiligung an OpenStreetMap in Form von Craftmapping zu kultivieren, dabei aber auch auf sinnvolle, verfügbare Quellen eingehen. + Der Workshop hat ein altbewährtes Format, geht aber auf aktuelle Themen ein: + + * Kurze Einführung in das OpenStreetMap-Datenmodell inklusive Ausblick auf die beabsichtigten Änderungen + * Kurzer Überblick über das Dokumentations- und Hilfsmaterial im OpenStreetMap-Wiki + * Craftmapping vs. Automatisierte Editierungen + * Umgang mit bereits bestehenden Relationen + * Die wichtigsten Datenquellen in Österreich, welche zur Benutzung in OpenStreetMap freigegeben sind + + + Stefan Tiran + + + + + + 2024-04-05T15:00:00+02:00 + 15:00 + 01:50 + HS i13 + glt24-426-onlineumfragetool-limesurvey-installations-und-admin-workshop + https://pretalx.linuxtage.at/glt24/talk/CN7ZRW/ + + + true + + Onlineumfragetool Limesurvey: Installations- und Admin-Workshop + + Admin + Workshop (2h) + de + Bei Onlineumfrage kommt es gleichermaßen auf drei Dinge an: Den INHALT, die VERPACKUNG und bei wem alle Rohdaten und Metadaten aus einer Online Umfrage zur Auswertung landen. + +Im Workshop wird exemplarisch und life Limesurvey mit Hilfe des im Programm eingebetten Installationsautomatismus zum Leben erweckt und auch gleich aktiv bespielt. + Nach erfolgter Installation gehts weiter mit praxisbezogenen Anwendungen wie +* das Übertrag einer bestehenden Umfrage +* Eingeben von Fragen samt ***sinnvollen*** Antwortoptionen + **==> Hinweis**: Darauf geht ein Vortrag am Samstag vertieft ein. +* Verknüpfungen von Bedingungen für Fragen +* Sicherung von Umfragen und Daten +* Auswertung und Weiterverarbeitung der Rohdaten und nicht zuletzt +* die Administration von Berechtigungen + + + +**T I P P** : +Für Workshop Partizipierende mit eigenem (dynamischen) Webspace besteht die Möglichkeit, das Limesurvey Programm bereits vorab zu installieren, um am Workshop-Tag Admin-Einstellungen und erste Fragen für sich selbst schon anwenden zu können. Dazu wird folgender Weblink angeboten. + +https://meisterreischl.eu/GLT24-limesurvey/ +wird spätestens eine Woche vor dem GLT24 (05. und 06. April 2024) +als Link zum Herunterladen der betreffenden Version zu finden sein. + +Auf diese Weise kann in Vorbereitung auf den Workshop-Tag mit den eigenen Admin-Einstellungen und Umfragen herum gespielt werden. + + + MeisterReischl + + + + + + 2024-04-05T17:00:00+02:00 + 17:00 + 01:00 + HS i13 + glt24-413-anwendung-von-fido2 + https://pretalx.linuxtage.at/glt24/talk/3TMFSM/ + + + true + + Anwendung von FIDO2 + + Anwendung + Workshop (2h) + de + In diesem Workshop soll die Anwendung/Verwendung von FIDO2-Tokens beispielhaft erläutert und gezeigt werden. Insbesondere soll auf die Verwendung von FIDO2 mit der ID-Austria eingegangen werden. Der Workshop richtet sich speziell an die Bedürfnisse von Technik-Neulingen. + + + + Jürgen Bruckner + + + + + + + + + 2024-04-05T14:30:00+02:00 + 14:30 + 02:30 + Seminarraum ISW + glt24-483-lpi-prfung + https://pretalx.linuxtage.at/glt24/talk/SJCYSQ/ + + + true + + LPI Prüfung + + Prüfung + Prüfung + de + LPI Exams + Ermäßigte Prüfungen! +Die Prüfungen werden mit einem Community-Rabatt angeboten und kosten 85 EUR jede Essentials Prüfung und 140 EUR jede Professional Prüfung. + +Kandidaten können die Prüfungen Linux Essentials, Security Essentials, Web Development Essentials, LPIC-1 und LPIC-2 auf Englisch und Deutsch ablegen. Open Source Essentials, LPIC-3, DevOps Tools Engineer und BSD Specialist sind nur auf Englisch verfügbar. + +Daher bitten wir Kandidaten, sich für die Veranstaltung zu registrieren unter: https://www.lpi.org/exam-registration/. + +Kurzentschlossene sind ebenfalls herzlich willkommen! + +So nehmen Sie an den Prüfungssitzungen teil +Die Kandidaten müssen 15 Minuten vor Prüfungsbeginn im Prüfungsraum sein und einen amtlichen Lichtbildausweis (Reisepass, Personalausweis oder Führerschein), ihren LPI-Ausweis und die Prüfungsgebühr in bar mitbringen. + + + LPI + + + + + + + + + + + + 2024-04-06T10:00:00+02:00 + 10:00 + 00:45 + HS i1 + glt24-409-erfolgreiche-zusammenarbeit-von-linux-distributionen + https://pretalx.linuxtage.at/glt24/talk/KYDAVN/ + + + false + + Erfolgreiche Zusammenarbeit von Linux-Distributionen + + Community + Vortrag lang + de + openSUSE, Fedora und Debian haben sich als Linux Distributions Working Group beim Open Mainframe Project mit einer IBM-Vertreterin zusammen geschlossen mit dem Ziel, dass man die Pflege der jeweiligen Mainframe (s390x) Ports gemeinsam macht und alle Linux-Distributionen am Ende die entsprechenden Patches und Erweiterungen integrieren können. Anfangs wurde diese Idee von außen etwas erstaunt betrachtet, aber auf Community-Level sind wir eine "internationale" Linux-Community bestehend aus unterschiedlichen Linux-Distributionen. In der Zwischenzeit haben sich auch SUSE, Canonical (Ubuntu), AlmaLinux und Rocky Linux angeschlossen. Genauso ist man dazu übergegangen die Toolings für automatische Tests mit openQA gemeinsam zu entwickeln. +In diesem Vortrag werden die Vorteile gemeinsamer Zusammenarbeit bei Linux-Distributionen mit unterschiedlichen Communities dargestellt und am Beispiel der Linux Distributions Working Group aufgezeigt, wie man gemeinsam entwickeln kann, so dass alle am Ende einen Vorteil haben. + + /media/glt24/submissions/KYDAVN/LinuxDistributionsWorkingGroup_SCk6cab.png + + Sarah Julia Kriesch + + + + + + 2024-04-06T11:00:00+02:00 + 11:00 + 00:25 + HS i1 + glt24-467--sponsor-vusiongroup-talk + https://pretalx.linuxtage.at/glt24/talk/AZR3WG/ + + + false + + [SPONSOR] VusionGroup Talk + + Hardware + Vortrag + en + VusionGroup alias SES-Imagotag is one of the technology leaders for electronic shelf labels (ESL). In 2020, the decision was made to innovate ESL technology by using open standards such as Bluetooth. Already at the starting point it was not clear how one BLE-controller would be apply to drive 7k of end devices in an effective and high responsive way. The goal was achieved after 3 years of development work and changes were pushed to Bluetooth V5.4 Core specification and ESL profile release. A rough overview of how Bluetooth SIG works, how multi-device support found its way into the Bluetooth Core Spec, the technical aspects and finally why BLE chip vendors were forced with a completely new situation for their chips and why this forms a base for full IOT environments. + + /media/glt24/submissions/AZR3WG/vusion_kTaWukb.jpg + + Horst Kautschitz + + + + + + 2024-04-06T11:35:00+02:00 + 11:35 + 00:25 + HS i1 + glt24-476-embedded-linux-security-the-good-the-bad-and-the-ugly + https://pretalx.linuxtage.at/glt24/talk/N8FX7N/ + + + false + + Embedded Linux Security: The Good, the Bad and the Ugly + + Sicherheit + Vortrag + en + Linux-based embedded systems are not uncommon these days, but they still have some rough edges, especially in terms of security. +In this talk, Richard will outline common problems he encounters when working with customers on embedded systems. +The goal is to make you aware of these critical pitfalls you should definitely avoid in your next project. + + + + Richard WeinbergerDavid Gstir + + + + + + 2024-04-06T12:10:00+02:00 + 12:10 + 00:45 + HS i1 + glt24-411-lightning-talks + https://pretalx.linuxtage.at/glt24/talk/HT9MKN/ + + + false + + Lightning Talks + + Community + Vortrag lang + de + Kurzvorträge (max. 5 min) zu verschiedenen Themen. + +Quick talks (max. 5 min) about different topics. + - Wenn Du einen Lightning Talk halten möchtest, dann melde Dich bitte via Email an lightning@linuxtage.at +- Um in der vorhandenen Zeit möglichst viele Talks durchführen zu können, bitten wir Dich, Deine Folien (bzw. einen Download-Link) an die gleiche Email-Adresse zu senden. +- Das Zeitlimit pro Vortrag wird 5 Minuten sein. +- Deine Slides müssen auf einem Standard Ubuntu Laptop "abspielbar" sein: + - D.h. am besten ein PDF + - oder als ZIP mit Bildern bzw. Videos (als Slideshow) + - oder in Libreoffice +- Für die Reihenfolge der Vorträge gilt: + - die Reihenfolge des Email-Einganges (first come, first serve) + - Erst danach spontane Talks aus dem Publikum, bzw. Talks mit eigenem Laptop. + +-- + +- If you want to do a lightning talk, then please contact us on the email address lightning@linuxtage.at +- In order to perform as many talks as possible, we kindly ask you to provide your slides (or a download link) to the same email address. +- The time limit for each talk is 5 minutes. +- Your slides must be "playable" on a standard Ubuntu laptop + - best would be a PDF + - or a ZIP containing images and videos (slideshow) + - or via libreoffice +- The sequence of talks is determined as follows: + - the sequence of the incoming emails (first come, first serve) + - then people from the audience may do spontaneous talks, optionally using the own laptop. + + + Bernhard "Slash" Trummer + + + + + + 2024-04-06T12:25:00+02:00 + 12:25 + 00:05 + HS i1 + glt24-479-securely-access-your-home-server-from-anywhere + https://pretalx.linuxtage.at/glt24/talk/ULPNCG/ + + + false + + Securely access your home server from anywhere + + + Lightning Talk + en + In this talk, we'll explore how you can securely access your home server or homelab from anywhere using a managed Wireguard VPN (Virtual Private Network). + +With Headscale, an open source, self-hosted implementation of the Tailscale control server, we can forward traffic from a cheap, rented VPS (Virtual Private Server) to devices in our home network added to our tailnet. + +This way you don't have to open any ports on your devices at home towards the world wide web to be able to access services running on them. Thereby you mitigate a lot of the risks coming with a publicly accessible server. + In this talk, we'll explore how you can securely access your home server or homelab from anywhere using a managed Wireguard VPN (Virtual Private Network). + +With Headscale, an open source, self-hosted implementation of the Tailscale control server, we can forward traffic from a cheap, rented VPS (Virtual Private Server) to devices in our home network added to our tailnet. + +This way you don't have to open any ports on your devices at home towards the world wide web to be able to access services running on them. Thereby you mitigate a lot of the risks coming with a publicly accessible server. + + + Matthias Thym + + + + + + 2024-04-06T12:30:00+02:00 + 12:30 + 00:05 + HS i1 + glt24-449-mutual-external-monitoring-w-uptime-kuma + https://pretalx.linuxtage.at/glt24/talk/SEVDTS/ + + + false + + Mutual External Monitoring w/ uptime/kuma + + + Lightning Talk + de + In Zusammenarbeit mit unserem Schwesterverein aus dem Netzkunst- / nicht-kommerziellen OpenSource-Webhosting-Bereich stellen wir, [mur.at][mur1] und [servus.at][servus1], uns gegenseitig ein externes Monitoring zu Verfügung. +Wir betreiben, im jeweils anderen Rechenzentrum eine Serviceinstanz des freien OpenSource-Monitoringwerkzeugs [Uptime Kuma][uk1] in einem angepassten Docker-Stack inkl SSH-Zugang. + +[uk1]: https://github.com/louislam/uptime-kuma/ +[mur1]: https://mur.at +[servus1]: https://servus.at + In Zusammenarbeit mit unserem Schwesterverein aus dem Netzkunst- / nicht-kommerziellen OpenSource-Webhosting-Bereich betreiben wir, [mur.at][mur1] und [servus.at][servus1], im jeweils anderen Rechenzentrum eine Serviceinstanz des freien OpenSource-Monitoringwerkzeugs [Uptime Kuma][uk1] in einer [Docker][docker1]-Umgebung. + +Um die Instanz maximal unabhängig von unseren Kollegen administrieren zu können, kombinieren wir `sshd` mit `uptime/kuma` in einem mittels `docker-compose` konfigurierten Docker-Stack. +Das ermöglicht uns, die komplette Datenbank via `scp` auszutauschen, +i.e. in einer lokalen Instanz die Konfiguration zu verwalten und die aktuellste Version in die Produktions-Instanz einzuspielen. +Um das Neustarten von Docker-Stacks den User:innen selbst zu ermöglichen, verwenden wir bei [mur.at][mur1] das Docker-Managementwerkzeug [Portainer][port1] + +Links: + +https://github.com/louislam/uptime-kuma/ +https://www.portainer.io/ +https://status.mur.at +https://status.servus.at + +[uk1]: https://github.com/louislam/uptime-kuma/ +[mur1]: https://mur.at +[servus1]: https://servus.at +[docker1]: https://www.docker.com/ +[port1]: https://www.portainer.io/ + /media/glt24/submissions/SEVDTS/Screenshot_20240112_170554_qCf99M8.png + + Ralph Wozelka + + + + + + 2024-04-06T13:05:00+02:00 + 13:05 + 00:25 + HS i1 + glt24-443-freie-basis-software-fr-unternehmen-ohne-cloud + https://pretalx.linuxtage.at/glt24/talk/CYEDMA/ + + + false + + Freie Basis-Software für Unternehmen ohne Cloud + + Admin + Vortrag + de + Für neugegründete und kleinere Unternehmen ist die Nutzung von Cloud-Software für Abläufe wie internen Kommunikation, Dokumentenverwaltung, CRM, Projektmanagement oder Zeiterfassung. Das hat etliche Vorteile, führt aber zu Einschränkungen bei Vertraulichkeit und mit laufenden Wachstum zu oft überraschend hohen Kosten. Dieser Vortrag stelle einige Alternativen mit freier Software vor, die sich auch in der eigenen IT-Infrastruktur betreiben lassen. Besuchende sollten damit reflektieren können, welche davon in ihrem Unternehmen sinnvoll und wirtschaftlich sein könnten. + Gerade für kleine oder neu gegründete Unternehmen ist es auf den ersten Blick attraktiv, auf Cloud-Lösungen zurück zu greifen. Zum Beispiel Slack oder Discord für die Kommunikation, Google Docs oder Office 365 für Dokumente, Salesforces oder Hubspot für das CRM, Projektmanagement mit Trello oder Notion, und dann noch eine der zahlreichen Zeiterfassungslösungen. Jedes der Teile kostet ein paar Euro pro Monat oder ist für kleine Teams gar gratis, und die Wartung der Infrastruktur macht der Hersteller. Klar, die eigenen Daten geistern irgendwo in der Welt herum und werden für Analysen und zum Trainieren von künstlichen Intelligenzen genutzt. Aber das ist heute sowie normal, oder? + +Schwierig werden kann das für Branchen, wo Kunden erwarten, dass alle Daten im Unternehmen vor Ort liegen. Auch wenn das Unternehmen wächst, kann es preislich ein böses Erwachen geben. Die Gratis-Software will auf einmal Geld, wenn mehr als 10 Projekte darin abgebildet sein sollen. 10 Euro pro Monate und Benutzenden erscheinen mit 3 Personen überschaubar, bei 20 Leuten sind das schon 2400 Euro im Jahr. Und das nur für nur 1 Produkt. + +Welche Alternativen gibt es hier mit freier Software, die ich selbst hosten kann? Oft sind auch diese nur teilweise gratis, welchen möglicherweisen wichtigen Eigenschaften gibt es erst gegen Bezahlung? Ist die Benutzbarkeit erträglich oder ist das Teil nur für Masochisten geeignet? Wie viel Infrastruktur brauche ich in etwa für ein Hosting? Wie hoch ist der Aufwand für die Installation und das Teil aktuell und am Leben zu erhalten? + +Die Antwort auf diese Fragen sehen wir uns für einige der gängigsten Alternativen zu Cloud-Software für Unternehmen an. + +An Ende sollen neugegründete Unternehmen bewerten können, welche der vorgestellten Lösungen für sie früh Sinn machen können, und wo der Einrichtungs- und Wartungsaufwand auf Sicht zu viele Kapazitäten der ressourcenknappen Gründungsphase bindet. Bestehende Unternehmen sollen reflektieren können, für welche ihrer vorhandenen Anwendungen aus einer Kostenbetrachtung eine Migration vor allem wirtschaflich nützlich sein kann. + + + Thomas Aglassinger + + + + + + 2024-04-06T14:00:00+02:00 + 14:00 + 00:45 + HS i1 + glt24-470-was-ich-immer-schon-ber-photovoltaik-wrmepumpen-und-heimautomation-wissen-wollte + https://pretalx.linuxtage.at/glt24/talk/3TJ3MH/ + + + false + + Was ich immer schon über Photovoltaik, Wärmepumpen und Heimautomation wissen wollte + + Hardware + Vortrag lang + de + Mein über 100 Jahre altes Haus hat seit einem Jahr eine Wärmepumpenheizung, und seit einigen Monaten eine Photovoltaikanlage. Was bedeutet das für's Wohnen, für's Klima, und für das Energiebudget? Wie verknüpft man das alles in einer Home Assistant-Installation auf einem Raspberry Pi? Und wie navigiert man sich durch den österreichischen Behörden-, Energieversorger-, und Förderdschungel? Dieser Vortrag gibt Antworten. + Für diesen Vortrag sind keine besonderen Vorkenntnisse im Bereich Heimautomation oder Energietechnik erforderlich. Ich erkläre unter anderem: + +* Was ist eine Wärmepumpe? Was ist eine Photovoltaik- (PV-) Anlage? +* Wie wirkt sich der Einbau einer Wärmepumpe und einer PV-Anlage auf einen Altbau aus? +* Wie kann ich den Energieverbrauch in meinem Haus messen und steuern? +* Wie kann ich das alles mittels Home Assistant zusammenführen? +* Wie betreibe ich Home Assistant (und ein paar andere Dienste, wie Mosquitto und Grott) mit Podman und systemd auf einem Ubuntu-Raspberry Pi? +* Welche Erfahrungen macht man unterwegs? + + + Florian Haas + + + + + + 2024-04-06T15:00:00+02:00 + 15:00 + 00:45 + HS i1 + glt24-454-container-management-leicht-gemacht + https://pretalx.linuxtage.at/glt24/talk/UTAQS9/ + + + false + + Container-Management leicht gemacht + + Admin + Vortrag lang + de + An Containern führt leider (fast) kein Weg mehr vorbei. Das Problem mit Kubernetes zu erschlagen ist allerdings für viele Overkill bzw nicht stemmbar. +Dieser Vortrag zeigt einen Zwischenweg um Container in existierende Systemlandschaften zu integrieren ohne alles bisher über System-Management gelernte über den Haufen zu schmeißen. + Spätestens seit Kubernetes sind Container "in" und entwickeln sich immer mehr zu einem Paketformat für Software. Im schlimmsten Fall gibt es Software überhaupt nur mehr als Container. +Was also tun wenn man solch eine Software verwenden muss/will und sich nicht einen Rattenschwanz an Tooling eintreten will? Mit Podman gibt es hierfür seit ein paar Jahren eine Lösung +die sich gut mit Systemd verheiraten lässt und mit der sich Container quasi wie native Services anfühlen. Wie sich das möglichst einfach bewerkstelligen lässt wird im Laufe des Vortrages +präsentiert werden. + +Der Vortrag setzt keine speziellen Vorkenntnisse voraus und es sollte für alle die irgendwo Software warten etwas dabei sein (sei das nun auf einem Raspberry PI, sonstigen Home-Servern oder einer Serverfarm). + + + Florian Apolloner + + + + + + 2024-04-06T16:00:00+02:00 + 16:00 + 00:45 + HS i1 + glt24-438-skyfield-elegante-astronomie-fr-python + https://pretalx.linuxtage.at/glt24/talk/XLW3EZ/ + + + false + + Skyfield - Elegante Astronomie für Python + + Entwicklung + Vortrag lang + de + Manchmal kann es für Python-Entwickler erforderlich sein, die Position +astronomischer Objekte, wie z.B. von Sonne und Mond, und die +entsprechenden Auf- und Untergangszeiten zu berechnen. + +Für Python gibt es diverse astronomische Bibliotheken für +unterschiedliche Anwendungen. Großer Beliebtheit erfreute und erfreut +sich *PyEphem* (siehe [GLT2016](https://glt.foehnwall.at/glt16.html#pyephem-sonne-mond-und-sterne-in-python)), welches einen Python-Wrapper für eine inzwischen in +die Jahre gekommen C-Bibliothek darstellt und für die Entwickler entsprechend umständlich +zu warten ist. + +Vom Betreuer dieses Projektes, Brandon Rhodes, wurde mit **Skyfield** eine vollständige +Neuentwicklung unternommen. Skyfield ist in **reinem Python** +geschrieben und hat als einzige binäre Abhängigkeit **NumPy**, die +bekannte numerische Bibliothek für wissenschaftliches Rechnen, welche +mit schnellen Vektoroperationen die Effizienz von Skyfield +garantiert. Der Anspruch von Skyfield ist es, sich den vom *United +States Naval Observatory* im *Astronomical Almanac* publizierten +Werten mit einer Genauigkeit von 0.5 Tausendstel(!) Bogensekunden +anzunähern. + +Der Vortrag bringt zunächst einige für das Verständnis wichtige +Vorbemerkungen zu Koordinaten- und Zeitsystemen. Anschließend erfolgt +eine Einführung in die Grundkonzepte von Skyfield mit beispeilhafter +Berechnung einfacher astronomischer Alltagsprobleme. Vorausgesetzt +wird von den Zuhören elementare Erfahrung mit Python. + + + + Dietmar Thaler + + + + + + 2024-04-06T17:00:00+02:00 + 17:00 + 00:25 + HS i1 + glt24-459-metriken-fr-alle-mit-prometheus-und-grafana + https://pretalx.linuxtage.at/glt24/talk/HCXKUZ/ + + + false + + Metriken für alle - mit Prometheus und Grafana + + Entwicklung + Vortrag + de + _Business_ will Daten und hübsche Diagramme über die Applikation sehen und du hast keine Lust, Tage damit zu verschwenden? Dann bist du hier richtig. Dieser Vortrag zeigt, wie du RaspberryPi Pico und Linux Server gleichermaßen mit Hilfe von Prometheus überwachen kannst - und Diagramme in Grafana anzeigst. + Traditionelle Monitoring-System, wie Nagios, Zabbix und andere, sind schon lange am Markt und bringen viele Features mit. Diese Tools zu konfigurieren ist leider nicht immer trivial und bringt vor allem auch für Einsteiger einige Hürden mit sich. + +Prometheus hingegen definiert ein einfaches HTTP-basiertes Protokoll und besinnt sich auf das Wesentliche - Metriken von verschiedenen System zu sammeln, zu speichern und mittels der eigenen Abfragesprache _PromQL_ zur Abfrage bereitzustellen. Auf Applikations-Seite genügt nun meist das Einbinden einer Library, um Standard Metriken für Prometheus bereitzustellen. + +Der Vortrag zeigt, wie man auf einem RaspberryPi Pico Metriken nur mit einem Standard Webserver exportiert. In einem zweiten Schritt konfigurieren wir dann auf einer klassischen Linux VM einen Standard Node Exporter. Die Metriken beider Systeme zeigen wir dann in auf einem hübschen Dashboard in Grafana an. Und so einfach haben wir unsere _Business Owners_ glücklich gemacht. + + + Nicolas Angelo + + + + + + 2024-04-06T17:30:00+02:00 + 17:30 + 00:25 + HS i1 + glt24-461-your-web-app-is-taking-up-too-much-ram-let-s-fix-it-using-foss-tools- + https://pretalx.linuxtage.at/glt24/talk/BFWYDZ/ + + + false + + Your web app is taking up too much RAM. Let's fix it using FOSS tools! + + Entwicklung + Vortrag + en + We've all seen the memes about Google Chrome devouring all the available RAM on your notebook. Is that only due to how the browser works or is it also our fault as web apps developers? In fact, modern JS apps are becoming increasingly complicated, so their compute and memory requirements are rising as well, with some famous websites even taking up entire gigabytes of memory. This does not only fill up the memory of your users devices, but can also cause crashes and performance drops. How do we monitor if that's the case, and how can we fix it? This talk will shed some light on the dark art of memory allocations and profiling, showing how some data structures and some JS frameworks are less efficient than others. Also, what are some FOSS tools that are available to measure it, such as the Chrome Memory Profiler and MemLab, showcasing some custom tooling I've built around those two. + + + + Giulio Zausa + + + + + + + + + 2024-04-06T10:00:00+02:00 + 10:00 + 00:45 + HS i2 + glt24-484-open-doors-open-source-der-weg-zum-smart-home-fr-alle + https://pretalx.linuxtage.at/glt24/talk/3MYSWM/ + + + false + + Open Doors, Open Source: Der Weg zum Smart Home für Alle + + Hardware + Vortrag lang + de + Entdecken Sie die Zukunft des Wohnens mit Open-Source Heimautomatisierungs-Systemen! In diesem Vortrag präsentiert Fridolin Einböck eine fesselnde Reise durch die Evolution der Heimautomatisierung. Erfahren Sie, wie offene Softwarelösungen eine kostengünstige und flexible Alternative für Smart-Home-Systeme bieten. Von der Einführung in die Grundlagen bis hin zu praktischen Anwendungsbeispielen zeigt dieser Vortrag, wie Open-Source-Technologien die Heimautomatisierung neu definieren und für jedermann zugänglich machen. + Dieser praxisorientierte Vortrag bietet einen umfassenden Einblick in die Implementierung von Smart-Home-Lösungen unter Verwendung von Open-Source-Technologien. Unter der Anleitung von Fridolin Einböck, werden die Teilnehmer durch einen Schritt-für-Schritt-Prozess geführt, der es ihnen ermöglicht, ihre eigenen Smart-Home-Systeme zu planen, zu entwickeln und umzusetzen. + +Der Vortrag beginnt mit einer Einführung in die Grundlagen der Heimautomatisierung und einer Diskussion über die Vorteile und Herausforderungen von Open-Source-Lösungen in diesem Bereich. Anschließend werden verschiedene Open-Source-Plattformen, Frameworks und Tools vorgestellt, die für die Umsetzung von Smart-Home-Projekten geeignet sind, sowie bewährte Praktiken für ihre Integration und Nutzung. + +Ein zentraler Bestandteil des Vortrags sind praktische Demonstrationen und Fallstudien, die den Teilnehmern helfen, die Konzepte und Techniken in der Praxis zu verstehen und anzuwenden. Von der Auswahl der richtigen Hardwarekomponenten über die Konfiguration von Softwarelösungen bis hin zur Integration von Sensoren und Aktoren - dieser Vortrag bietet alles, was benötigt wird, um erfolgreich ein eigenes Smart-Home-System aufzubauen. + +Das Ziel des Vortrags ist es, den Teilnehmern das notwendige Wissen und die praktischen Fähigkeiten zu vermitteln, um selbstbewusst und kompetent ihre eigenen Smart-Home-Projekte umzusetzen. Durch die Förderung von Offenheit, Kreativität und Zusammenarbeit in der Open-Source-Gemeinschaft soll dieser Vortrag dazu beitragen, die Barrieren für den Einstieg in die Heimautomatisierung zu senken und die Teilnehmer zu befähigen, ihre Wohnräume nach ihren individuellen Bedürfnissen zu gestalten und zu optimieren. + + + Fridolin Einböck + + + + + + 2024-04-06T11:00:00+02:00 + 11:00 + 00:25 + HS i2 + glt24-475-markup-languages-contemplated-categorized-and-criticized + https://pretalx.linuxtage.at/glt24/talk/G7ALGR/ + + + false + + Markup languages: contemplated, categorized, and criticized + + Anwendung + Vortrag + en + As part of my FOSS project in digital typesetting, I am interested in the depths of markup languages. How did markup languages emerge? How powerful and extensible shall they be? In this talk, I want to summarize my findings. + Markup languages like Markdown & MediaWiki are prevalent for software developers to specify formatted content. One might wonder whether all problems are solved because most software developer resort to “Markdown” when user-provided texts are written these days. But are they? At least once you discover the differences between Markdown dialects, you wonder whether Markdown is really a good choice. + +In my investigations, I started with the simple question how to build a simple markup language parser. It turns out the simplicity in the parser is orthogonal to user friendliness. Simultaneously, I recognized how escaping mechanisms can - indeed - be designed simple and memorable. And they are too often forgotten. When I continued with the parsing topic, I recognized that markup languages do not at all serve the same purpose and need to be categorized. But this seems nontrivial. What is a “lightweight” markup language? What is a “document” markup language? And how can the simplicity of syntax be measured? What makes “XML” extensible? And what limits the adoption of markup languages besides Markdown? + +In this talk, I want to revisit how SGML turned into XML, remember the good old bbcodes of board software from the 2000s, how Wiki syntaxes were popularized and vanished, and Github made Markdown a big player. Afterwards I will present my findings and propose how to solve related questions. + + + tajpulo + + + + + + 2024-04-06T11:35:00+02:00 + 11:35 + 00:25 + HS i2 + glt24-478-fully-declarative-homelab-on-nixos- + https://pretalx.linuxtage.at/glt24/talk/T37KQQ/ + + + false + + Fully declarative Homelab on NixOS ❄️ + + Anwendung + Vortrag + en + In this talk, we'll explore the intricacies of setting up a reproducible personal home server or homelab using a fully declarative approach on NixOS. + +Building upon the foundation laid by last year's introduction to NixOS and the Nix ecosystem, this talk takes participants on a journey from a fully declarative disk setup to the configuration of a wide range of services suitable for Linux server and homelab enthusiasts. + +Emphasizing reproducibility and ease of configuration, this session should appeal to NixOS users and homelab enthusiasts running other Linux distributions. + Have you ever wanted to have complete control over your personal home server or homelab? Are you tired of manually configuring and maintaining your server, only to encounter unexpected issues down the line? Look no further! In this Linux conference talk, we will take another look at NixOS (a Linux distribution doing things different) and explore the benefits of a fully declarative approach to setting up your own server. + +Building upon the foundations laid in last year's talk that served as an introduction to NixOS and the Nix ecosystem, we will dive deeper into the possibilities that await you. Our focus will be on achieving reproducibility in your server setup, ensuring that you can confidently recreate your environment on-demand, without any surprises. + +We will begin by guiding you through a declarative disk setup and will then venture into the exciting realm of service configuration. Whether you have a particular interest in containerized services or prefer traditional setups, we've got you covered. Our talk will provide plenty of configuration examples, showcasing various services that you could run on your home server or homelab. + +Join us as we unravel the power and simplicity of NixOS. Discover how a fully declarative approach can revolutionize the way you set up and maintain your personal home server or homelab. Whether you're a seasoned Linux enthusiast or new to the world of server administration, this talk will equip you with the knowledge and tools to take control of your server infrastructure and create a reproducible, reliable, and personalized server environment. + + + Matthias Thym + + + + + + 2024-04-06T12:10:00+02:00 + 12:10 + 00:45 + HS i2 + glt24-433-integrationstests-mit-szenarien-fr-container-kompositionen + https://pretalx.linuxtage.at/glt24/talk/YQKPAS/ + + + false + + Integrationstests mit Szenarien für Container-Kompositionen + + Entwicklung + Vortrag lang + de + Hinter Web-Diensten steht häufig eine Zusammenstellung verschiedener Komponenten wie Webserver, Datenbanken oder selbst entwickelter Software. Der Vortrag zeigt wie das Backend der Videokonferenzsoftware OpenTalk in Integrationstests verschiedene Szenarien mit unterschliedlichen Container-Kompositionen implementiert. + Um ein Videokonferenzsystem auf Basis der Open-Source-Software [OpenTalk](https://opentalk.eu/) zur Verfügung zu stellen, werden verschiedene Komponenten verwendet, die häufig in Containern laufen: + +- Die "Kernkomponente" [*OpenTalk Controller*](https://gitlab.opencode.de/opentalk/controller) (eine oder mehrere Instanzen davon) +- Das [*OpenTalk Web-Frontend*](https://gitlab.opencode.de/opentalk/web-frontend) +- [Janus](https://janus.conf.meetecho.com/) als WebRTC-Service +- [PostgreSQL](https://www.postgresql.org/)-Datenbankservice +- [RabbitMQ](https://www.rabbitmq.com/) zum Austausch von Nachrichten zwischen den Komponenten +- [Redis](https://redis.io/) zur Speicherung der laufenden Videokonferenzen +- OIDC-Provider, meist [Keycloak](https://www.keycloak.org/) +- [*OpenTalk SMTP-Mailer*](https://gitlab.opencode.de/opentalk/smtp-mailer) zum Versand von Einladungs-Mails +- [*OpenTalk Obelisk*](https://gitlab.opencode.de/opentalk/obelisk) als Dial-In-Service +- [*OpenTalk Recorder*](https://gitlab.opencode.de/opentalk/recorder) zum Aufnehmen oder Streamen von Videokonferenzen + +Für die eigenen Komponenten waren bereits in weiten Teilen Unit-Tests vorhanden, die von der CI ausgeführt werden. Integrationstests, welche das Backend auf die korrekte Abarbeitung von Web-Requests und Websocket-Verbindungen in verschiedenen Szenarien prüfen, fehlten jedoch weitgehend. + +Beispiele für solche Szenarien sind: + +- Simples Setup mit einem *OpenTalk Controller* und den Beispiel-Accounts *Alice*, *Bob*, *Charlie*, *Dave* und *Erin* +- Komplexeres Setup mit mehreren *OpenTalk Controllern* +- Ausfallsszenarien (z.B. nachstellen dass *RabbitMQ* während des Betriebs ausfällt und wieder verfügbar wird) + +Der Vortrag skizziert, wie solch ein Integrationstest aussieht. Es wird gezeigt wie Szenarien aufgebaut sind und welche Methoden wir verwenden um den Code les- und wartbar zu halten. Ansätze die wir wieder verworfen oder ersetzt haben, werden kurz angeschnitten, und was wir daraus gelernt haben. Über Technische und organisatorische Hürden, die wir überwinden mussten oder noch überwinden müssen, wird klarerweise auch berichtet. + +Die gezeigten Code-Beispiele sind zum Großteil in [Rust](https://www.rust-lang.org/), da der Backend-Teil von OpenTalk in Rust geschrieben ist. Wenngleich Kenntnis dieser Sprache von Vorteil ist, sind die Beispiele in einer Form gehalten, die auch ohne spezifisches Vorwissen gut genug verständlich sein sollte. + + + Wolfgang Silbermayr + + + + + + 2024-04-06T13:05:00+02:00 + 13:05 + 00:45 + HS i2 + glt24-468--sponsor-grommunio-die-open-source-revolution-bei-groupware-lsungen + https://pretalx.linuxtage.at/glt24/talk/GKTJKV/ + + + false + + [SPONSOR] grommunio: Die Open Source Revolution bei Groupware-Lösungen + + Anwendung + Vortrag lang + de + In einer dynamischen Landschaft der Unternehmenskommunikation ist die Suche nach effizienten, sicheren und kostengünstigen Groupware-Lösungen heutzutage von entscheidender Bedeutung. Die politischen und organisatorischen Umwälzungen der letzten Jahre haben die Notwendigkeit neuer innovativer und transparenter Lösungen ins Zentrum unternehmerischen Handelns gerückt, insbesondere aus österreichischer und europäischer Perspektive. Es ist längst überfällig, eigene Groupware-Lösungen und IT-Strukturen zu entwickeln, um die organisatorische und wirtschaftliche Unabhängigkeit gegenüber den USA und China zu wahren. + +Wir sind uns alle bewusst, dass Fragen zur Sicherheit, Unabhängigkeit und Privatsphäre aus dem täglichen Leben nicht mehr wegzudenken sind, was für dien einzelnen gilt und in unserem Bewusstsein zunehmend verankert ist, gilt für Unternehmen in einem noch größeren Maße. Sie müssen langfristige Unabhängigkeit und Handlungsfähigkeit sicherstellen, um ihr Überleben zu gewährleisten. + +Grommunio hat sich entschlossen, dieser Herausforderung zu begegnen und strebt danach, ein Leuchtturm der Innovation und Transparenz zu sein. Ziel ist es, die langjährige Dominanz proprietärer Plattformen wie Microsoft Exchange herauszufordern. Wir möchten Teil der Lösung sein und eine Alternative bieten, die Innovation, Unabhängigkeit, Freiheit bietet und bei Sicherheit keine Abstriche macht und vor allem unseren Kunden vor allem eines ermöglicht. Innovativ und erfolgreich zu sein. Groupware verstehen wir nicht nur als technische Kommunikationsplattform, sondern als eine gemeinsame Basis des Handelns und Wachsens, die auf der Community aufbaut und Wachstum, Sicherheit und Freiheit fördert. + +Die Präsentation skizziert die Reise von Grommunio in diesem Marktumfeld und wirft einen Blick auf die technischen Herausforderungen und gefundenen Lösungen. Mit einem Ausblick auf die Zukunft wird die Präsentation die laufenden Entwicklungen und die zukünftige Roadmap von Grommunio vorstellen. Wir werden erläutern, wie Grommunio durch kontinuierliche Verbesserung und Community-gesteuerte Entwicklung die Standards für Groupware-Lösungen neu definiert. + +Seien Sie dabei, wenn wir erkunden, warum Grommunio nicht nur eine Alternative, sondern eine überlegene Wahl für Organisationen darstellt. + + + + Peter Windhofer + + + + + + 2024-04-06T14:00:00+02:00 + 14:00 + 00:45 + HS i2 + glt24-435-pointless-blinking-evolution + https://pretalx.linuxtage.at/glt24/talk/7XWWLC/ + + + false + + Pointless Blinking: Evolution + + Hardware + Vortrag lang + en + Continuing the [story of pointlessly blinking lights](https://pretalx.linuxtage.at/glt23/talk/LKZYPX/), I add a number of features to the project. Add hardware buttons that actually do something, add a [user interface (textual)](https://textual.textualize.io/) to "add value", and so on ... + The [2023 talk](https://pretalx.linuxtage.at/glt23/talk/LKZYPX/) focused much on Python's beauty (the +lovely [`asyncio`](https://docs.python.org/3/library/asyncio.html), and decorators that +can be used creatively). In this year's edition I'll extend the +pointless project like so ... + +* GPIO input, and debouncing hardware buttons with [`libgpiod`](https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git) +* [`textual`](https://textual.textualize.io/), a *very cool* user interface toolkit which is *terminal-only*. It is completely *async*, and integrates perfectly with blinking. I'll use it to simulate physical lights and buttons that I cannot use when I'm on a train. + + + Jörg Faschingbauer + + + + + + 2024-04-06T15:00:00+02:00 + 15:00 + 00:45 + HS i2 + glt24-418-we-got-hacked-lektionen-aus-realen-security-vorfllen + https://pretalx.linuxtage.at/glt24/talk/3MMQBF/ + + + false + + We got hacked: Lektionen aus realen Security-Vorfällen + + Sicherheit + Vortrag lang + de + System-AdministratorInnen (Sysadmins) sind dafür verantwortlich, dass die IT-Infrastruktur rund läuft. Dazu gehört auch das Thema IT-Security. Jeder tatsächliche Vorfall bietet dabei wertvolle Erkenntnisse, die uns helfen können, die Systeme widerstandsfähiger und sicherer zu gestalten. Dieser Vortrag gibt einen Einblick in reale Security-Incidents und welche Lektionen sich aus solchen Vorfällen mitnehmen lassen. + Im täglichen Geschäft kümmert sich der Vortragende eigentlich darum, dass die IT-Infrastruktur von verschiedenen Kunden wie gewünscht und möglichst stressfrei funktioniert. Zwischendurch gibt es aber immer wieder spannende Feuerwehr-Einsätze, z.B. wenn Hacker erfolgreich waren und eine Hintertür in einer IT-Infrastruktur gefunden haben. + +Wir sehen uns einige dieser Security-Incidents an und was wir aus diesen lernen können. Wie wird so ein Angriff überhaupt entdeckt und wie erfolgt die Identifizierung der Schwachstelle, die zu den Vorfällen geführt hat? Welche effektiven Strategien gibt es zur Abwehr? Welche Fehler haben zu dem erfolgreichen Angriff geführt? Und welche Best Practices sollte man beachten, um die eigene Infrastruktur resilienter zu gestalten und ähnliche Vorfälle in Zukunft zu vermeiden? + +Dieser Vortrag richtet sich zwar besonders, aber nicht nur an Sysadmins. Auch Entwickler:Innen und andere IT-Interessierte, die einen Einblick dafür bekommen wollen, wie echte Hacker-Angriffe in der Praxis aussehen können und welche Schwachstellen in IT-Infrastruktur schlummern bzw. wie man diese vermeidet, werden auf ihre Kosten kommen. + + + Michael Prokop + + + + + + 2024-04-06T16:15:00+02:00 + 16:15 + 00:30 + HS i2 + glt24-480-designing-for-safety-key-considerations + https://pretalx.linuxtage.at/glt24/talk/7YZUC3/ + + + false + + Designing for Safety: Key Considerations + + Sicherheit + Vortrag lang + en + There are no silver bullets when it comes to designing for interpersonal safety and privacy, but knowing and understanding of some of our most common blind spots as technologists helps. This talk covers the key areas of concern, including trouble with shared accounts, Internet-connected harm, location data, and surveillance, as well as a high-level overview of implementing a practice of designing for safety into your everyday work. + “How will our products harm people?” As tech workers, we don’t often ask this question—but we should. Too often, we design for an ideal circumstance that doesn’t account for the complicated personal dynamics our users bring to the table, including dangerous lived realities such as domestic violence. And when we fail to design for our most at-risk users, we end up unintentionally prioritizing their abusers. In this talk, Eva will show how every day tech can easily be weaponized for abuse, and how to prevent and mitigate that harm through a specific design strategy of prioritizing our most vulnerable users. + +We’ll cover the domestic violence threat model and specific areas of concern: trouble with shared accounts, Internet-connected harm, location data, and surveillance. We'll also discuss what technologists can learn about authentic consent from the anti-sexual assault space. Finally, the audience will walk away with a high-level overview of implementing a practice of designing for safety into their everyday work. + + + Eva + + + + + + 2024-04-06T17:00:00+02:00 + 17:00 + 00:25 + HS i2 + glt24-425-more-than-a-dj-aura-das-freie-softwareprojekt-fr-freie-radiosender + https://pretalx.linuxtage.at/glt24/talk/9WTAQH/ + + + false + + more than a DJ - AURA, das freie Softwareprojekt für freie Radiosender + + Community + Vortrag + de + AURA ist eine freie Software-Suite für Radio-Automation. Gestaltet und entwickelt nach den Bedürfnissen von freien Radiosendern in Österreich und Deutschland, bietet AURA mit seiner modularen Architektur ein "Komplettlösung" für den Radiobetrieb. Das Projekt verwirklicht zudem das Prinzip "Community by Design" - Radiomacher:innen dürfen die Software von Anfang an testen und mitgestalten. Im Talk erfahrt ihr etwas über das Projekt, seine Architektur und erlebt AURA in einer hands-on Demo in Aktion. + Wolltest Du schon immer selbst "on air" gehen und Dein eigenes Radioprogramm gestalten? Freie Sender stehen vor der Herausforderung, dass Softwarelösungen für Radio-Programmverwaltung und -automation rar und teuer sind. Das Projekt AURA setzt ein Zeichen, dass es auch anders geht: AURA ist eine Open Source-Softwaresuite, die von Mitgliedern der freien Radios aus Graz, Linz, Wien, Innsbruck u.A. entwickelt wird. Nach dem „Baukastenprinzip“ können Funktionsmodule wie Playout, Aufnahme, Scheduling, Medienverwaltung, etc. kombiniert werden. Eine moderne und nutzer:innenfreundliche Weboberfläche macht die Programmverwaltung für die ganze Redaktion auch von zu Hause aus möglich. UX und Design von AURA werden in engem Austausch mit der Radio-Community entworfen und verbessert. +Mitglieder vom Aura-Team stellen das Projekt und seine Architektur vor. Anhand einer Kurz-Demo kann man AURA in Aktion sehen. Außerdem wird gezeigt, wie das Prinzip „Community by design“ im Aura-Projekt in der Planung und Gestaltung verwirklicht wird. + +Codebase & Homepage: https://aura.radio + /media/glt24/submissions/9WTAQH/aura-logo-color-trans_FsCSJuS.png + + Margarethe Maierhofer-Lischka + + + + + + 2024-04-06T17:30:00+02:00 + 17:30 + 00:25 + HS i2 + glt24-442-why-is-archiving-so-un-sexy-again-floss-archiving-tools-for-organisations + https://pretalx.linuxtage.at/glt24/talk/YY7R37/ + + + false + + Why is archiving so (un)sexy again? - FLOSS archiving tools for organisations + + Admin + Vortrag + en + For the unaware archiving seems boring and not so attractive, yet without archiving there would't be no Internet or Chat-GTP. The talk dismantles the urban legend of its dullness and presents outcomes of mur.at research into FLOSS tools for NGOs (and other organisations) to archive and document their projects. + Regardless of the experience, archiving seems for the unaware as not so attractive, even boring for the general public. And yet, without archiving there wouldn’t be no Internet. Indeed, without archiving there wouldn’t be no Chat-GTP… or even a Tabelle für die Bundesliga. + +To dismantle the urban legend of its dullness, we will get back to the roots of archiving in history before taking a look into Open Software and the possibilities it offers for archiving today. Thus, we will see how archiving is crucial to raise awareness about the present legacy of what we do—this being something alive (and kicking) that you will be able to re-use and expand. + +The talk sums up an ambitious endeavor by mur.at and Artist in Residence Ricardo Ginés (Tactical Tech Berlin) to collect FLOSS tools that NGOs and other organizations can use to better document and archive their projects. Local stakeholders from the arts & culture sector in Graz were interviewed as well as archiving experts from Tactical Tech Berlin, Ars Electronica Archive, ADA - Austrian Digital Art Archive, Stadtarchiv Graz and TU Graz to create hands-on guidelines that were further elaborated on in the mur-worklab 2023. + + + Andreas Zingerle + + + + + + 2024-04-06T18:00:00+02:00 + 18:00 + 00:25 + HS i2 + glt24-460-radfahren-und-wandern-mit-dem-osm-kartenmaterial-im-vergleich + https://pretalx.linuxtage.at/glt24/talk/HYXSAV/ + + + false + + Radfahren und Wandern mit dem OSM-Kartenmaterial im Vergleich + + Anwendung + Vortrag + de + Der Vortrag bietet einen Vergleich über verschiedene Kartendarstellungen und das Routing bei der Navigation mit Radfahr- und Wander-Apps. Dabei spielt ganz speziell auch das Kartenmaterial von OpenStreetMap eine Rolle. + + /media/glt24/submissions/HYXSAV/wanderkarten_oY8SB5v.jpg + + Martin Brunner + + + + + + + + + 2024-04-06T09:00:00+02:00 + 09:00 + 00:45 + HS i7 + glt24-466-die-demokratisierung-von-game-development-the-good-the-bad-and-the-ugly + https://pretalx.linuxtage.at/glt24/talk/Y88M7U/ + + + false + + Die Demokratisierung von Game Development - The Good, the Bad, and the Ugly + + Keynote + Vortrag lang + de + In diesem Vortrag diskutieren wir die vielschichtigen Effekte der Demokratisierung in der Spieleentwicklung, angefangen bei der Zugänglichkeit durch populäre Game Engines bis hin zu den Herausforderungen und Abhängigkeiten, die sich daraus ergeben und welche die Spieleindustrie 2023 mehr als nur bewegt hat. Wir stellen uns die Fragen: Wird die Spieleentwicklung nun auf Open Source-Lösungen umsteigen? Und welche Optionen stehen überhaupt zur Verfügung? Wir diskutieren das Potential von Open Source und Community-Beteiligung in der Game Development-Branche und reflektieren über mögliche Zukunftsszenarien. + + + + Johanna Pirker + + + + + + 2024-04-06T10:00:00+02:00 + 10:00 + 00:45 + HS i7 + glt24-453-wordpress-activitypub-eine-nachhaltige-identitt-im-web + https://pretalx.linuxtage.at/glt24/talk/EHAKHD/ + + + false + + WordPress ActivityPub – Eine nachhaltige Identität im Web + + Community + Vortrag lang + de + Mit dem **ActivityPub**-Protokoll kann eine **WordPress**-Seite direkt Interessierte erreichen und wird zu einem interaktiven Ort, an dem man mit dem gesamten Web kommunizieren kann. + +Als weiteres Beispiel, dass ActivityPub mehr kann als mittels Mastodon ein dezentrales Twitter zu bauen, wird anhand der Vision des **Calendiverse** vorgestellt. + Das [Fediverse](https://de.wikipedia.org/wiki/Fediverse#Kommunikationsprotokolle_und_Instanzen) bietet eine Alternative zu kommerziellen Sozialen Netzwerken. Aber Konten auf Plattformen anderer haben immer ein Probleme gemeinsam: egal ob es sich um Instagram oder einen Mastodon-Server handelt, die Betreiberinnen bestimmen die Rahmenbedingungen der Plattform, nicht du. + +Viele Fediverse-Anwendungen wie [Mastodon](https://joinmastodon.org/) entschärfen das Problem stark, indem sie es ermöglichen, mit einem Konto auf einen anderen Server umzuziehen (und deine Follower*innen mitzunehmen). + +Für Personen oder Organisationen mit einer WordPress-Seite gibt es jedoch eine noch nachhaltigere Alternative: mit Hilfe von [Plugins](https://wordpress.com/de/plugins/activitypub) wird deine Webseite direkt zu deiner Identität im Fediverse, es ist gar kein zusätzlicher Account auf z.B. einem Mastodon-Server mehr nötig. Das bedeutet auch, dass du keine zusätzliche Plattform bespielen musst, sondern Funktionalitäten wie Folgen und Gefolgt werden und Interaktionen, wie sie aus sozialen Netzwerken bekannt sind, wie Liken, Teilen, Kommentieren direkt mit deiner Website handhaben kannst. + +Durch eine in [Entwicklung befindliche Erweiterung](https://event-federation.eu/) wird es in Zukunft auch möglich sein, Veranstaltungen, die auf einer WordPress-Seite verwaltet werden, in dieses dezentrale Netzwerk einzubinden. Dadurch ergeben sich viele neue Möglichkeiten, auch über das Fediverse hinaus. + + + André Menrath + + + + + + 2024-04-06T11:00:00+02:00 + 11:00 + 00:25 + HS i7 + glt24-456-das-fediverse-grundlagen-und-eigenbetrieb-einer-instanz + https://pretalx.linuxtage.at/glt24/talk/MVUQB8/ + + + false + + Das Fediverse: Grundlagen und Eigenbetrieb einer Instanz + + Admin + Vortrag + de + Der Verein "graz.social – Verein zur Förderung ethischer Digitalkultur" präsentiert das Fediverse. Das Fediverse ist ein verteiltes soziales Netzwerk mit Apps wie Mastodon (Alternative zu Twitter), Peertube (Alternative zu youtube) und Pixelfed (Alternative zu Instagram). Es wird kurz und visuell auf die Besonderheiten dieses Netzwerks eingegangen und danach gezeigt, wie jede und jeder sich mit einem Server darin einbringen kann. In einer Fragerunde teilen Aktive von graz.social gerne ihre Erfahrung in der Moderation einer Instanz. + + + + Marcus Meindel + + + + + + 2024-04-06T11:35:00+02:00 + 11:35 + 00:25 + HS i7 + glt24-448-open-source-software-und-compliance-im-unternehmen-ein-sheriff-im-wilden-westen + https://pretalx.linuxtage.at/glt24/talk/GSVKTF/ + + + false + + Open Source Software und Compliance im Unternehmen: Ein Sheriff im Wilden Westen + + Sicherheit + Vortrag + de + Wenn wir uns vorstellen, dass OSS der Wilde Westen ist, können viele Dinge sehr frei gemacht und umgesetzt werden – jedoch auch zum Vorteil Einzelner und nicht zwingend im Interesse der Gemeinschaft. + +Um gewisse Grenzen und Rahmenbedingungen in der Prärie aufzuzeigen, wird im Wilden Westen ein Sheriff ernannt. In Unternehmen werden im OSS-Kontext Open Source Program Offices (OSPOs) als eigene Instanzen etabliert, um die Rahmenbedingungen der OSS-Nutzung zu definieren und die Interessen des Unternehmens und der Community zu schützen. + +In diesem Talk betrachten wir das WAS und das WIE der Etablierung eines OSPOs in Unternehmen und teilen Erfahrungen und Einblicke aus der Praxis. + Nachdem Unternehmen die tlw. strategische Entscheidung getroffen haben, Open Source Software einzusetzen, gilt es sicherzustellen, dass diese nicht willkürlich und unkontrolliert eingesetzt wird. +Ziel ist es, die Balance zwischen Unternehmenszielen und freier Software-Entwicklung herzustellen, um den technischen Fortschritt zu fördern, die Potenziale von OSS auszuschöpfen, und Compliance-Einhaltung sicherzustellen. + +Warum? +- Herausfordernd ist (1) die Einhaltung der komplexen und oftmals unübersichtlichen Rechte und Pflichten von Lizenz-Anforderungen, Identifikation von Lizenz-Inkompatibilitäten, Umgang mit Lizenz-Änderungen, oder die verpflichtende Anzeige von OSS-Lizenztexten. Zudem spielt (2) die Rückverfolgbarkeit von OSS-Komponenten entlang der Supply Chain eine Rolle und die verlässliche Erstellung einer Software Bill of Material. (3) Bei OSS ist aufgrund des öffentlichen Sourcecodes die Anzahl an gezielt gesuchten und gefundenen Vulnerabilities höher als bei proprietärer Software. +- Mögliche Konsequenzen von Lizenz-Verstößen beinhalten Rechtsstreitigkeiten, Vertragsbrüche, Reputationsverluste, Produktrückrufe, Blacklisting,… + +Was? +- Häufig wird eine eigene interdisziplinäre Instanz – ein Open Source Program Office – im Unternehmen etabliert +- Die Lizenz.Konformität und Compliance von Produkten wird vor Release sichergestellt. + +Wie? +- Die Aspekte Prozesse, Methoden, Tools, Organisationsstrukturen werden betrachtet und OSS-Compliance-Standards dahingehend etabliert. +- Die rechtlichen Anforderungen werden aufgenommen und in die technischen Entwicklungsprozesse und in die CI/CD und Build Pipleline integriert. +- Einführung von standardisierten Formaten wie SPDX, CycloneDX,…, um eine unternehmensübergreifende Zusammenarbeit sicherzustellen. + +Was kann da noch schief laufen? +- Prozesse können den Time-to-market verlängern und den Entwicklungsprozess verlangsamen, wenn wichtige Prozessschritte nicht korrekt verortet sind. +- Tools: Nach dem Motto ”A fool with a tool is still a fool” ist eine Tooleinführung nicht inhärent eine Produktivitätssteigerung. +- Organisationsstrukturen: Organizational Change durch Veränderung von Verantwortlichkeiten, Veränderung bestehender Job-Descriptions, Bürokratien,…. + +Was erwartet uns im Vortrag? +- Einblicke und Erfahrungen aus der Praxis in der Etablierung eines OSPOs in Unternehmen + + + Birgit BrandstetterNepomuk Trauttmansdorff + + + + + + 2024-04-06T12:10:00+02:00 + 12:10 + 00:45 + HS i7 + glt24-463--sponsor-running-air-gapped-vm-updates-on-scale + https://pretalx.linuxtage.at/glt24/talk/9WZ8AN/ + + + false + + [SPONSOR] Running air-gapped VM updates on scale + + Admin + Vortrag lang + de + Der Vortrag behandelt die Herausforderungen und Lösungen für das automatisierte Erstellen von virtuellen Maschinen (VMs) und Aktualisieren in abgeschotteten Umgebungen. Es werden effektive Strategien und Tools zur Verwaltung von Updates in solchen Umgebungen vorgestellt. Der Fokus liegt auf Skalierbarkeit und Effizienz, um große VM-Bestände zuverlässig zu aktualisieren um Einheitlichkeit und Sicherheit zu garantieren. Die Präsentation gibt Einblicke in ausgewählte Praktiken, Technologien und Automatisierungstools, die es ermöglichen, abgeschottete VMs mittels image-basiertem Update zu aktualisieren. + Erfahren Sie in diesem Vortrag mehr über das innovative Caretaker-Projekt der NTS Netzwerk Telekom Service AG. Der Caretaker ist ein leistungsstarkes Remote Monitoring & Management (RMM)-System, das auf Ubuntu und Kubernetes basiert. Als virtuelle Maschine in Kundeninfrastrukturen bereitgestellt, überwacht und überprüft der Caretaker automatisch die Gesundheit und Leistung der IT-Systeme. Insbesondere wird darauf eingegangen, wie das Image für die VM strukturiert ist und wie automatisierte Updates des Betriebssystems ermöglicht werden. Tauchen Sie ein in die Welt des Caretakers und erfahren Sie, wie er NTS ermöglicht eine große Anzahl an VMs automatisiert und skalierbar zu aktualisieren. + /media/glt24/submissions/9WZ8AN/Untitled_XSzf0g3.png + + Fabian Lichtenegger-LukasRoland Urbano + + + + + + 2024-04-06T13:05:00+02:00 + 13:05 + 00:25 + HS i7 + glt24-421-infrastructure-as-code-and-ai-does-it-fit- + https://pretalx.linuxtage.at/glt24/talk/N73FQV/ + + + false + + Infrastructure as Code and AI - does it fit? + + Admin + Vortrag + en + AI combined with cloud computing and infrastructure as a code - does that fit? Yes, indeed! + +Are you curious how the GitHub Copilot could support you in implementing 'Infrastructure as Code' to deploy resources on Azure in an automated way? +This talk reveals my approach to using the AI pair programming tool. Starting from scratch, I will create a working Terraform configuration that can deploy a Kubernetes cluster on Azure, by just providing comments. +What could good practice for that look like? +It shall prove that AI speeds up your development speed and works well for infrastructure as code approaches. + + + + Patrick Koch + + + + + + 2024-04-06T14:00:00+02:00 + 14:00 + 00:45 + HS i7 + glt24-450-2023-s-top-cyber-threats + https://pretalx.linuxtage.at/glt24/talk/VBSVW9/ + + + false + + 2023's Top Cyber Threats + + Sicherheit + Vortrag lang + de + Einige Mitglieder des CTF-Teams, LosFuzzys, stellen Exploits aus dem vergangenen Jahr vor, diskutieren deren Auswirkungen und zeigen Lösungsansätze. + +Der Vortrag richtet sich an Menschen, die sich für Informationssicherheit interessieren. + + /media/glt24/submissions/VBSVW9/logo_losfuzzys_150_v8NxxK9.png + + Markus OstermayerKevin SaigerMarcell Haritopoulus + + + + + + 2024-04-06T15:00:00+02:00 + 15:00 + 00:45 + HS i7 + glt24-462-gpio-development-mit-dem-raspberry-pi + https://pretalx.linuxtage.at/glt24/talk/YFYM3H/ + + + false + + GPIO Development mit dem Raspberry Pi + + Hardware + Vortrag lang + de + Zuerst gibt es ein Update zum aktuellen Status des 'Raspberry Pi'. Welche neuen Modelle gibt es und was hat sich im allgemeinen im Softwarebereich getan? +Viele beliebte GPIO-Libraries wurden in letzter Zeit nicht mehr aktiv weiterentwickelt - was bedeutet das für den Endanwender? Welche Vor- und Nachteile bringt die allgemeine GPIO-Library libgpiod. +Im zweiten Teil des Vortrags wird für professionelle Entwickler demonstriert wie man sich mit profiling und debugging Tools tiefgreifend die Performance der Library analysieren kann. + Die letzten Jahre waren schwierig für Raspberry Pi Fans, Lieferkettenprobleme machten es kaum möglich, die aktuellen Modelle zu erwerben, während gleichzeitig die Gebrauchtpreise in die Höhe schossen. +Zum Glück hat sich die Lage stark verbessert und die neuen Modelle "Zero 2 W" und "Raspberry Pi 5" sind bei den meisten Shops nun lieferbar.  +Auch Raspberry Pi OS setzt mittlerweile auf Debian Bookworm - und damit den Linux Kernel in Version 6. Dazu gab es auch einige Änderungen, die wir uns im Vortrag ansehen. +Einen großen Einfluss gab es bei den GPIO Librarys. Sie scheinen fast alle nicht mehr aktiv unterstützt zu werden, denn libgpiod ist gekommen um sie alle abzulösen. Doch wie ist die Geschwindigkeit der universellen Library gegenüber der alten? +Im zweiten Teil wird mittels debugging und profiling Tools die API und Performance von libgpiod ganz genau unter die Lupe genommen. + + + Martin StrohmayerManfred Wallner + + + + + + 2024-04-06T16:00:00+02:00 + 16:00 + 00:45 + HS i7 + glt24-464-shepherding-software-dependencies + https://pretalx.linuxtage.at/glt24/talk/DXJLMZ/ + + + false + + Shepherding Software Dependencies + + Sicherheit + Vortrag lang + en + The number of external dependencies in today's software has grown steadily over the years. With all these dependencies come bugs and security issues. Like a flock of sheep, it can be difficult to keep track of them all, take care of their needs, and leave no one behind. + +In this talk, I'll present solutions for software composition analysis and dependency management using free and open source tools. Afterwards, I hope you will be convinced that this is something everyone should consider in their software projects, because it is relatively easy to get started, and it will make your life easier in the long run. + The number of external dependencies in today's software has grown steadily over the years. With all these dependencies come bugs and security issues. Like a flock of sheep, it can be difficult to keep track of them all, take care of their needs, and leave no one behind. + +In this talk, I'll present solutions for software composition analysis and dependency management using free and open source tools. Afterwards, I hope you will be convinced that this is something everyone should consider in their software projects, because it is relatively easy to get started, and it will make your life easier in the long run. + +I will demonstrate how to create a *Software Bill Of Material (SBOM)* at build time using the *OWASP CycloneDX* tools. To further analyze the SBOM, I will demonstrate the use of *OWASP Dependency Track*. I will also demonstrate the use of *Renovate* to help maintainers keep up with dependency updates. To run all these tools in a CI/CD environment, I use *GitLab*. + +- CycloneDX: https://cyclonedx.org/ +- Dependency Track: https://dependencytrack.org/ +- Renovate: https://www.mend.io/renovate-free/ +- GitLab: https://about.gitlab.com/ + + + Michael GissingTobias Kulmburg + + + + + + 2024-04-06T17:00:00+02:00 + 17:00 + 00:25 + HS i7 + glt24-423-gizual-browser-based-git-repository-visualisation-with-webassembly-and-web-workers + https://pretalx.linuxtage.at/glt24/talk/VSQXGS/ + + + false + + Gizual: Browser-Based Git Repository Visualisation with WebAssembly and Web Workers + + Anwendung + Vortrag + en + This talk presents Gizual, a cutting-edge open-source web application +for visualising and interacting with Git code repositories. It +leverages the power of web workers, WebAssembly, and a combination of +optimisation techniques to run a Git visualisation locally in the web +browser. The talk will look at some of the technical challenges which +were overcome, including strategies to minimise memory footprint, +implement performant file operations, and distribute workload using +web workers and SharedArrayBuffers. + This talk presents Gizual, a cutting-edge open-source web application, +which reimagines Git code repository visualisation and interaction in +the spirit of SeeSoft [1]. The Gizual user interface uses a zoomable +timeline component for detailed navigation through the commit history +of a repository. A zoomable visual overview is then provided for a +specified (sub)set of files for the chosen commit, which is +colour-coded by metrics such as age of line of code, or author of line +of code. Pre-generated preview images and a pool of web workers are +used for enhanced performance. Overview statistics such as +contribution charts are also provided. + +Beneath the user interface, Gizual exploits the bleeding edge of +WebAssembly (WASM) to run performant Git operations directly in the +browser. The WebAssembly System Interface (WASI) [2] is used to run +libgit2 [3], together with various custom implementations for +efficient file i/o and git index parsing. + +The talk will cover Gizual's innovative approaches to interaction and +visualisation, and some of the technical challenges which were +overcome, including strategies to minimise memory footprint, implement +performant file operations, and distribute workload using web workers +and SharedArrayBuffers. It will conclude with a look at ongoing and +potential future work. + +[1] https://doi.org/10.1109/32.177365 +[2] https://wasi.dev/ +[3] https://github.com/libgit2/libgit2 + /media/glt24/submissions/VSQXGS/screenshot1080_rCP3HHw.png + + Andreas SteinkellnerStefan SchintlerKeith Andrews + + + + + + 2024-04-06T17:30:00+02:00 + 17:30 + 00:45 + HS i7 + glt24-457-zephyr-ein-open-source-realtime-embedded-os + https://pretalx.linuxtage.at/glt24/talk/TVG9ES/ + + + false + + Zephyr - Ein Open Source Realtime Embedded OS + + Entwicklung + Vortrag lang + de + Embedded Geräte sind Geräte mit sehr geringen Resourcen wie zum Beispiel Speicher und CPU. +Meist verrichten diese unbemerkt ihre Arbeit. +Bei der Entwicklung von Embedded Geräten gibt es viele Herausvorderungen. +Geringe Resourcen, Schnittstellen zu Sensoren, Schnittstellen zur Außenwelt (Bluteooth, Ethernet), Updatefähigkeit... +Hier können Embedded Betriebssysteme wie Zephyr die Entwicklung vereinfachen und beschleunigen. + Embedded Geräte sind Geräte mit sehr geringen Resourcen wie zum Beispiel Speicher und CPU. +Meist verrichten diese unbemerkt ihre Arbeit. +Bei der Entwicklung von Embedded Geräten gibt es viele Herausvorderungen. +Geringe Resourcen, Schnittstellen zu Sensoren, Schnittstellen zur Außenwelt (Bluteooth, Ethernet), Updatefähigkeit, ... + +Hier können Embedded Betriebssysteme wie Zephyr die Entwicklung vereinfachen und beschleunigen. +Der Vortrag liefert eine kurze Übersicht über Zephyr. Welche Vor- und Nachteile es gibt, welche Hardware unterstützt wird und einen Vergleich mit anderen RTOS Systemen wie bzw. FreeRTOS. +Anschließend wird anhand einer kleinen Beispielapplikation die Möglichkeiten von Zephyr demonstriert und das Konzept des Devicetrees vorgestellt. +Dies ermöglicht eine leichtere Portierbarkeit auf eine andere Plattform. + + + Bernd Bauer + + + + + + + + + 2024-04-06T09:30:00+02:00 + 09:30 + 02:30 + Seminarraum ISW + glt24-486-lpi-prfung + https://pretalx.linuxtage.at/glt24/talk/JSYMYC/ + + + true + + LPI Prüfung + + Prüfung + Prüfung + de + LPI exams + Ermäßigte Prüfungen! +Die Prüfungen werden mit einem Community-Rabatt angeboten und kosten 85 EUR jede Essentials Prüfung und 140 EUR jede Professional Prüfung. + +Kandidaten können die Prüfungen Linux Essentials, Security Essentials, Web Development Essentials, LPIC-1 und LPIC-2 auf Englisch und Deutsch ablegen. Open Source Essentials, LPIC-3, DevOps Tools Engineer und BSD Specialist sind nur auf Englisch verfügbar. + +Daher bitten wir Kandidaten, sich für die Veranstaltung zu registrieren unter: https://www.lpi.org/exam-registration/. + +Kurzentschlossene sind ebenfalls herzlich willkommen! + +So nehmen Sie an den Prüfungssitzungen teil +Die Kandidaten müssen 15 Minuten vor Prüfungsbeginn im Prüfungsraum sein und einen amtlichen Lichtbildausweis (Reisepass, Personalausweis oder Führerschein), ihren LPI-Ausweis und die Prüfungsgebühr in bar mitbringen. + + + LPI + + + + + + 2024-04-06T14:30:00+02:00 + 14:30 + 02:30 + Seminarraum ISW + glt24-485-lpi-prfung + https://pretalx.linuxtage.at/glt24/talk/9ZNCMP/ + + + true + + LPI Prüfung + + Prüfung + Prüfung + de + LPI Exams + Ermäßigte Prüfungen! +Die Prüfungen werden mit einem Community-Rabatt angeboten und kosten 85 EUR jede Essentials Prüfung und 140 EUR jede Professional Prüfung. + +Kandidaten können die Prüfungen Linux Essentials, Security Essentials, Web Development Essentials, LPIC-1 und LPIC-2 auf Englisch und Deutsch ablegen. Open Source Essentials, LPIC-3, DevOps Tools Engineer und BSD Specialist sind nur auf Englisch verfügbar. + +Daher bitten wir Kandidaten, sich für die Veranstaltung zu registrieren unter: https://www.lpi.org/exam-registration/. + +Kurzentschlossene sind ebenfalls herzlich willkommen! + +So nehmen Sie an den Prüfungssitzungen teil +Die Kandidaten müssen 15 Minuten vor Prüfungsbeginn im Prüfungsraum sein und einen amtlichen Lichtbildausweis (Reisepass, Personalausweis oder Führerschein), ihren LPI-Ausweis und die Prüfungsgebühr in bar mitbringen. + + + LPI + + + + + + + + + 2024-04-06T09:00:00+02:00 + 09:00 + 09:00 + HS i3 + glt24-445-mini-froglabs + https://pretalx.linuxtage.at/glt24/talk/9HD9CW/ + + + true + + Mini-FrogLabs + + + Workshop (3,5h) + de + Workshops rund um Technik, Coding und freie Software für Kinder und Jugendliche zwischen 9 und 15 Jahre + # Was sind die Mini-FrogLabs? + +Interessierst du dich für Informatik und Programmieren? Hast du Spaß daran, mit Elektronik zu experimentieren? + +Die FrogLabs sind ein Workshop-Programm für Kinder und Jugendliche von etwa 9 bis 16 Jahren, bei dem du gemeinsam mit Anderen in deinem Alter an spannenden Projekten aus den Bereichen Informatik und Technik basteln, forschen und lernen kannst. + +Du verbringst den Tag in einer Gruppe von vielen Schülerinnen und Schülern, die dieselben Interessen teilen wie du. Bei den Mini-FrogLabs handelt es sich nur um ein Tagesprogramm ohne Übernachtung. + +Die FrogLabs finden immer zusammen mit so genannten Open-Source-Konferenzen statt. Das sind Treffen, bei denen sich viele Leute über Themen wie freie Software, Programmierung, Sicherheit und vieles mehr austauschen. Die FrogLabs stammen ursprünglich von der FrOSCon, der Konferenz mit dem wohl umfangreichsten Kinder- und Jugendprogramm in Deutschland. + +Die Mini-FrogLabs sind eine kleine Variante, bei der "nur" Workshops stattfinden, aber kein Rahmenprogramm mit Übernachtung und ähnlichem. + +# Termin und Ort + +Dieses Mal finden die Mini-FrogLabs am 6. April 2024 von 11 bis 17 Uhr auf den Grazer Linux-Tagen in Graz (in der Technischen Universität) statt. + +# Workshopthemen + +Die Workshops, die dich bei den FrogLabs erwarten, richten sich an alle Teilnehmerinnen und Teilnehmer gleichermaßen. Egal, ob du schon viel über das Thema weißt oder sogar schon einmal bei den FrogLabs warst. Unser Ziel ist es, dass bei den Workshops jeder gleich viel Spaß haben kann und gleich viel beitragen kann. + +Für alle, die schon einmal da waren: Alle neuen und auch alten Teilnehmer bekommen die Möglichkeit, sich in verschiedenen Themen zu beschäftigen. Auch Teilnehmer, die schon öfter bei den FrogLabs waren, werden sich nicht langweilen. + +Dieses Jahr in Graz bieten wir zwei Workshops an: + +* Spiele programmieren mit Python und Pygame +* Elekronik und Mikrocontroller mit Python (LED-Animationen) + +# Anmeldung und Kosten + +Die Teilnahme kostet regulär 40 €. Uns ist aber wichtig, dass alle Interessierten mitmachen können. Bitte kontaktiert uns, falls ihr weniger bezahlen möchtet. + +**Alle Kinder, die teilnehmen möchten, müssen sich selber (gerne mit Hilfe ihrer Eltern) bei Teckids registrieren.** + +Alle weiteren Informationen und die Anmeldung gibt es [im Anmeldesystem des Teckids e.V.](https://ticdesk.teckids.org/app/paweljong/event/froglabs-2024-glt/). Dort sind auch Kontaktdaten für Fragen hinterlegt. + +**Sollte es bei der Anmeldung Schwierigkeiten geben, kontaktiert uns bitte per E-Mail oder Telefon.** + + + Dominik GeorgeMartin Winter + + + + + + + + + + From 8c163b301bae67c6f588e1f66a66c3c8e6cc3a41 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Fri, 5 Apr 2024 10:06:13 +0200 Subject: [PATCH 06/26] glt24: use live schedule --- glt24/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/glt24/__init__.py b/glt24/__init__.py index ba2bf47..8e380b0 100644 --- a/glt24/__init__.py +++ b/glt24/__init__.py @@ -5,8 +5,8 @@ from schedulelib import * from easing import * # URL to Schedule-XML -#scheduleUrl = 'https://pretalx.linuxtage.at/glt24/schedule.xml' -scheduleUrl = 'file:/home/sophie/coding/voc/intro-outro-generator/glt24/schedule__2024-03-25_16-57-04.xml' +scheduleUrl = 'https://pretalx.linuxtage.at/glt24/schedule.xml' +#scheduleUrl = 'file:/home/sophie/coding/voc/intro-outro-generator/glt24/schedule__2024-03-25_16-57-04.xml' def introFrames(args): #fade in tux and set other opacities to 0 From 3ae90b87c0a776fe1949dcf34807c8e8f25a9fc5 Mon Sep 17 00:00:00 2001 From: derpeter Date: Fri, 3 May 2024 11:53:27 +0200 Subject: [PATCH 07/26] added osmodevcon24 --- osmodevcon24/__init__.py | 148 +++ osmodevcon24/artwork/background.svg | 946 +++++++++++++++++ osmodevcon24/artwork/intro.svg | 1372 +++++++++++++++++++++++++ osmodevcon24/artwork/outro.svg | 1479 +++++++++++++++++++++++++++ osmodevcon24/artwork/pause.svg | 1208 ++++++++++++++++++++++ 5 files changed, 5153 insertions(+) create mode 100644 osmodevcon24/__init__.py create mode 100644 osmodevcon24/artwork/background.svg create mode 100644 osmodevcon24/artwork/intro.svg create mode 100644 osmodevcon24/artwork/outro.svg create mode 100644 osmodevcon24/artwork/pause.svg diff --git a/osmodevcon24/__init__.py b/osmodevcon24/__init__.py new file mode 100644 index 0000000..4264294 --- /dev/null +++ b/osmodevcon24/__init__.py @@ -0,0 +1,148 @@ +#!/usr/bin/python3 + +from renderlib import * +from schedulelib import * +from easing import * + +# URL to Schedule-XML +scheduleUrl = 'https://pretalx.sysmocom.de/osmodevcon2024/schedule/export/schedule.xml' + +def introFrames(args): + #fade in title + frames = 3*fps + for i in range(0, frames): + yield( + ('title', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), + ) + # fade in subtitle and names + frames = 1*fps + for i in range(0, frames): + yield( + ('title', 'style', 'opacity', 1), + ('subtitle', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), + ('personnames', 'style', 'opacity', easeInQuad(i, 0, 1, frames)), + ) + #show whole image for 2 seconds + frames = 2*fps + for i in range(0, frames): + yield( + ('title', 'style', 'opacity', 1), + ('personnames', 'style', 'opacity', 1), + ('subtitle', 'style', 'opacity', 1), + ) + +def backgroundFrames(parameters): + frames = 5*fps + for i in range(0, frames): + yield( + ('logo', 'style', 'opacity', 1), + ) + +def outroFrames(args): + frames = 2*fps + for i in range(0, frames): + yield( + ('logo', 'style', 'opacity', 1), + ('sublogo', 'style', 'opacity', 1), + ('cclogo', 'style', 'opacity', 1), + ) + # fade out + frames = 3*fps + for i in range(0, frames): + yield( + ('logo', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -1, frames)), + ('sublogo', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -1, frames)), + ('cclogo', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -1, frames)), + ) + +def pauseFrames(args): + #fade in pause + frames = 4*fps + for i in range(0, frames): + yield( + ('pause', 'style', 'opacity', "%.4f" % easeInCubic(i, 0.2, 1, frames)), + ) + + # fade out + frames = 4*fps + for i in range(0, frames): + yield( + ('pause', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -0.8, frames)), + ) + +def debug(): + render('intro.svg', + '../intro.ts', + introFrames, + { + '$id': 7776, + '$title': 'Configuring + running GPRS/EDGE data services with OsmoPCU, OsmoSGSN and OpenGGSN', + '$subtitle': 'With some subtitle!', + '$personnames': 'Alexander Chemeris + Harald Welte' + } + ) + + render('outro.svg', + '../outro.ts', + outroFrames + ) + + render( + 'background.svg', + '../background.ts', + backgroundFrames + ) + + render('pause.svg', + '../pause.ts', + pauseFrames + ) + + +def tasks(queue, args, idlist, skiplist): + # iterate over all events extracted from the schedule xml-export + for event in events(scheduleUrl): + if not (idlist==[]): + if 000000 in idlist: + print("skipping id (%s [%s])" % (event['title'], event['id'])) + continue + if int(event['id']) not in idlist: + print("skipping id (%s [%s])" % (event['title'], event['id'])) + continue + + # generate a task description and put them into the queue + queue.put(Rendertask( + infile = 'intro.svg', + outfile = str(event['id'])+".ts", + sequence = introFrames, + parameters = { + '$id': event['id'], + '$title': event['title'], + '$subtitle': event['subtitle'], + '$personnames': event['personnames'] + } + )) + + # place a task for the outro into the queue + if not "out" in skiplist: + queue.put(Rendertask( + infile = 'outro.svg', + outfile = 'outro.ts', + sequence = outroFrames + )) + + # place the pause-sequence into the queue + if not "pause" in skiplist: + queue.put(Rendertask( + infile = 'pause.svg', + outfile = 'pause.ts', + sequence = pauseFrames + )) + + # place the background-sequence into the queue + if not "bg" in skiplist: + queue.put(Rendertask( + infile = 'background.svg', + outfile = 'background.ts', + sequence = backgroundFrames + )) diff --git a/osmodevcon24/artwork/background.svg b/osmodevcon24/artwork/background.svg new file mode 100644 index 0000000..3a87e75 --- /dev/null +++ b/osmodevcon24/artwork/background.svg @@ -0,0 +1,946 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + Pause Pause + o + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/osmodevcon24/artwork/intro.svg b/osmodevcon24/artwork/intro.svg new file mode 100644 index 0000000..2a8b797 --- /dev/null +++ b/osmodevcon24/artwork/intro.svg @@ -0,0 +1,1372 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + Pause Pause $title $personnames $subtitle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/osmodevcon24/artwork/outro.svg b/osmodevcon24/artwork/outro.svg new file mode 100644 index 0000000..1fbdc0e --- /dev/null +++ b/osmodevcon24/artwork/outro.svg @@ -0,0 +1,1479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + Pause Pause + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/osmodevcon24/artwork/pause.svg b/osmodevcon24/artwork/pause.svg new file mode 100644 index 0000000..e8d1e7b --- /dev/null +++ b/osmodevcon24/artwork/pause.svg @@ -0,0 +1,1208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + Pause Pause + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 848b72b1136d5159313ae1c97df50d157065a092 Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sun, 1 Sep 2024 16:36:15 +0200 Subject: [PATCH 08/26] schedulelib: Ignore missing track field According to the XML schema, the "track" field of an event is not mandatory. So we should replace it with an empty string if not existing like we do for other fields. --- schedulelib.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/schedulelib.py b/schedulelib.py index 340e4d8..a986498 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 and event.find('track').text 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 } From c94b840807af952210a23acd56a8641e34ff3189 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 19 Oct 2024 10:29:06 +0200 Subject: [PATCH 09/26] vcfb24 --- vcfb24/__init__.py | 148 + vcfb24/artwork/Computerfont.ttf | Bin 0 -> 39104 bytes vcfb24/artwork/intro.svg | 15584 ++++++++++++++++++++++++++++++ vcfb24/artwork/lower-third.svg | 6231 ++++++++++++ vcfb24/artwork/outro.svg | 1668 ++++ vcfb24/artwork/pause.svg | 6626 +++++++++++++ 6 files changed, 30257 insertions(+) create mode 100644 vcfb24/__init__.py create mode 100644 vcfb24/artwork/Computerfont.ttf create mode 100644 vcfb24/artwork/intro.svg create mode 100644 vcfb24/artwork/lower-third.svg create mode 100644 vcfb24/artwork/outro.svg create mode 100644 vcfb24/artwork/pause.svg diff --git a/vcfb24/__init__.py b/vcfb24/__init__.py new file mode 100644 index 0000000..1297300 --- /dev/null +++ b/vcfb24/__init__.py @@ -0,0 +1,148 @@ +#!/usr/bin/python3 + +from renderlib import * +from easing import * +import math + +# URL to Schedule-XML +scheduleUrl = 'http://vcfb.de/2024/schedule.xml' + +# For (really) too long titles +titlemap = { + #708: "Neue WEB-Anwendungen des LGRB Baden-Württemberg im Überblick" +} +personmap = { +} + +taglinemap = { +} + +def outroFrames(p): + frames = 2*fps + for i in range(0, frames): + yield ( + ('logo', 'style', 'opacity', "%.4f" % easeInCubic(i, 0, 1, frames)), + ('plate', 'style', 'opacity', 0), + ) + + frames = 1*fps + for i in range(0, frames): + yield ( + ('logo', 'style', 'opacity', 1), + ('plate', 'style', 'opacity', "%.4f" % easeInCubic(i, 0, 1, frames)), + ) + + frames = 2*fps + for i in range(0, frames): + yield ( + ('logo', 'style', 'opacity', 1), + ('plate', 'style', 'opacity', 1), + ) + +def introFrames(p): + frames = math.floor(1.5*fps) + for i in range(0, frames): + yield ( + ('header', 'attr', 'y', 659), + ('text', 'style', 'opacity', 0), + ) + + frames = 1*fps + for i in range(0, frames): + yield ( + ('text', 'style', 'opacity', "%.4f" % easeInCubic(i, 0, 1, frames)), + ) + + frames = math.ceil(3.5*fps) + for i in range(0, frames): + yield ( + ('text', 'style', 'opacity', 1), + ) + +def pauseFrames(p): + pass + + +def debug(): + render( + 'intro.svg', + '../intro.ts', + introFrames, + { + '$id': 6526, + '$title': 'Besser steuern durch Daten? - Zur Performativität soziotechnischer Systeme und der Quantifizierung der sozialen Welt', + '$subtitle': '', + '$personnames': 'Judith Hartstein und Anne K. Krüger' + } + ) + + #render( + # 'outro.svg', + # '../outro.ts', + # outroFrames + #) + + # render('pause.svg', + # '../pause.ts', + # pauseFrames + # ) + +def tasks(queue, params, idlist, skiplist): +# # iterate over all events extracted from the schedule xml-export + for event in events(scheduleUrl): + if not (idlist==[]): + if 000000 in idlist: + print("skipping id (%s [%s])" % (event['title'], event['id'])) + continue + if int(event['id']) not in idlist: + print("skipping id (%s [%s])" % (event['title'], event['id'])) + continue + + # generate a task description and put them into the queue + if int(event['id']) not in skiplist: + queue.put(Rendertask( + infile = 'intro.svg', + outfile = str(event['id'])+".ts", + sequence = introFrames, + parameters = { + '$id': event['id'], + '$title': event['title'], + '$subtitle': event['subtitle'], + '$personnames': event['personnames'] + } + )) + +# for person in persons(scheduleUrl, personmap, taglinemap, event['id']): +# queue.put(Rendertask( +# infile = 'lower-third.svg', +# outfile = 'event_{}_person_{}.png'.format(str(event['id']), str(person['id'])), +# parameters = { +# '$PERSON': person['person'], +# '$TAGLINE': person['tagline'], +# } +# )) +# +# queue.put(Rendertask( +# infile = 'lower-third.svg', +# outfile = 'event_{}_persons.png'.format(str(event['id'])), +# parameters = { +# '$PERSON': event['personnames'], +# '$TAGLINE': '', +# } +# )) +# + # place a task for the outro into the queue + if not "out" in skiplist: + queue.put(Rendertask( + infile = 'outro.svg', + outfile = 'outro.ts', + sequence = outroFrames + )) + + # place the pause-sequence into the queue + #if not "pause" in skiplist: +# queue.put(Rendertask( +# infile = 'pause.svg', +# outfile = 'pause.ts', +# sequence = pauseFrames +# )) diff --git a/vcfb24/artwork/Computerfont.ttf b/vcfb24/artwork/Computerfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..49f1c620b548e3abd34cf3bd8f0fd73b86b0199e GIT binary patch literal 39104 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 t$7M|iaL9Jihb8(a1-FAkt^f{5b~am)i + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + $subtitle $title  $personnames + diff --git a/vcfb24/artwork/lower-third.svg b/vcfb24/artwork/lower-third.svg new file mode 100644 index 0000000..a70d3b4 --- /dev/null +++ b/vcfb24/artwork/lower-third.svg @@ -0,0 +1,6231 @@ + + + +$PERSON diff --git a/vcfb24/artwork/outro.svg b/vcfb24/artwork/outro.svg new file mode 100644 index 0000000..45f706d --- /dev/null +++ b/vcfb24/artwork/outro.svg @@ -0,0 +1,1668 @@ + + + + + + + + + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  +More Recordings available on media.ccc.de + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vcfb24/artwork/pause.svg b/vcfb24/artwork/pause.svg new file mode 100644 index 0000000..8ef961c --- /dev/null +++ b/vcfb24/artwork/pause.svg @@ -0,0 +1,6626 @@ + + + +image/svg+xmlPause + \ No newline at end of file From 367e8ea0949bb254bcea57b8425721678dd6de73 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 19 Oct 2024 10:33:17 +0200 Subject: [PATCH 10/26] re-add jugendhackt source gimp file --- jugendhackt/source.xcf | Bin 0 -> 1184118 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 jugendhackt/source.xcf diff --git a/jugendhackt/source.xcf b/jugendhackt/source.xcf new file mode 100644 index 0000000000000000000000000000000000000000..e01939dc62127939a660fe71c69b329289fafa57 GIT binary patch literal 1184118 zcmeFa3t*L3mFWMSydUI6!n;5S@3v4{YE`C`sHihKz6VF0s>K#)TA;P1wmSD39IL}P z!&qlzyv${$ft+)Yv_2}>4mSu0S49je1xq34ga%6*8VhM{2uaTQ_W!rm{=W0b3+S{} z|F^U`d+)W^eyzQ}wbovHednyGS#@{i1Gg@({M@{2uXP+Jcdg@Oy@ibY`#1i|_zML1 zDCaNl?GHJQ{PC}XzbyVndw-G_yitymafq~Z1zpdnS+#V) z)~sGpdF?z(pHC}!g*o@Fu31xAv-;NCm)$EZ?pnV5-eqel6+b0!v+2k(=ZchdtXj5a z>1|8bEcMnBIDO-y2Ue}D{M@p8?yb3N^}?Cg&Yd^2a@p!z@4AgCEu6XJuiiE1Ei)J0 zRB)r;@TP*w${W`#T~WDu>8fQ5tKRuQ&GNZ_Atajn_L?>KesI}6A6dHU?v=}`ZhA{4 z|J`^Es6#i=hJU$i^@=sOSKV~&ytmA|6#T!gxlPgEdfmm)KX6aYvej#ru3=?#f04dF zyo~+4PjHt&?W&uuy9oZrk`1bEdh>PHT&(|(Uo!p&Z@+8JU31?dJoOQH16mH+_s3S< zJ$Fsb^5t^}UFMC~BzH_UJLO;I&9+ec8=HPlm>t&s^4pGX!GtCxQHm-Wv!t$oZ(f8?bg+FO&5CQxBaaxzdLTz zzr4|=@4LsQf93V}$xK_m?OvO%T4dAvL@x60e?Di^+Ie33Aum<=;5fCP^~zuJ(rzLZCk256qf7!L}UMF*{smvOt13@vSIt8UP zvzi%HyQT9os@=*`KIZu-l^NA$9@ChYxwq7Z-IB4_JY=T^Y_FM@(p7b)p(bVWiB>+W zGIMPLR-Lid+%nJaH@&3z)K!~Ozkf<8qb1tud~9if-l(PH{2%BAyBg_Wu zI>QDW*#+Ux6okzYNylGyt$QY%dBi-HHB1MBV$7}-lt(jnF@s(1qfcb)avyt?k0*ST z$1--ACz!?)nP*CU*nx~Q=4m@MU}ww|DP6G`YEmYjXywBm%RG{R?aDY}4$SlWO)n`v zb-T=?e*ctGMoYBQ`Pk9|zc0Ua3N64$DP@JdC!oc&L5>zSpskw?IM)W@y9-*(IZ4M~ zcCFjpl6lUY${MBvK{2K+1?8E{HfGS~KJ#own|taRKA!baPGz*2XPL&cncby6?D>pt z^P-&^ux|5gN>?m~nv}^WTKTY3ndcI)wv2P;`FVc7=_SRduFX8-_fIKhv_w0dk1Z|m z`|?|-&;pE2SA~rgJ?>r}WRXgyy2LSi*@?AO0J}(awqtI|SnF2v z_$9gs$a7tt&C};rrt}0Vr9djCwlix%wbD=rML1bhcP+xmotF?+wDfV2Tc(n!A*C#? zS0Y0~tr$T|D=RE&?J@c4hO}yN{*x1S+LKDyFtGM?ke=SO-Na zT2%K4QqX-OAtgn&c(@2m^B7Y@JX&0HglQ)bbP-IRx~CDE2dEQab%22oWR$2|pr3y0 z@hZTmK}=o}%=WI!OSH8xof|L&s2$0l1u#2$%B*c$ME77lC19$f{2ie?NN#q~bO3?1 z0u>>}0KE#~=*b8Z^~C(%VfBw1TF z^2R-t(i5nZ0;!nV&YT0)%6}acacoiDbBJH}*@So&q2}Qtsm&>-hFrF|<{Z;bAm}2P zJasQ3t)Hh(q~!AqgaoBT-2(meTaQ=CNe%M(l3=!XU0$NCh3VXYA-U~H{w#pm(Nkt^ z+oCfD>nQ>DS-9d8GM$-WV)(Z3mt3ahuoxT;$xpb*tt#VR@wd;t45yKG4m5^0y zJyGsD$=vIU=Zk&U5m_qMAUc5gSBQgjDBQ3}Uol+K8qCk?62EqoDh$9@0H@f~ zsY~(A|4V`)Xu-2eL+xlpxhH(hWBL7SAetOG%r0uIvJjP(a@@GA8dgDXs1$ljSw9USB+4wYV)Juf@hj z&oDo$ef-){s$u|Jk)2}tr!K`msaz5a(F~qdGivf9{5^4PPUZKnfoO6%GHujY^&(0x zKv!Tl1l73r>e!nRnTodNSP>=D2(tu>V?b?GJVuprJ7+gEze zDedg2+9yX2zi)fq39J>>;jc@r{6Rs!G)@@HSE?*Yv7Y+@#H+zUe|kEaSm5SN0_eLR ze5f^B{gO3URZ`j(3$!z2o{xbvODS>EAF^aI)w5yy0yCxOly-Jh9RV{vF_N0Wfg>V3 z{dElu^5s#&z`RnQrWA{_A3$6XoXV%CqlwjOx)VU(SKvdfspprhk*Bi4wpidBmp%s1 zGcv$0aV#IQWHHqZVfz9zrRS7(c2w;X)7J0X+SP$`B0l_esWmw$DE*0ikN-&QW$|k( z)Ua_Klds?c>=Sn$HSSt{is15Uh@4XGv$Z^xVuxg`4GfRL^T3nscf#|^7<7W&=T_>o zLNAJg?dLkx%!B6%(`R1BUiTr#^Y1Z?dyBQ1q)n>3k$KozVj#(!Zz-jJYx2q*ZQX=H zV4h(meevWoVx>H$;9DEeA7{9_0pq0fIar;zUMmNiU&`DQt2YlZmy|VovSn?K2||o9=tMoMDnRH(aWDzpFb0?yPFO@w zWSnuI_C1sg;~uc4l(b28m?ARmEU}wp&Id|$C1O*7>D5gb1m@XW(wB9EJ|?n@zO2#c zk274IXK^RTN$GR2IuWst4K}}&xhGa{o@Op7YxV^0k(@9TO?rjW7wS*oVn`yVcMXc9 z4s-W092Vj(at~N@*u(c&$QPb^8m>??$ZawC3NFB!ai68eJ*QF;dDzB=r&Rj_5VDD1 z86g-L9s|jV4)8lcvNHyqsBc)MD!nKUmZIB&T_*MvhSIYc-R_INkCkEE=dFb$ZBkvn z%)`zSb4up?e5tNPOf8wCt(!0i%rnEJFYCxXB?29MYfJj$3|HqF;>mGR`W&oI^v(NXU)?g5#!Zs4T{d*!mVYBdqK4} zt2&XHqN+U#@zTobyu?{Q6Ez^p*vzYN+*|fiq59YkWS2?BT2ro5ya)gl1_qxrsa{JH zPp4(#*tP&qS;j+IeU6OfZya(`%;@FUE_bJkDxyBMzQZJj*-a=RxEOtvoJV78}Abr9ePrt3>a@{IKCi+5)Y z_aPDEZRZR=W_$Ce(j8Q5&8r)iDXN&K5P#-WTb^fFgM`=<JU8A0c*0q37ZaUY@(l^_py0w(wo=HYqUC;MFt zSM~*G6>iNbCg4<>3}>>*bS9ZBXCh|a6(+}-U~--DCeInikzg#BgJVpgGun)BMwud~ z!W28@_>o7NQm4$6Ii+SKVI1X7v8iy1%qVAs8SNCBF;0OQ>*SkpP9E|k*VJaLbppxD zLsLEKGKA~#n_lflm#C{H}rPbm=T0x31qzFTbFr)}WiZG-ILy9n@ z2t$f6qzFTbFr)}WiZG-ILy9n@2t$f6qzFTbFr)}WiZG-ILy9n@2t$f6qzFTbu#zGS zDUznwsLL!S@661jv?XYuk{-;NexF#OKDDUv3{sLL!SFOkeMwB`D~k{(QVzfY_wAog=$Ev*(0(yGcabyFO-&Qv<_I%6hN z%rKMq%rq1E%raN-nQbQUnIq9Lb-8f6smp`!OtQmgmyc zjpGS5b+y@7nX6R$qlVSAn5QM{@&cv?12C(o6@!^#Zg2p_1o2w|tIlK|-l5sYONGhd zPcBL>2Gh0+yxD+{aX`Q6;n<7ax8+J{*!G}eF6iawOQ3pZO%&57hUX>H7+n_afaiTot;W1(=kms#x#;*BtnqAL%!J{M0^lhPK~9Bc5>S zF?Uu3!KL-3s4}M4+fY6ZvBD*LJce9JVJ1s_^cFmGn1%X{u zn*jB#1_yCDXm{%(1g2&LFsr^5g9`$T5RPH?p2CNs)fw7;2MwFT)yQVvEJR#&2BxCx!$z1TdkxA*`!TU_Tc+~H+t~x+5m*s3=r8x zX}F19?A~B8`m}47bXX9wO)Ua>u3o(fI zP0z#j2xsM`NaWN&Dn#YbIC_Y-KEI0~+0itJiqU8yH_q-8>H+1nio{QNMfJoheogT{ zCeFbr)1@vkOPzuBfa(k`t8TbHsY5TNOq-t5XPdI_^igHb?xQ+==*+Z+4?uGt3&VC2 z`KFOs;13(y<{n8yzgW~X(wu_+V;yWXqu$_Wn zyVkrN?x9||OaZXnlleQ`-5ovvwo{Rgb4}0k_V{T9yr_`WC@y6C&^YP^`H@ht5pP9X9&SJ*C=Fmt^sW4Xks|rJ-LeWG@xnPBZ271wf~l>~RPb zbIz(|*sc>D+6vnpL@&oT9BhZ}6a?EH&Rg$p?}p110NXX@uXi`K`hWsew0iF+VabDO zTr{Fc{k@-1jR*z`#(l`@711@`>k3qWrefP~VNVp7S-}ZHW+69TWa-L3^iV=Iq{Emp zFh0|Vyd)Sa054@7^x+4*4Id8ohYQ#9DLi~QVQtpiI68gG#5Ow4lKCjO3@5hOJ1~mG?$cHyq?}Q_ zyFzincsE^MjMimVpx|hs_ghxi`DZCgNbGbNg8>^bQcM61Iyy9Wh(smf8TaI{eh6irjP@D-i0LJV(@c0rV6#*L^_{$MMXNVD@no| zklJTid>QaY9}XVJA9Vix)HcApBI?hk)K+D1Yk*Tn%xeu+QwNR)e<=tf->7vZ_Hi-_gYj^O0kuA&egS$(#}Pg-JGBI=Id`Sbd;kC{BQv1#L7w|fP`RBn z2=zn`9E4sz{5bNVo5gPc-s;1_!?=aY`=~t*l|`s@r_^rBSYM)2!!ts~3FJqgsh3(^ zMG2>cXE3g{ZjHSnTj*3G=_Hj{G@fvA0@>)dj(y!i z0I7mSO4jI=q0K-!S z$zU-6>EUEF87=~C$l$dh!`+4pnJaPRo#&)t)Q~!6fEw5fAFmbTTIfJw&@jG~`u+if z!&bR#`EC#HhI0wJLuRB#ND)EhNgywzN)Y@v>4uEL8h|k%vO$SyH#invm2(1!L<%h;M z5%1(Zz+M29Ao!=nA!DWnUPOvMU>mTOOms3Jn@6-QSQdxbUDFD8pVEu=Q% zD^6|JTV#|o1RuTPz$L<((B%EXof08Vj1u-n=_an{6~_b-F@zTA7fF-yvz-5*2F*0FVtBhFEf<%Hg^55eHv?ev^AQNHm_!%*xf#H@%ts*}rbx|$eh zouRMg8i_I}P9xRx4Ty~?Bc=D_HbgU=-bN-aEAeNOj?=Z#$jW5A`-j4bZxj;7qvALo zyqDNUbv4A6s6#jvM?DbUx&(_sVhsba@I09NIRiqW9qr9c$j2cHsTKb#J# z_Ztv9QbtP0aof5wcJy{Ial76^>EW8>(_4zu3vu`Ucmv2U!*^V_)202rOL!W*1^*I5Dfe% z>wCIQ=X!#Al6?@vBX+G$E@ORHI|Cgw^wp@5IkuO6IIUC%4T!BNBcN<*TS66Z>j(U{5bqN-O#EuWd!jok7 z!A(%82ds9;!)*JFXNYKuZD=>$@QIL;y@&_b?;8a1I2*Vj1*`R7XMZgAzY(lh%rtVsT#!cOIgpHfJ`2>!ey6XuY zH+63!c-++8;1JMN_hu)X&$l?tx$doUj;UK9a9qq67B>-HQ&trn@5R*6&be?;@fy+S=%(_&EjO;%=yHIg=2 zufuh+abnZ-CkJy^%5m!;3&hxPtIpDBex}p4{45i%a+d4#J-YXmMRhm(=0}z6eKa~t zr|$fQJcgKGphWifaGke@jXA=6%Qak!N%&l_B%5|ZH=hmiO*|?bL!6f|Pm-%HY!p)m z!%C2at!PzSxYxk0`06hl=;X#~=k6}pRbz7CObJFsx4XSv6Oup?@VjBx4zy2vccd3~ z?L^qS5pnc)&~F4u5A*1~DC~MD7d;KZBPa-oYVCksJ9cIXid>;~!e58-(LWHqt&nQg z)|n%&8Fx|1++Zvr#epR1?p$x$rihwLj_wDS`-R#@nrDX4;Q7@gk``cjG-u(qiWPcAM-X3=3><}7j zm=}}qx!_PX?SyVV8^Eqz!ZE~$3G*bm>O!m7Qdn++ENn$9k6pR+xbR3j(L5VAb;7P1 z%LBVg)GcDm?Uq0@A1E4R6YScGdW&y5*bTe3qfOj{a%0j;zXwqzFpu8K!mitMF$5s^ zK{Swr@4}aE>xL{rkqg}RLQwKia1i}?A=Rv{Jx6K}X0E3WoY+Cr&8Y4MQEYVHx2fH< zN?fntQWjM#wvXtvO*8={;)B><>h{@T1eN88ktcS>Bal+jVL`bsKF;W(af24TfgY%+sJz3Kup!S=r z%no}hZL(g62W8_lW*VGSaxizL9QRDp zaye7W*B4`kh$37(Nfm@C!#MHFsL^=z{%DcuS;t9qu}Ew* zq2AEYk;roQeo=rJ05OiU4F$%H&KKpM#8VR>2ek{DTzZR2ZX%B^@w;MGO_&8uEK`)6 z4nkhc0aW@DbeK0Li1e&BfD8Z*xb6~ZfNf$&We-(X%Pi$wt0n+IABkhWJ70heXcsYb z)={bJ^;@VJ08o+WR<82J1ldRfF_Tbd=?$vTgB(*ae%65^#=xK`Vp_}>N(|QzdR98; z;ZuvD|4=$N>_apq5<%!GmWBiwD2ZgjR>>oDSZVz1x+TyWg9Zhkq+}mxqSkxnH;`Gk zgy&H_E2`tm()Oj1ePLG(MjWP_Saaa%23ao9-DTl)(Yr)+I5wUeWePpZn|NVMd@e#c zVHS1;8 z_(xr!gurqifHvgQN%{rFO(Rr9~7o^4&SNj??05z4ZdTe;5(tG zm<$qjp(K(8TWt;BvC?>N>R^sHK01^@?Kce^yeT1cou z)t)j-IV-DDW^a5XTnBDYfXCT>F+C1asq6P!sA2}FNOUXV9%2+6R;E$~lipwxn&~in zM_-_bdKMEotxrJ_Wgiqu4A&2uPg=rvs>A#DqjQ7r*eLi;=qb8i0#TGivS6!r;X76u z?>@L4T4Q2h>Le-I2bw6_p5SpZ2e-pm;;m7wyCH2~TG2ze)Q=;S6J}vouL@0MN{;Pi z7(NJm@6f5|R(r-rWx1kJd!mdp-<)NL`E)G?gPhwbi_VwT$ywL7k%^fGJkP4`&q6dY z0aPt#nI6XGD4*U!efg-FC87k~CT1k-*;r^Pls?1d_Qv%no5`HqmM8#rb^Q;j?%J5j<&L4I$by`rPCtQTP7ZUsxPojW%NFu zMT=Hn2N(O8Vo;og`{i|6*#_~UFSo?$xgUBrES60I+uo62H^kTsIp#~Sp?Kl-+5{F^ z%ti{en_wadGZa&89dnWq#Vs;l;MmBr;nJtPzzdtYO{)GuWYy{ukqer$IdC5vVq?+?hc|QsDhy?@8-5mDzZ+iP0fl=-yi+GC?~q@|M9`1aibG%g z!_wjyyxxI=LWi;tAhF#fd2|i0%W=8~MT4(g^mM1y=OUC2<>1;CUw>)~c%7blIGdw7 zq=KfR%H&jZh%RMD{qWIgFYQDfVQXNJa0rzHyqrim^Y83X)$g5H_0Ve_1mL)$#e2FK zXTRxXi2ZaeMv5HzDT|%KNGWY(Vx|qhxSANf5KYVuH3i^x#@^q*h2Auv+75~0bvv1n ztf#fmQYhIuyw3DHnaVN4g+V}8*k%z~S;{Qn^(R@UtW{Thj5!HSrOWiu;dQ1;)2=S1 z<$lh^vSB)1SRkcSczvhbKTv&vZQ4oi``I6{BqDICk10k>FT5@<70Wh=hyO|NAZX7q z=-qZeHVJHdgM+OSV>84@AR(V}N1&HFu*d;6QmEYt6G^bAn1>POBqNGXWxv4Tb=h#~ zQ{GmFP2Em4IY4C9>QIsEqh5HugE_cQs_#M!kwfr$m%jT9ZkxyJocz#7!WP&B@Uz$# zo8a~JaC5h)6zW9HZuje$2s)Wsxo+4%t+dz&ueYKU(c3HpNNf{H9$mxhau)A7NEz)z zO}n)rDrhR|vmLzcbSX3HhmRh8X#*+{`vxNjK`y8N zZk>4F1}r!fn|IvR6SMU$fa8kg(9_8{L9XEm8KrA6jKpI=S!^3dN@*h#Gsp4Tt69?x z(ZtkI^8;RI>|p;EdJlp+-7d=BZHJVyp2LNfLdnkIb*A6WRQ9pC>jSbvRKFmyvXoiC z>y4~a)~YMs$DD+wf|))#yv|f<+Qp+FYvfQZ8>Z8R1yVYN*Eh)R2-O$ZrVaESWPikZ zIS8lvm|{3}!|U?uwQPgjKghumg7)l#-p3!2O#<8AFJT{vIu!?l1m4OGhF&?rB9E|< zLhW{#=s2mEqz9Rkj3^G7pupjE*>LGo-sy%--F7u|KxEbMAqXIL!|Scg!EIE>hZsNG z;q^{^Lmb@WslJ2hdc3nSo8#;un**uu8DMItr3+E`iB5Op6xQ)^`D$1>jilM{FlUgwl%FbGU0V@$5Ni>0bR=)W|lxGu%Q86UY z`(h-dx(ft7SK|h<635|<0Kw@6wNWpuIbd_EF1D8(tWj!W(V*q*QQ63pL?h~b1C2aH z_kK~Us8QViDeeQYC9Gb~RyxrmwPK}tNPQa}*5XYSQ(~iCQB{tQ&d32~nD4|Jq$jar z@HR*yD<2H+ejS2I3!WW61y2@)w4uY^`QG{5&V`Ll?@=a-Wup_#;+v14sxDm@q?ZUu ze6ca)4#iH3D~3#IAm$@xrkm<%fC64K-GeBGaGzW`um^qWjKHvv*Cy2OK(8J$n=5Xb zM!w`lY}>{%aXBQb;g}_h#WA6EI5494QhkR*a!6QlowDMRMqxm46IBT_!^E5wZ8#}R ztjA24*mE;58}!YEF7ZBdeU5v*qYovzlVi1_h-o6`Lm%3*W2c<68BsJ;2in2ykiOA9 z?(QzJU^vE7E1G|2uXR4K3Q>LpF}S^k1HEX)PENLBA)wGj`=|OI1U*;76|xd%YZ0*E z^vY#}-jj1$=Q3Z6DmkUI9x+u!h3dH*Cbp_hZy{*pA-cyzU!otm6iD$!h>>6wE=&xa z=#g46zdWSA)*Y1-eKR)1tw1KQ6{?In3+^pDXaq$2XiwS}Dhlx|& z7Er)zrhCwZh1=J~uCfPxN?|Mpc`HSo7_wn@m29r~d^$#u!l)fP#eb2khGPyL5HE+; z;SK46iGA-ya!6P)qO5qRLl{tePP;uO=HO`~U14H9v%8V>zF3{8rv8n+CM|e&{1iM{&<5?WH|Ti|>|9{t^d4oRL2sfk zu~1c)t_#u&ha|pO1#;hFr^R&yOf0qmY8@s{^?^VEubJ*aC#Gv3mW`nFDTOfw;s zwa!{J3VlTNfY|`oc{z*|@7jU6p&b&&1?pOsGz$|BVakt3f z+0PGaV4!nF-D3hR;Wj*(@r(vBI{I4{KsKU9B~B7WiOThIY6Wae=uxZ}8uy{6<(kGV z6Y5B=kKnyQ3=1X2MjF)v%XRBesH< zjqAm~4NOSj#y74*!Cz>?SY)zL_diT61^wY1Bh5?h8(*D2suH1)5+#M`<3~t~|99NK~Qdr3Q-@y<_c)9DPk3y?K5= z^5M{KG%JN3uK?=cCI*H^ubzYD2rga}ITQQ&Va*E^uPA#AphMh{Co`VOASOqDy8=in zIutu-Cu$Of>*dr2NVh4_vuJ6#@o{$wbtKnE#NZ%i1rvs#ZmZB?Cn{ZYVtfs>EMQ?h z(Bl=*3=7cd!oo=_fhz_4Qq}}w4qi5{!2mW`A%PojjiBBybYdzpStxwIjfh9T!14#T zDKOJ`yI*SA)!mw~Jp-%>i*|_JgjWbVk<{JIA#Q+S!ChKwgbEwY;O@tTk;o2eVu;z6 zVBt=v(W%G5Hby;~7#&?LTDfgT8QLT-mC z^VCWpQFWsCBP?39j`0o1__49tvfJ>JU6TAU+t)b;bj z8W*TtQT3QV+hx-e8P8x4gQLGy0pu_m6f0;0N)mPJ<cWml7Bb{mO=Gk$t@n?=R^31gM+%vU>Yug#I#;jt**Yq>T zd2@}qqqgwxYZ$NGjAXpm^ph1s19J4NU$9FN;e=W-? zE$^yAMCNwY7FO$G_U(`b>WNe8)Uj@Y;W#sm;x3=aoMvug2WTn9K9o#Q9Fa zYy4SQGye`ouF;Vz%s3W3wj!_GR50{w{8?B&zk;F5b?8!)&Cofexn1syOUQlnC6sO7 z$H;vm_D7qGEuTNyy*-v^Owar-(^H%CWBKOr=ccyvEqAZ!XP#4rP{~uFQszvpF}II@ zjX(1wj;^K*Q8NC&`N!N57kMf!%4B;hjoY)3SKj}qbIiKby-nx(7kQ;+UFHG;qdU(E z3}>B#fDhc=UQ4bv@IZ~E2*kkM<(h-5YXi4q%(S+fGZUY$Y&Yj8x_n|Zy>_4Fj8*u& zxiHa;Y_vda-0?@ml$Z@~@20%8(g+Ldl zN8hK5-tTVrDF%W23}R8+UnzW5V?I0a{>e4&9lxF!ljO)m^SUJ?8SjCD&%0lE8dj@u z*IX!!8CSFS^}%d4?rWMPm`%n>V>SpkA<)I?kz_WZSc2K4pv+co=1qLtijoCavlDKaG zgg_UkN0QluVhLuGf-;*iFHJl<*|_o36XTjJl>DpnG0(VeN5S*%nP;yxBT!kj`JY0V z?rmT6{35rui0dM^t>lE;+*5*u(oC)mrRK)IS~A^T@LOP~-b!wrn5VHX@y$0^39R)> zau3GnrDoCni(>!nUdk7}ZBgHUyBD+Q?4o#W(OzBM)aUu-^Y*E(d5KTR`x<}#zJ&4e z+ozdQ*L38yUoSL&l@s1vjurP+*q)0?zF+hg?#+GWNkABbV?pm503p2)=;HMFMbRdA zOU$Df1a^z#9)SnlL1Fl*_nW)M*Hp#az8xft^2F<$>@E4c`@o%fHE?yjBf6lh@#R&0Ztue+u-oR> zIr(nMJKVR8%PUuQ>vJ!>Kd)RS`@vT^NwOO~r?Z;}NRsyrK$>)uy%-dbWH&I9>_%bG z9faM?)U$lix2cM|v6rwu+~2>dAI2?x-tD+>HFCBj?)Lqb&SQU)A9?(uq|?q{4S(hQ z`G-{Rtophp@lto3DQ_=5V_q0%rnS2r?%3BeF&(9Do+&?5CNuaw$8~3FyTPyd2Tt9Q zcn?Q%B{9u0XU4T(?&oWLpdZ?0u%^2Nx5qeK3g(W|&$<5+XE$ryuf$&8r+a|LX4iBg;JAlhdmcTfHXdzG=?*nv4Ct*5~J;Pv{HJdwW~%j$Tw! z?bgVymb)K*os$nLi{+Z~iqdj->`f($-0#>uEq6nIWSPy~ITv`6E6U2vtlWh>#Usa+ zU+!mZ)?dl7EG~Md^d&bML+||d)%+N1Ms}I=rN(_WRw^Fh(eC6f)NNmBm)oiIwAY0% z|LNunI!d}sH!Jkk5GW}rb>G_q_d4#P|3)&HSK$rVgM)foe7aQaE_uq`HAOuzJ}huW z$rSgBKoZ84qSwoxOm5x$`R+f;HRH?k&zY{;tbkeME;>`2QQhvZGS&C=2J8(k@wlXS z(S2}9%^MssJVy-n^!z_0OD-&02$z)0_e^v8ebv3Qm(Zv09LAIK`%;|6ueDoxq*y&K zj&JAv#O_kgLV0J%ouAsyE&m@Xb?x{g?P>8`9${%jT3qB$oE1a4$X>%b&*3HhRq?z1 zh%?ZAci8;v>GEZ-+!EY>c$>Lu`pxG`?lY^)YVz)&@Z=p+2#S&I{8PyGy1(@2d!M@_ip^1vi%L5l5QGn^RK51mhF$1^twI&Ili22KDeml zCNr~)z#ib7Rk5#m04( zUNAAqyqdmDbzw@MrN&&y>tZvW>n(|~Q{17xFK;yEwzx)o>HhpF=AUCNrl+LKJ@;p- zFI<-9exbC~WaT;XJbZTiD^6+yl@coKJWUi?WlioKUQU8*6*ku7cIA$i{N;M>F6Q~U zT+hKPJ>B;A4qr^eT}%XC>^XX+8?wl;{}C*HoA)Pi1fVPCu2P7oFbVbdoyXUM~_Q0As zE0=zL**$=S5`nMHTDA0^JMX)@vg$^gx#`Ax?_RpPa`|1W*DSob>LYjEch9ZMDnGJx z^}UrJyyvdUx8Jq$wwtRwoO^4&une4Q=UsRGym>$qM7??S&8y#Y-->0cZ>zk0>8*FJ zsk{!9n^)hVAcf4m>z)-iULzyjlt{est7aF>lF=)xWYjtLF1x2@xeuEoLss5!orj{u zIrpuuSyOp;%>&C;-V1!`>NPb>SJo`OxAODLq`Y$J>J|4bU9qgPYT4>J_uVT!eP-#s z%jVoxbI-C{*VNp#x^m^3djQ^g*UG!@skF(Qdscj=a$e=Uxi?(@=6P>=%UiC${!KUB zF#q~DU3V?8x7?ur-hBNH*Uo?Io36Xz`q{L;>)GYse<*mzBuURJDedewQ=B&Ew zwq=#KeSY=QRW-MIp!B)kUc+Qpudp+f9ZC83gMUaC61?lZwDE(VXkFmf_N9!#uQz#R z`*KF$*ECbKA{9=;L{L*`| zs@MpHXv)QIUy2GYF_WJ$F*KGN~0h|8v^P2L( z;r{af@>e=;D3}>?gQ1+D*?6@Rs}F{PMWKwKX_(=}_k@ELp+In|6R!;g$A+pLHyj)v zs^m5HP;f$MvJ(hS3{B#5QfQ*|GdXmHQx%#Z*(o93kk~X;K7&(3OOEzwA%C>o1In~khK8mWl7ktoYIk;vF6%Wsa1kFxxxNMu5Evg5WyCPpVY z?#alcCkfwDH|%x{L-)8A`^S* zdmqSz3RyS*qJl`sHBcdA#mTV-DlGWrcmox(|H++Tpu*$>6Ae_D*FMQWg+(t;Hc;V) zu1W(ZOz)Utc=MyExr)SWnQEZJ$I4CD$$$7jRY_*i)OXeXEZabbB0M$mU;RY}beQ>Y zJOhyVhf)*oy*m?rn19q5XfgQ$c6i4^Xi>10viSzZm*zu`z`G$w>F*^DCKCJhD zW~qk(Jd+1t27pfk_*(#xOfq|ljrjs($$Xiw%#Tk1axIWUa~*RV>3T>b4^#fFLq8mR zmG!m>i3h}N%XI=FnWQ`@BH< zWmDeF#s{Z`;=#>MZfJxIKQm;gF~JeeEWo^E3RZ2Q)Xbn6(kLrrw(*r#n`V(_I2lya z&`?VzlR>4B_Usje_?fRzFiiJpPoVT1=8HUn1RHrzVy`@j!7#5k2W4X3^BCiK432&^ zAIK^t_V5oR6h9>tmxnSQiJpSuQKdM~=6G`1PDa!;L-1xEO4AIzVRGorvpSg^^yUe8 zj$5LZNEMGbFPUZoc&bPqq-pf{l#>G*L}`i4pn_U0MJdH2f^7I&xIkoPG;TN=fN=_{ zADbx|$WHP!lx~)$PxC!%B*&$k{>bMFSbk(JA_JvA`vsV2OVbK>+php}q=(_^CDdd?C%Vw*}yLl?jq(?#BJ;Rcye5UtS@(EGL8T z@VnUp1jQuDvIoZfP9b|R`9PJ4eWwtz8uvgs>zhaTaQr~I{HV|hNVDk08OB{9KRUF5 z(hXfROdNxR*5Av3_osKvFtP7({^ITapXCE6Y6ksh`Rs#nPgFqnEtF4G$oJj3XR0Xo z6FFR$oZ(w-;^yV+={{Zd(C5q7^BBb5Ta+S$dPN4s-pg(*W3~xN6hjg%8~qxJA~r`w z(F$i2kAJ9shBG#Fd4DCLY@V8jx6VNIU2~a#v~1WGtj%BHjD|ZIH+p%0B~cmsSgIW&FqD(-#ca zZ+(0La=1_In|gl67C~vkHzH>Dhy@ZXcSeXzMrx?F^7u$cjFu4A&ql51#Zs&n zg$RZTmN{h<>-j09&6s3}U$JEb6yocp7^B3gps=RwZ%XyP%TnRSz<=R!BHTS z6o-nOF~Fp*h*sNpD1xIIBo8^xl)@RIcsNM!CYTSC6rwozhKpdmm`egM^~`fiFawo> z>XF$|mSOT)couz?gbH*$8}lpxW2-<`Rs zqq4o&T_(czBDY&uoSI=LMv9fyirhR++FYg*o08(Pv*7YAVeV6En68Js(a~kp6Ge_Bt?cS^7|bL(P6SqO zDW;g~O`omRwgO>epJGL9D^rSbjyjne&0tm#mz@Po)OlW1clKlNeN$yFJ8OF5&+J^k zF)dvGq3%6bOb@vrQzasSUE*0&lX@@y^-FTYM-1`P{-NBzg>87tF0 zJs;}T0%!!Vj+mhr7qVUDVrIIN+2qVN+~Y6tePZSzkmT30-^U9WKhJ`UlltW6n=)A0 z_xTmS&w#Q8ly~wFkKx4^bA*1b!Ynu6X5;VUXC~eZ#&()q7|F&z1z-(;8)>qNNiN`r z3E%s7zu^Mqdrav6((Knj|0BcjP=EM&R(KTf`#`>q6%_uS-y=Y)c2Yh~IdByGZ-THi z)37(61>6lAe2T$3vKeHbfZZ{1uz>&*TJee#X@70{pL@O83o`BuPBz#?-v z=v>8Dr{tRWr|Y}f)2=FZ?uUFqGY*HZ<;qVpW1FrO*&@59Bg4;-nH7>lT-us=Fw9|ssZbR{76vHUniw?*Zss%t zWq<>K0*46EIMTzG3`>RQc%%Z}QPV_NF#<%y$83!A@+jrzk%%NpE#=tDq!G#yn<7J4 z*NHU9b3mFS%iT-ZMXb7Ya z%ihZ{GC6TSE?yZ9&pcmq9Wil>aN5M`L%~|jU{g6op{t#~+E8el<}zSgf%qwA7fwpW z@p4yTN!eO*^@$wTi?jrmmaENY#+PiGGGle2#G6GAQiA)LFC|k%Mh<@P4)ZmfQEjd{ z$`64n3`f&YIc9Y-1Km{=CD-ETI22k4&sj33Gd391m-NRRb4v`gU1iWiq{qx(72z0) zRm0($`A<{h6dC56aRx_}=H6;J8HiKOy(^KsGm-n}L~dJ# zCraP%oHsZCL&0EZOYL<|d}}C}C+^0rb3{58%ONMsGl4L)vZ#JEnea3qxQuy(t!qi9xA%W!UNXRA)ZbX zl(Gq9Y>^*BUd-Jwh*7gGA3hRXGulDQ1`FvA)Osz2rBsYBvH%1%>ZLC!f~1Ik9wo7P z6dee(IOOL9dz6n2&wC||cH@<5^MzI?TbiRS%`MNE>zvq0{06z=o{XNDqfUe(3>$<@ z3lh^jGXt493ifN^CK%x*q`HEl&IoNaNL{=B16+G#9D;n4VXH1uEb5*S9VE>vvDdfMAvP zH1fsQvGYG#GZlg@`~fCQ+=AMlMf<&oX|(_e$;KJFv`c1k2n)dTJ`(#+exOC5jgg1%-^=ELJF<*w$zD4QZAtSXTA!B76 zyypTC&lusg|DyU$TKYJp8cKf)y--CJ6em;sffNk}vpG$VXSDPvrN^n81fh)iDy4s> zv{*|kD6OV+yOusc38`S#Yl&}fF$*be9d+?5g_3HgHuX<*z-9hb=#ycBNGf?kw@50_ z-8P#s!D|$do))KgGsGgZIM_C+y-*RhK7apHMxbY;%_h#QNhnXh7 zzS?oO2DxTV{m%v_IgOyyQn5~sus+ju8T(HFV1aTivaVB#25;tLF z;B=0)qZl!STCSJ-6F0o)DyMH#Jpwf|7zp*E1A|-mEzT?lvg%U|K@zE)rcUu2;5h~`J)(H5V)f6o*CVU{naiK|Huh;5ipCd$Lp0WsT2Pm*FZnxmwg z@ysDodGwEvc9S-fo+EvM^rUoEEYU0x%^*cD`eH)BS{XT%V0r@&7)Yfu{Jwqazew+)jKL@dYz&W+C5Mt;4 zyIiwe<5E6)B^>>h-x#@w`46sUde)DF+;9C(rd-yPo*rpl?tQH0%@x@>WmkXX>-@?9 z0`Ps)kj(g@Nj`_D$eU zDIU1_$#G`7a@UXb^uQH2&Cx2igPIp9qjq=z$FmggU7_c&TPn?*?#Th1-Mq43tLaOM^ zC@{S~3KwuOlMpW)`fz%2OcU2!KQV(9QqSon#LvV#SB2smvE=C)|{btiGYHc5m0|b@`^phO(hmTGK*~$Lnwlk zlN4TD!+iG0n`$t2q41p_ne7ip(ZM;WTqN(L9TcGD4Q=PT>K+!enObWKNtT9n{T>rWb=KY+KW&HqPJsb zXG8decy-_M8}6FU&enUf*759qs-WeV-imt*j9(YCcLPK&-_HH(VmX4lyRzBm_supj zykv5K4+bc2o^9g6fSm6Cf!29HnQh#EaPR{xp;UfiHW>!kQ^0(tw#}3r4S!q+Crmst z-Nb)fC>@9L;Dq9xQ%x+C2PYUe_5ja4avLK!_JCfl9k~Hkn6+=BagW>pE1dm84y>S} zT=K9&FxkHlF(m;Vk8?@B(MD*Da!|qb<>F_Zg*M$%P8sI} zK`q;Y)NC8+j1I-ZnDi3p1aynKnt9Y74#_Pe0VUiMQUwv~0Z= zMnTMkLo&l{QVd|=1UL{?Xr4!@-p`HlAT}M1Uq!IF&E&{sb7M6v=lmpPwVK9jR_;tO zHU(NJ=b`$BiCV~GXF|dHN-YF}7eeB63U4)20o3NaohvxhEe;HRq-zhlt3nP%Eo0DH z2zRc$h$T@CCcCH35e^zgLqkrmeNE&9b2dtlLyLPfGK(_1$0yr#0#%FQ0oR7ykki=0Hav18=q1lPijku4TOLAH#1AucR@dYb1(6;Br%1{^yo z;znh&qPki9v;vg4iHn(M0$IH-Qrd@>zCqoSfMn0Wg>I(+eXY?j(Nv z-R&y`^aQwn$A11JDDR|P%^~glC;$rpe5qW;9natxN_B}+4yEmh(s)WgNt8JMnLUZp zKU4ayEwR_*&QaWCi|lsZP6mI#7MawPeJo|6Ewbx@1>d~De0%c+(t{2880>y(8P=;VJ%wpwt<6DXNv#U^Eo^g0 zP#d%#s3|3J-a_Y~d?CbEtw0!R6NxrplQ&Lt#BpCkUx4=9D2hCI!xMIdTZtcEE{K{2C(Lo?}_$5nJMTWgXFGX`;ae5n0Dc z9pnTHp)VPMWi;Uf7@lMOg0KPz^v`PUhadwm>#=Tlj15D!Wv z6Uz7n_3spuShwI#O5bNmTy;@7rW5Q7Rboqgm$!hQpSd5M2EH4Vnx4wHO^^;kxAK2#Kr?)@KrwRH9(4|83m9 z5IJ2WEImdX0m8tq(sr3dk!D28iF-^3@{-_t2 zU7?I8lZvBKC{>ANTG$~x3Gt^Q95z_oiR+#26W+Q{dRrtnia$!+89tfFJ)6kAkjTB9 z$nj%xY?!ol6S*WTiO26IdU&VFtt>J*E7`Ckd~uv(cI#(@emr7t0mwd06e?A5N3-Sj%_*cpQoz1(mM)vPO0xxw8M z!i4;`M9nrzNjzTuFdGwfhEjuHVvWYnn>}fG={-sx-VLhGVsoMu!Sy1$bQaznt&{{S z0he$>PDS1=Ee9q4zBWC_I{Y4t^v8({pAT^}as}+&71P+yOZSoo4Th*k#A20fHAp3UovS6OJ0+%smQGQ6E>SX+n$k)HO;}9b zU%%BJ!SgPD)B8J0%?YojmHbn-eW8Ry9{2lVZU`X3Qn+3<>udy`EOCik;^D~A&%+k; z=y(EKWvpzmh&i^nRmNZ|IUZ6%`e~lqZF*>yJVK8xJ|WbR9TvMuDJ56s=7d;UQf!f; z+bkO_)p%{?;AEa5knK2!HaR=>q7l#uB43}Dljl?h;3t=ka*yRU%e_|16d>#}pX_oI zS6Swi-f2ys$qBakB)W(*SCwO)9!uu9Xr5+$dEzLShkClZir0=Jn0f*H*4H?FCuPJe zjW9T^TW!oNNOm=5Q6n@kW&$O-Z2q;D5OQWDrBhnUr&LI(Lra;IvMIf!r2wT&N*AQW zRtLztT9f7B^=K)NQhuV<2uj72ey4S1l*%dnR!fs8RZ%*ur8$)5QTmaVZltt`(l#x9 zh|)(XeO*hdDBVkGrIyxFdWh1ywe(#|a?f6+C1I9!w$ z2}l^sw+K|&0ykvu$0gg84?B!{nqY=!u7DlJJ~hs`Et7fdD}Kb0`DYV&?lT|cJJjRx zZ{+agU;QIaXg{3~OT2k&7vW#skKS~R^HSb>*6ld)yPlrkHUIEy?<)|d5cxjrUuraf z_)B`=||YUMMkpEla7WG^R)$@trF>r0-?c8Ow_yla{!>jB<+{4dHR zG?DjLq^X1{NGivFa+k|KgKei1)!r}v4Vl!-f&qlWxnK#08;b3_B@{VpH)OyCoHuDjJW~$ue_&zA>xt^WMSgD;Y z$(43c+H>6F!VPei982>sVrV0t@DViU`Y9+c*z|%)K z3!{j~b@&UFi${|}0HX2a0_RUZRaViJki#~USic-XZp>53e5qIOr*enRmJ_JMMmKZg ztVh=t3*y(-k7E0Xz_XZ2zBRby z)ky*8$nA9`A6ut4dSXxONlvl6l>&N8w)mS{XNnEU>nN}c_>6uUQ;3SErc;DxxSBJ( zDQb9GN8V!*uHj8m)6B`}1Yt-pj=cGeDJO54=$kSUUZl4G)MP}Jch;Kamw8Eb*{`iZ zeS&U8IR3wwgYN?V+R5jVKOl4<&kqHdU0!|$`R{xA#pECM@^_K{TUhHtwjAacjD<5F z0ki~AN49}8bJoSb4R7SX2=pqTE!hUCH1{wr$~)jC;Xv28 zYb)cQm~ITmSo2mXns3Z7=6WVma6U_F%YQeG3kbOLyIEYfn&n)7^v;NkgbXx1N_x^%6MD1~4)9$!);l&=U^r*}}Gs^nqdY zo>w2-WV7O~klcK&xK2N-2+1Eoj_~<<3_DspJ|a{LKbWHhh+w%^j7gBVEx-<^TNTeO=WV-ws4`Ns zP$jC)R)ND8Cp`5e1^arYRKPqMB!&zZ>fy-cuJ|OxiK67_caOw>v0Qmw(<8WP78q|f z$}NtxW+tuZJNFr0Rn>cD31lr4AH`Ap8G%Twbx(x1stSqJH-yWw$?9Z2CRw=_vY_iI z&DTnl9fO0`T!jPI!8O7NC-5E!W5jb7eu4O+Cg#>uY+#R^4}Rx-egXiC)tIzsRV8?{Kr|)iR;mxpVYNkZ9D|)S~(7 zs6-{S$~>J~G>f^?^jdO8{~~AdpC?xVgf}eBsx-*cKyFBboB>jv2DtzvI}IX%zIkbo zHXvitAp3#blm_`HAfHczh+E_7RESFyLShMU;U`l|Zr~?LQb4xKb4jv6)IaB^AN|!s z^1qS0ZI2ji$Y07AJpRh=Cww~fDb$pF#|7IRfaZS?#8%?~`vq5XqmPzi)463Y0UXEcx8`$P z<;^`&CWhXf_+N5x!d!Ud?PXb`-~BN22Kofhxz2RSwv*jkq}e{4Gp9Azb)8g2_47Mb zgazFByAcBU6#2WIA4}fNZ7uY4-CD%8LG1O2qca$KoZHDw6nW!a{HJ^kQOp3JO;%i$ zb4gidC@2~FF~NCcSntN*wPaXhgGAKI%lmtR^EG3F*OL+*gZ2spd+Qq{W?$af%t4U| z2rp1QI)HcGr9X*|0ht?Y>uM&xCD^m&;f4lgk+1IJEv&^90|t#~o?^tbIEne@0aO3~ zvG*omb`{m$_c`6C=T495%tMDHWF83+2Dyrg_<|ye3MhlVAD{wW1oa96jUuRsC~_U5 zkxtSR-H3ui!~q&EpkNwgXfpJ4l7^T>ri3IU={{%I_xrEf`<&AO7176g-|zjNq|dIZ zU3;opRkhZtwf;+2aoRM^ZCFa6ap&da^C^`#dF)EWnPJRPfV;IN_%86ZEh{_t+6rDmjiD#gOuXR| zo{#E$u?|o~(;~z;)UvFARkEGxq^)g30Dp0Ag9Wj@h2zu9=^Vb4chY^-cZKZtxmN$u zsIV7mRhII+X(81@ua7G3GCvlqW$jEiH+9VAOszT{f5X-_D?3q>$uKLgSv#fLTx@M# zz#Ul2^}5jUTKbthJ>G69_5EsY(U5?C%o(--se`>~Tm_h6``Ot;K|3Jo!3J3Nw-qtj z%FZVR{UrMqk|?97uWu14`lzdK2?-j#yKgB85m4V@mT-N`I2Oew_NTfx^s_X&0ftDA zS=vG}0>*(I)lxYQX-Uf?%PuBEd41_*cQTKaLY`ThMXj8Rv+eJ2*fQGy0}Rlr?gljT zLpi4S?uBxCR6vJqkv`pZ`y7H6N?+;up%ZlAtg5QRMS`ZP@H>_hO!=(~cuMa?+;L@2 z5a#5rtX{X+s1# zzLl@y{#Y8N`}(0A1UNlR%PF_7Ho;vh8?X%nSi5klEJhFY_b1d*16!aRYZnM-3kjYG z;qZ783rJv<)CcMGu(ERhZb*kUIe{?AzU>AmhgnCqOcZIya{-sJiZABCjx1Lxh2tCC zk5WBlSWt;*b~ioz?9Smm&p!Rostb=OIyAOt)Vsd;%MCk*_Wo(Zz2BVT+;T`Ke)4Tt zB)R2~PW*jO%_jxv%zk7c2}mdYseOw`K{^G^OGrRE<-cA^0@6wR`Y=nlA1vcYhhI3> z?H~Tu;pL+azh#(}VmSmfeeW1>3XXwr-t;o7#c~qy`>^^sjp}ExV*iAeJ-yQHd-&t? zs|v>*bM;pGrwc82FpaN?KZV-*nRimPgyMgv`e*1G>?ne#$3jiZDflS`zd`N2YckYS zM*)WJLAAW}FNA~&IqrdU&Z5TiB@~oUFhs#^99PgKV>v!Yej~^Clg9*1L=zOJCO97X zA7p>Uap^?o;?P$&`7e_{mHdUg)<;<|Pa%H}YViH<=G)#1pg{0a5k(hIa{Gf@j~Z2e z_;*s&`YsQ-VhQrrBodd?l2`KL7cF+dFY`&9y~qWRRYGm2E_A_fN6{vSam|fTn@jJ% zA_29P;<4w@Ct%Gq+%$`cN=`uYAvl+Q;>xKs#!tvIRqa0OmIwQHrFL(B^3EIIKY=g$ z7_F5$462&|zC+Mg0o7qj7Ccf1)m?z2PV$|QUC}lk^qbQP=i;+d-#M1)^SiwGTKgC@zsM$bj z(^r@@nPS zmSj4dz#ZbU>MKlrzc3Vz}rwS7<}C1OGNHo0>wK%EKvDD*)5Eq>rT}+oKg? zGQm-xn4Mdax1EC>>jawU%2`V&*3F`>JBpdo(W(C}HhzYv@EwK`3J_ z)Z)mk=|*3qo3eCinX${-vw3}%KZB#M-ORL*D}1RybaWOZmhcX*o%(CFip+#{6fQV2 zWqmzIlmu(gRr<;Wv0*t9x{5HLhiwk47dC7#CccU!XHa!}MkAGpU*)T<&1vBk;_%75ACU5_kaUnAWWm3xdH)%d$o%xK{iVX6oh zMwPt&BUG{(10sJBRI*u^1dxQ?L=biArzp<~#@Ay~Vdrb9qk4usr}Yxrpn8nouafOa$?_hL%Ae;9mM0@54qzd5RcnG@Y$uK z3MZev5m_UCI|9Q)kPrKyU&3W2D88rIrDJ3EAW{sKK|s9RTOgo``--G?(g^emSnd(?8E1~RxOxYxaPslN>Q9va z5eOkCy+0@YVorKfPWt|wG_$0hVfVQ*N*Cd?=}X^83SyhKv@&x8$Zgv9hyEC^$doWG zjs0jR23hX3Y+?HAw+#q?BoB)ldm)6x4`tIqPrjBvzs zk@ppW3~eD>!aDQM_?sF_b%Ig>C@zvr1>1T;M=NJ{NCHLcc(a(PzyzlWoOHQ?YXb@y zgw?1HSwun{iaoqJ<_WU4MXnr3kcb}A1g_zLODAh{^CD(hR!bdBf@C(9K$4JM4)d{r zy$|M;Hn8M~YAx=IR$RTb`9paUjbdav=Sg2gPPHDpTlA4s96=6<$ zc2T+t0mtg2W{gt$(1vVA%ekuP7Ct4droTw6!NF&}V3w_sxf##p({-WVEqZ`|v#^x+ zvK!-)!fh;#K&&d|th@dj;}TyRl`~fm2B>t#G?1{DaHcg4^;nn+sZ|Ztcs!ZISn(x# z!Va|}zxh_D3p(h63J_Kyo&JBu-_+QiPJlaDDb1|2KmyXnNoI|0mPGjyKL#M9Zpk;P zzRfYFQuBOI)=0WwF@uf(8wE&7k{!O9ax3ZYn@d9C#eAs_w{c)~gOCs&`HFr?ldPc# zkWAP$tdX)9AIBfffbP$2VOz}QpDvWh&V*DwV1h9-{~1 zLf<{sl%jHQk*Gi3a$;Lt?-G95ja*EhEK$F7(>(|XoA4QexZFSE4+2Y^@TJcFmxp)u z{Nl=`5SVkLnWe^laVzWAAKu19#ZvnLD6H_aFXKhuHXaId?kc9L*}%f3pF56)O-4|` zdtU|#W$2?Ub3==uwGX9dBTzwW?@P^f?yblY3tpM$+=Gx?*@pS7tCJzO?<{ogQa)^9 zip1|3MfV_N3^7N$Xm@aCb5_7FCeYAlEZ(R9IL5;B3x&= zb>#k&bMLYoj?uc0J0z1^Ppj+)V~-1U@)=qUtJyFo5C#Y^%n5+*@k~wv;**)&-Vrs0 z>jJQFcwOJfM?A>$>oX73Ug8Ov+;!xx%;Y{q?%_;s9^apyY9Gv-2Jz=O+X!(TqQ}ra zcW^#+9Bo@hru*S?R)oPI|lPo=o46j-3|U26#j7`1yJxII}Wu~HZtn@?>K51kb?r&Lz$F> zm8b;Hq|J~}WOsxCM*|yvzAn6_Hp^5lM?`Is=|rk2CW~Ap(`%a182Z|k90kGhT7Qvj zTEO|NRGLSQwFh4yw@PU*g`&kI9m=0RBZ*QKbWAtt^g*c=zRZ7A^l|@39Yag6$l~i? zdDJpO%e}@M=uA;;e-gn6NLMPTfWhGgkcE5>8tF%*RAy)(7TeOxmY6c&h=SQ|$vkv} zki}p5%aKm=sg@N?l?w&Z)Fyj_P!wg!=Ts4GSoZ3&i+s8Rm!NqQ~ng|WR2 zt6G}mu;1Lmo?HTV^!BN-;SK~imL6O-S{n;6KSWe)pAaJ}xe;Y3xW$x>!N$fUy?ArF zBZgZ^t%Zx2C=i}9w5xK{m@N5InopUR$iqYKdagsej~QvEkzGjyOt??Zg|dxgO}5hD z|Iv6h54EnrFl2R}>1ko;S}~5qEf7XS0bb-E2p)Kow&W-f@FE4ohpCKBF*Uj9mh{j>taO&m}7<9i(6GXsDBH0Ni@L9d}1VVHZcuf}sbB>5t;Es{jm zhC~KC(k|8N1e4q(Q**P92@?7M(RGap93M%0A-ISPTpWg|D29uDhFwT>*d;z=n}em< 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

tiOQ+g zCsR#kZ4J_DIAd5Vr`9H|vRaq4B5O_3>g`KCg`(zK>JUpM8s@sXtrM+CCxTvr6Ykd$`ppLP z8zd(!ZdJJ7znhZsOvhnrTe@9~IBG`3D@)WP`bv-C&zjp_>JnN zu=FnK9XeCrLhVCZnXZaDh(1}rq78kCN6BF6A{393&q*1PuA^Pj&XtkgN>5Tot}My$ z*g+k^?Ts|lQg$ysD@W)%512CYaH%ILBkRkup>O58q@_o=v@#5EiGUff>d+6;X(ZZ~la zhQ1uPpSadSpO4#7TvMTM$n7bvozRCQy#z#vrO-``%2uXl=rE) zamh6t`d-|~e>RiRI8v`Y98V za*{b+o}tI&Oqm<&dnqCC$ipN>2LKjm0+$APKSB5o+_IMUF}Q^-?~8CtTi$2k7Pq`_ z!!2)lABbDv^1c$c#N~Y|Zjp0MhrSoL%(-?$AB|h+T%(~c$1QcP#n9*D7CYBm=o@m& zoog%fAxTdG>0%|clzs}*q@-j{muKiPIa4W0Ng>g#&KZs5ztsk#k;FLJ5#>FZbh4Wq zC=(^o*yKVP7x8V|hf=+=Bp=FXX|oEE$&Ei*dcoY2kR_Wh7=9AQWc>vbP(qvRz+enY zxRXT~%tCDf$TkcHqBaX;C5n_mrlK|#WG@DzQJW949E16&O$ynN!I0EuhO9}EGRUOV zribiGkuu1*)aHmROp!9k%+w}|Y)x&f$l#PyiL6d-z{vEJ(+Rwmj1&rLM#dFw1sb_tC!`_1ur@g4rX`>I9hXe7GTIir#Mx7uJdk{Bn;pqxjOPIi<3 zXd3A^&YbHg1IMgNj6_F{3KS%`U@tY#4p)_!5Ea7 zCW|nbg%amv8wLYWVxO!;(JRPQ)b@bv#b7jQ8$p(1FdwzuAR96mlG>J#H7R-pnUvbT zkXT8;nL0<7DfT?`+b^ZgQVZ zWRy2K(8fi4+xDQXZLG+HHd@(SgBYXQN0weN_aykp=93wZ3_l4-vi^bzC_zegU@!(H zaLFPJW}yT#*@nSDlmI6yQA7zc6(#7&UJOQ~HUwlj2J=xH2eKi9A*l@pS(744kV&bH z2-%e)N|14>4GUSAB1({%sf`WUn%eA;!6}y_S)JMxk?ARyBe*6RDHL>xj4Rp-G;VjY z1!%%hGti`=CLkH>8iA&5tO01oP(9EELnN`z8X|-Bq9Kx3=M0gyddUf^^BGl@JO+?d z7kI`;KxkaKW(W1N7yaDrH^=A2clh`2TT3woDW-rt#XR3%o2?X6KyF1|a)mSt2^Uf? zBwkN#}T`b*qKOaPca24 zrhvPK6jP953Q|mg2ujkcQ%u3fvy!Kn0#hJUOhJk%$lIaAHZ4_|_Uf=3%GN0w3Mfqg54SDoMH-S zT1+todn3R(#T4X}krY$#JS!t9reH-(45wSlOT(kgNlvfih|?;GolZ&YCMaSzQ4u?B zlGy2z#7>hWPB8_x958x0@+GC10=p?;gQ=l{xDW)LB z6fm$L#T2AE1y`0*or3k{RHuOXEb}{r6jR^

wz|3JPT{1f`2ZeS}n}0MTm^)hF9? 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�?8Uk7~M7GbWp-Vt3hK7Nb4UGUT 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ⅈ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 Date: Sat, 19 Oct 2024 10:45:29 +0200 Subject: [PATCH 11/26] vcfb24 fix imports --- vcfb24/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/vcfb24/__init__.py b/vcfb24/__init__.py index 1297300..d085b33 100644 --- a/vcfb24/__init__.py +++ b/vcfb24/__init__.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 +from schedulelib import events from renderlib import * from easing import * import math From 26c660a1358334ee935d8ca59b68b84a07f8d96e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 19 Oct 2024 11:00:23 +0200 Subject: [PATCH 12/26] vcfb24 switch to make-ffmpeg-fade --- vcfb24/{artwork => }/Computerfont.ttf | Bin vcfb24/SourceSansPro-Semibold.ttf | Bin 0 -> 289916 bytes vcfb24/__init__.py | 149 -------------------------- vcfb24/config.ini | 37 +++++++ vcfb24/{artwork => }/intro.svg | 0 vcfb24/{artwork => }/lower-third.svg | 0 vcfb24/{artwork => }/outro.svg | 0 vcfb24/{artwork => }/pause.svg | 0 8 files changed, 37 insertions(+), 149 deletions(-) rename vcfb24/{artwork => }/Computerfont.ttf (100%) create mode 100644 vcfb24/SourceSansPro-Semibold.ttf delete mode 100644 vcfb24/__init__.py create mode 100644 vcfb24/config.ini rename vcfb24/{artwork => }/intro.svg (100%) rename vcfb24/{artwork => }/lower-third.svg (100%) rename vcfb24/{artwork => }/outro.svg (100%) rename vcfb24/{artwork => }/pause.svg (100%) diff --git a/vcfb24/artwork/Computerfont.ttf b/vcfb24/Computerfont.ttf similarity index 100% rename from vcfb24/artwork/Computerfont.ttf rename to vcfb24/Computerfont.ttf diff --git a/vcfb24/SourceSansPro-Semibold.ttf b/vcfb24/SourceSansPro-Semibold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bf69cc2d854a05855b0f3adae7c37e3802ea1af0 GIT binary patch literal 289916 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

adsO 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⋙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�U_jB1 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 TdYR6yNE*I|K37M1_?iC(?LmA) literal 0 HcmV?d00001 diff --git a/vcfb24/__init__.py b/vcfb24/__init__.py deleted file mode 100644 index d085b33..0000000 --- a/vcfb24/__init__.py +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/python3 - -from schedulelib import events -from renderlib import * -from easing import * -import math - -# URL to Schedule-XML -scheduleUrl = 'http://vcfb.de/2024/schedule.xml' - -# For (really) too long titles -titlemap = { - #708: "Neue WEB-Anwendungen des LGRB Baden-Württemberg im Überblick" -} -personmap = { -} - -taglinemap = { -} - -def outroFrames(p): - frames = 2*fps - for i in range(0, frames): - yield ( - ('logo', 'style', 'opacity', "%.4f" % easeInCubic(i, 0, 1, frames)), - ('plate', 'style', 'opacity', 0), - ) - - frames = 1*fps - for i in range(0, frames): - yield ( - ('logo', 'style', 'opacity', 1), - ('plate', 'style', 'opacity', "%.4f" % easeInCubic(i, 0, 1, frames)), - ) - - frames = 2*fps - for i in range(0, frames): - yield ( - ('logo', 'style', 'opacity', 1), - ('plate', 'style', 'opacity', 1), - ) - -def introFrames(p): - frames = math.floor(1.5*fps) - for i in range(0, frames): - yield ( - ('header', 'attr', 'y', 659), - ('text', 'style', 'opacity', 0), - ) - - frames = 1*fps - for i in range(0, frames): - yield ( - ('text', 'style', 'opacity', "%.4f" % easeInCubic(i, 0, 1, frames)), - ) - - frames = math.ceil(3.5*fps) - for i in range(0, frames): - yield ( - ('text', 'style', 'opacity', 1), - ) - -def pauseFrames(p): - pass - - -def debug(): - render( - 'intro.svg', - '../intro.ts', - introFrames, - { - '$id': 6526, - '$title': 'Besser steuern durch Daten? - Zur Performativität soziotechnischer Systeme und der Quantifizierung der sozialen Welt', - '$subtitle': '', - '$personnames': 'Judith Hartstein und Anne K. Krüger' - } - ) - - #render( - # 'outro.svg', - # '../outro.ts', - # outroFrames - #) - - # render('pause.svg', - # '../pause.ts', - # pauseFrames - # ) - -def tasks(queue, params, idlist, skiplist): -# # iterate over all events extracted from the schedule xml-export - for event in events(scheduleUrl): - if not (idlist==[]): - if 000000 in idlist: - print("skipping id (%s [%s])" % (event['title'], event['id'])) - continue - if int(event['id']) not in idlist: - print("skipping id (%s [%s])" % (event['title'], event['id'])) - continue - - # generate a task description and put them into the queue - if int(event['id']) not in skiplist: - queue.put(Rendertask( - infile = 'intro.svg', - outfile = str(event['id'])+".ts", - sequence = introFrames, - parameters = { - '$id': event['id'], - '$title': event['title'], - '$subtitle': event['subtitle'], - '$personnames': event['personnames'] - } - )) - -# for person in persons(scheduleUrl, personmap, taglinemap, event['id']): -# queue.put(Rendertask( -# infile = 'lower-third.svg', -# outfile = 'event_{}_person_{}.png'.format(str(event['id']), str(person['id'])), -# parameters = { -# '$PERSON': person['person'], -# '$TAGLINE': person['tagline'], -# } -# )) -# -# queue.put(Rendertask( -# infile = 'lower-third.svg', -# outfile = 'event_{}_persons.png'.format(str(event['id'])), -# parameters = { -# '$PERSON': event['personnames'], -# '$TAGLINE': '', -# } -# )) -# - # place a task for the outro into the queue - if not "out" in skiplist: - queue.put(Rendertask( - infile = 'outro.svg', - outfile = 'outro.ts', - sequence = outroFrames - )) - - # place the pause-sequence into the queue - #if not "pause" in skiplist: -# queue.put(Rendertask( -# infile = 'pause.svg', -# outfile = 'pause.ts', -# sequence = pauseFrames -# )) diff --git a/vcfb24/config.ini b/vcfb24/config.ini new file mode 100644 index 0000000..0fb3ad3 --- /dev/null +++ b/vcfb24/config.ini @@ -0,0 +1,37 @@ +[default] +schedule = http://vcfb.de/2024/schedule.xml +# ffmpeg -loop 1 -i intro.png -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -c:v libx264 -tune stillimage -pix_fmt yuv420p -c:a aac -r 25 -t 10 intro.mp4 +template = intro.mp4 +alpha = false +prores = false +fontfile = true +inout = t + +[title] +in = 1 +out = 9.5 +font = Computerfont.ttf +fontsize = 100 +fontcolor = #ffffff +x = 85 +y = 122 + +[speaker] +in = 2 +out = 9 +font = SourceSansPro-Semibold.ttf +fontsize = 65 +fontcolor = #ffffff +x = 85 +y = 861 + + +[text] +in = 0 +out = 0 +font = Computerfont.ttf +fontsize = 0 +fontcolor = #ffffff +x = 0 +y = 0 +text = '' diff --git a/vcfb24/artwork/intro.svg b/vcfb24/intro.svg similarity index 100% rename from vcfb24/artwork/intro.svg rename to vcfb24/intro.svg diff --git a/vcfb24/artwork/lower-third.svg b/vcfb24/lower-third.svg similarity index 100% rename from vcfb24/artwork/lower-third.svg rename to vcfb24/lower-third.svg diff --git a/vcfb24/artwork/outro.svg b/vcfb24/outro.svg similarity index 100% rename from vcfb24/artwork/outro.svg rename to vcfb24/outro.svg diff --git a/vcfb24/artwork/pause.svg b/vcfb24/pause.svg similarity index 100% rename from vcfb24/artwork/pause.svg rename to vcfb24/pause.svg From 0bb26d6b253580bdf488c68c45751acfcae09545 Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sat, 21 Sep 2024 21:54:15 +0200 Subject: [PATCH 13/26] make-ffmpeg: Refactor code --- make-ffmpeg.py | 455 ++++++++++++++++++++++++------------------------- 1 file changed, 227 insertions(+), 228 deletions(-) diff --git a/make-ffmpeg.py b/make-ffmpeg.py index fe4b745..51b9653 100755 --- a/make-ffmpeg.py +++ b/make-ffmpeg.py @@ -4,152 +4,143 @@ import os import sys import subprocess -import schedulelib import argparse -import shlex -from PIL import ImageFont -from configparser import ConfigParser -import json -import platform import ssl +from configparser import ConfigParser +from pathlib import PurePath +import platform + +from PIL import ImageFont +import schedulelib ssl._create_default_https_context = ssl._create_unverified_context -# Parse arguments -parser = argparse.ArgumentParser( - description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg', - usage="./make-ffmpeg.py yourproject/", - formatter_class=argparse.RawTextHelpFormatter) -parser.add_argument('project', action="store", metavar='Project folder', type=str, help=''' - Path to your project folder - ''') +class TextConfig: + inpoint: float + outpoint: float + x: int + y: int -parser.add_argument('--debug', action="store_true", default=False, help=''' - Run script in debug mode and render with placeholder texts, - not parsing or accessing a schedule. - This argument must not be used together with --id - Usage: ./make-ffmpeg.py yourproject/ --debug - ''') + use_fontfile: bool + fontfile: str + fontfile_path: str + fontfamily: str -parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help=''' - Only render the given ID(s) from your projects schedule. - This argument must not be used together with --debug - Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337 - ''') + fontsize: int + fontcolor: str = "#ffffff" -parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help=''' - Only render the given room(s) from your projects schedule. - This argument must not be used together with --debug - Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal" - ''') + def parse(self, cparser_sect, use_fontfile: bool): + self.inpoint = cparser_sect.getfloat('in') + self.outpoint = cparser_sect.getfloat('out') + self.x = cparser_sect.getint('x') + self.y = cparser_sect.getint('y') -parser.add_argument('--skip', nargs='+', action="store", type=str, help=''' - Skip ID(s) not needed to be rendered. - Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337 - ''') + self.use_fontfile = use_fontfile + if use_fontfile: + self.fontfile = cparser_sect.get('fontfile') + self.fontfile_path = str(PurePath(args.project, self.fontfile).as_posix()) -parser.add_argument('--force', action="store_true", default=False, help=''' - Force render if file exists. - ''') + if not os.path.exists(self.fontfile_path): + error("Font file {} in Project Path is missing".format(self.fontfile_path)) + else: + self.fontfamily = cparser_sect.get('fontfamily') -args = parser.parse_args() + self.fontsize = cparser_sect.getint('fontsize') + self.fontcolor = cparser_sect.get('fontcolor', self.fontcolor) -if (args.skip is None): - args.skip = [] + def fit_text(self, text: str): + global translation_font + translation_font = ImageFont.truetype( + self.fontfile_path, size=self.fontsize, encoding="unic") + + # TODO: Make this work with font family as well! + + return fit_text(text, (1920-self.x-100)) + + def get_ffmpeg_filter(self, inout_type: str, text: str): + filter_str = "drawtext=enable='between({},{},{})'".format( + inout_type, self.inpoint, self.outpoint) + + if self.use_fontfile: + filter_str += ":fontfile='{}'".format(self.fontfile_path) + else: + filter_str += ":font='{}'".format(self.fontfamily) + + filter_str += ":fontsize={0}:fontcolor={1}:x={2}:y={3}:text='{4}'".format( + self.fontsize, self.fontcolor, self.x, self.y, text) + + return filter_str -def headline(str): +class Config: + schedule: str + template_file: str # video background + alpha: bool = False + prores: bool = False + use_fontfile: bool = False + inout_type: str = "t" # in and out time format: t for seconds, n for frame number + + fileext: str + + title: TextConfig + speaker: TextConfig + text: TextConfig + text_text: str = "" # additional text + + +def parse_config(filename) -> Config: + if not os.path.exists(filename): + error("config.ini file in Project Path is missing") + + conf = Config() + + cparser = ConfigParser() + cparser.read(filename) + + defaults = cparser['default'] + conf.schedule = defaults.get('schedule') + infile = PurePath(args.project, defaults.get('template')) + conf.template_file = str(infile) + conf.alpha = defaults.getboolean('alpha', conf.alpha) + conf.prores = defaults.getboolean('prores', conf.prores) + conf.use_fontfile = defaults.get('fontfile', conf.use_fontfile) + conf.inout_type = defaults.get('inout', conf.inout_type) + + conf.title = TextConfig() + conf.title.parse(cparser['title'], conf.use_fontfile) + conf.speaker = TextConfig() + conf.speaker.parse(cparser['speaker'], conf.use_fontfile) + conf.text = TextConfig() + conf.text.parse(cparser['text'], conf.use_fontfile) + + conf.text_text = cparser['text'].get('text', '') + + conf.fileext = infile.suffix + + if not os.path.exists(conf.template_file): + error("Template file {} in Project Path is missing".format(conf.template_file)) + + if conf.alpha and conf.fileext != '.mov': + error("Alpha can only be rendered with .mov source files") + + if not args.project: + error("The Project Path is a required argument") + + if not args.debug and not conf.schedule: + error("Either specify --debug or supply a schedule in config.ini") + + return conf + + +def error(err_str): print("##################################################") - print(str) + print(err_str) print("##################################################") print() - - -def error(str): - headline(str) parser.print_help() sys.exit(1) -cparser = ConfigParser() -cparser.read(os.path.join(os.path.dirname(args.project), 'config.ini')) -template = cparser['default']['template'] -alpha = cparser['default']['alpha'] -prores = cparser['default']['prores'] -fontfile = cparser['default']['fontfile'] # use a font file instead of a font family -inout = cparser['default']['inout'] # in and out time format: t for seconds, n for frame number - -title_in = cparser['title']['in'] -title_out = cparser['title']['out'] -title_fontfamily = cparser['title']['fontfamily'] -title_fontfile = cparser['title']['fontfile'] -title_fontsize = cparser['title']['fontsize'] -title_fontcolor = cparser['title']['fontcolor'] -title_x = cparser['title']['x'] -title_y = cparser['title']['y'] - -speaker_in = cparser['speaker']['in'] -speaker_out = cparser['speaker']['out'] -speaker_fontfamily = cparser['speaker']['fontfamily'] -speaker_fontfile = cparser['speaker']['fontfile'] -speaker_fontsize = cparser['speaker']['fontsize'] -speaker_fontcolor = cparser['speaker']['fontcolor'] -speaker_x = cparser['speaker']['x'] -speaker_y = cparser['speaker']['y'] - -text_in = cparser['text']['in'] -text_out = cparser['text']['out'] -text_fontfamily = cparser['text']['fontfamily'] -text_fontfile = cparser['text']['fontfile'] -text_fontsize = cparser['text']['fontsize'] -text_fontcolor = cparser['text']['fontcolor'] -text_x = cparser['text']['x'] -text_y = cparser['text']['y'] -text_text = cparser['text']['text'] - -font_t = os.path.join(os.path.dirname(args.project), title_fontfile) -font_s = os.path.join(os.path.dirname(args.project), speaker_fontfile) -font_tt = os.path.join(os.path.dirname(args.project), text_fontfile) - -fileformat = os.path.splitext(template)[1] -infile = os.path.join(os.path.dirname(args.project), template) - -schedule = cparser['default']['schedule'] - -if not (os.path.exists(os.path.join(args.project, template))): - error("Template file {} in Project Path is missing".format(template)) - -for ffile in (title_fontfile, speaker_fontfile, text_fontfile): - if not (os.path.exists(os.path.join(args.project, ffile))): - error("Font file {} in Project Path is missing".format(ffile)) - -if not (os.path.exists(os.path.join(args.project, 'config.ini'))): - error("config.ini file in Project Path is missing") - -if alpha == 'true' and not fileformat == '.mov': - error("Alpha can only be rendered with .mov source files") - -if not args.project: - error("The Project Path is a required argument") - -if not args.debug and not schedule: - error("Either specify --debug or supply a schedule in config.ini") - -if args.debug: - persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko',] - events = [{ - 'id': 'debug', - 'title': 'wallet.fail', - 'subtitle': 'Hacking the most popular cryptocurrency hardware wallets', - 'persons': persons, - 'personnames': ', '.join(persons), - 'room': 'Borg', - }] - -else: - events = list(schedulelib.events(schedule)) - - def describe_event(event): return "#{}: {}".format(event['id'], event['title']) @@ -158,27 +149,9 @@ def event_print(event, message): print("{} – {}".format(describe_event(event), message)) -def fmt_command(command, **kwargs): - args = {} - for key, value in kwargs.items(): - args[key] = shlex.quote(value) - - command = command.format(**args) - return shlex.split(command) - - -def run(command, **kwargs): - return subprocess.check_call( - fmt_command(command, **kwargs), - stderr=subprocess.STDOUT, - stdout=subprocess.DEVNULL) - - def fit_text(string: str, frame_width): split_line = [x.strip() for x in string.split()] lines = "" - w = 0 - line_num = 0 line = "" for word in split_line: left, top, right, bottom = translation_font.getbbox(" ".join([line, word])) @@ -193,30 +166,21 @@ def fit_text(string: str, frame_width): return lines -def fit_title(string: str, fontsize: int, x_offset: int): - global translation_font - translation_font = ImageFont.truetype( - font_t, size=fontsize, encoding="unic") - title = fit_text(string, (1920-x_offset-100)) - - return title +def ffmpeg_escape_str(text: str) -> str: + text = text.replace(':', "\:") # the ffmpeg command needs colons to be escaped + return text -def fit_speaker(string: str, fontsize: int, x_offset: int): - global translation_font - translation_font = ImageFont.truetype( - font_s, size=fontsize, encoding="unic") - speaker = fit_text(string, (1920-x_offset-100)) - - return speaker - - -def enqueue_job(event): +def enqueue_job(conf: Config, event): event_id = str(event['id']) + + outfile = str(PurePath(args.project, event_id + '.ts')) + outfile_mov = str(PurePath(args.project, event_id + '.mov')) + if event_id in args.skip: event_print(event, "skipping " + str(event['id'])) return - if (os.path.exists(os.path.join(args.project, event_id + '.ts')) or os.path.exists(os.path.join(args.project, event_id + '.mov'))) and not args.force: + if (os.path.exists(outfile) or os.path.exists(outfile_mov)) and not args.force: event_print(event, "file exist, skipping " + str(event['id'])) return @@ -226,96 +190,131 @@ def enqueue_job(event): event_title = event_title.replace('\'', '') event_personnames = event_personnames.replace('"', '\\"') - t = fit_title(event_title, int(title_fontsize), int(title_x)) - t = t.replace(':', "\:") # the ffmpeg command needs colons to be escaped - s = fit_speaker(event_personnames, int(speaker_fontsize), int(speaker_x)) + title = ffmpeg_escape_str(conf.title.fit_text(event_title)) + speakers = ffmpeg_escape_str(conf.speaker.fit_text(event_personnames)) + text = ffmpeg_escape_str(conf.text_text) if args.debug: - print('Title: ', t) - print('Speaker: ', s) - - outfile = os.path.join(os.path.dirname(args.project), event_id + '.ts') + print('Title: ', title) + print('Speaker: ', speakers) if platform.system() == 'Windows': 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("\\")) else: ffmpeg_path = 'ffmpeg' - 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( - title_in, title_out, font_t_win, 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_win, 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_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) - 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) - videofilter += "drawtext=enable='between({8},{0},{1})':font='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format( - speaker_in, speaker_out, speaker_fontfamily, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s, inout) - videofilter += "drawtext=enable='between({8},{0},{1})':font='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}'".format( - text_in, text_out, text_fontfamily, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout) + videofilter = conf.title.get_ffmpeg_filter(conf.inout_type, title) + "," + videofilter += conf.speaker.get_ffmpeg_filter(conf.inout_type, speakers) + "," + videofilter += conf.text.get_ffmpeg_filter(conf.inout_type, text) - if fileformat == '.mov': - if alpha == 'true': - if prores == 'true': - cmd = '{3} -y -i "{0}" -vf "{1}" -vcodec prores_ks -pix_fmt yuva444p10le -profile:v 4444 -shortest -movflags faststart -f mov "{2}"'.format( - infile, videofilter, outfile, ffmpeg_path) - else: - cmd = '{3} -y -i "{0}" -vf "{1}" -shortest -c:v qtrle -movflags faststart -f mov "{2}"'.format( - infile, videofilter, outfile, ffmpeg_path) + cmd = [ffmpeg_path, '-y', '-i', conf.template_file, '-vf', videofilter] + + if conf.fileext == '.mov' and conf.alpha: + if conf.prores: + cmd += ['-vcodec', 'prores_ks', '-pix_fmt', 'yuva444p10le', '-profile:v', + '4444', '-shortest', '-movflags', 'faststart', '-f', 'mov', outfile_mov] else: - cmd = '{3} -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format( - infile, videofilter, outfile, ffmpeg_path) + cmd += ['-shortest', '-c:v', 'qtrle', '-movflags', + 'faststart', '-f', 'mov', outfile_mov] else: - cmd = '{3} -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format( - infile, videofilter, outfile, ffmpeg_path) + cmd += ['-map', '0:0', '-c:v', 'mpeg2video', '-q:v', '2', '-aspect', '16:9', '-map', + '0:1', '-c:a', 'mp2', '-b:a', '384k', '-shortest', '-f', 'mpegts', outfile] if args.debug: print(cmd) - run(cmd) + subprocess.check_call(cmd, + stderr=subprocess.STDOUT, + stdout=subprocess.DEVNULL + ) return event_id -if args.ids: - if len(args.ids) == 1: - print("enqueuing {} job".format(len(args.ids))) +if __name__ == "__main__": + # Parse arguments + parser = argparse.ArgumentParser( + description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg', + usage="./make-ffmpeg.py yourproject/", + formatter_class=argparse.RawTextHelpFormatter) + + parser.add_argument('project', action="store", metavar='Project folder', type=str, help=''' + Path to your project folder + ''') + + parser.add_argument('--debug', action="store_true", default=False, help=''' + Run script in debug mode and render with placeholder texts, + not parsing or accessing a schedule. + This argument must not be used together with --id + Usage: ./make-ffmpeg.py yourproject/ --debug + ''') + + parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help=''' + Only render the given ID(s) from your projects schedule. + This argument must not be used together with --debug + Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337 + ''') + + parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help=''' + Only render the given room(s) from your projects schedule. + This argument must not be used together with --debug + Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal" + ''') + + parser.add_argument('--skip', nargs='+', action="store", type=str, help=''' + Skip ID(s) not needed to be rendered. + Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337 + ''') + + parser.add_argument('--force', action="store_true", default=False, help=''' + Force render if file exists. + ''') + + args = parser.parse_args() + + if (args.skip is None): + args.skip = [] + + config = parse_config(PurePath(args.project, 'config.ini')) + + if args.debug: + persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko',] + events = [{ + 'id': 'debug', + 'title': 'wallet.fail', + 'subtitle': 'Hacking the most popular cryptocurrency hardware wallets', + 'persons': persons, + 'personnames': ', '.join(persons), + 'room': 'Borg', + }] + else: - print("enqueuing {} jobs".format(len(args.ids))) -else: - if len(events) == 1: - print("enqueuing {} job".format(len(events))) + events = list(schedulelib.events(config.schedule)) + + if args.ids: + if len(args.ids) == 1: + print("enqueuing {} job".format(len(args.ids))) + else: + print("enqueuing {} jobs".format(len(args.ids))) else: - print("enqueuing {} jobs".format(len(events))) + if len(events) == 1: + print("enqueuing {} job".format(len(events))) + else: + print("enqueuing {} jobs".format(len(events))) + for event in events: + if args.ids and event['id'] not in args.ids: + continue -for event in events: - if args.ids and event['id'] not in args.ids: - continue + if args.rooms and event['room'] not in args.rooms: + print("skipping room %s (%s)" % (event['room'], event['title'])) + continue - if args.rooms and event['room'] not in args.rooms: - print("skipping room %s (%s)" % (event['room'], event['title'])) - continue + event_print(event, "enqueued as " + str(event['id'])) - event_print(event, "enqueued as " + str(event['id'])) + job_id = enqueue_job(config, event) + if not job_id: + event_print(event, "job was not enqueued successfully, skipping postprocessing") + continue - job_id = enqueue_job(event) - if not job_id: - event_print(event, "job was not enqueued successfully, skipping postprocessing") - continue - - -print('all done') + print('all done') From 9210d362480ba3bb9888202c6961f15292f622f4 Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sun, 6 Oct 2024 21:49:08 +0200 Subject: [PATCH 14/26] make-ffmpeg: Properly escape special characters --- make-ffmpeg.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/make-ffmpeg.py b/make-ffmpeg.py index 51b9653..b341907 100755 --- a/make-ffmpeg.py +++ b/make-ffmpeg.py @@ -66,8 +66,8 @@ class TextConfig: else: filter_str += ":font='{}'".format(self.fontfamily) - filter_str += ":fontsize={0}:fontcolor={1}:x={2}:y={3}:text='{4}'".format( - self.fontsize, self.fontcolor, self.x, self.y, text) + filter_str += ":fontsize={0}:fontcolor={1}:x={2}:y={3}:text={4}".format( + self.fontsize, self.fontcolor, self.x, self.y, ffmpeg_escape_str(text)) return filter_str @@ -167,7 +167,12 @@ def fit_text(string: str, frame_width): def ffmpeg_escape_str(text: str) -> str: - text = text.replace(':', "\:") # the ffmpeg command needs colons to be escaped + # Escape according to https://ffmpeg.org/ffmpeg-filters.html#Notes-on-filtergraph-escaping + # and don't put the string in quotes afterwards! + text = text.replace(",", r"\,") + text = text.replace(':', r"\\:") + text = text.replace("'", r"\\\'") + return text @@ -186,13 +191,9 @@ def enqueue_job(conf: Config, event): event_title = str(event['title']) event_personnames = str(event['personnames']) - event_title = event_title.replace('"', '\\"') - event_title = event_title.replace('\'', '') - event_personnames = event_personnames.replace('"', '\\"') - title = ffmpeg_escape_str(conf.title.fit_text(event_title)) - speakers = ffmpeg_escape_str(conf.speaker.fit_text(event_personnames)) - text = ffmpeg_escape_str(conf.text_text) + title = conf.title.fit_text(event_title) + speakers = conf.speaker.fit_text(event_personnames) if args.debug: print('Title: ', title) @@ -205,7 +206,7 @@ def enqueue_job(conf: Config, event): videofilter = conf.title.get_ffmpeg_filter(conf.inout_type, title) + "," videofilter += conf.speaker.get_ffmpeg_filter(conf.inout_type, speakers) + "," - videofilter += conf.text.get_ffmpeg_filter(conf.inout_type, text) + videofilter += conf.text.get_ffmpeg_filter(conf.inout_type, conf.text_text) cmd = [ffmpeg_path, '-y', '-i', conf.template_file, '-vf', videofilter] From 526ef6231a46807c226ea50dba1e2d684cc8ca38 Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sat, 21 Sep 2024 22:03:56 +0200 Subject: [PATCH 15/26] make-ffmpeg: add border option --- make-ffmpeg.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/make-ffmpeg.py b/make-ffmpeg.py index b341907..0fbc353 100755 --- a/make-ffmpeg.py +++ b/make-ffmpeg.py @@ -28,6 +28,7 @@ class TextConfig: fontsize: int fontcolor: str = "#ffffff" + bordercolor: str = None # border is added, if a color is set def parse(self, cparser_sect, use_fontfile: bool): self.inpoint = cparser_sect.getfloat('in') @@ -47,6 +48,7 @@ class TextConfig: self.fontsize = cparser_sect.getint('fontsize') self.fontcolor = cparser_sect.get('fontcolor', self.fontcolor) + self.bordercolor = cparser_sect.get('bordercolor', None) def fit_text(self, text: str): global translation_font @@ -66,6 +68,9 @@ class TextConfig: else: filter_str += ":font='{}'".format(self.fontfamily) + if self.bordercolor is not None: + filter_str += ":borderw={}:bordercolor={}".format(self.fontsize / 30, self.bordercolor) + filter_str += ":fontsize={0}:fontcolor={1}:x={2}:y={3}:text={4}".format( self.fontsize, self.fontcolor, self.x, self.y, ffmpeg_escape_str(text)) From 6876f2cf44e302f272fc15bdc45743d23c30955a Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sat, 2 Nov 2024 14:23:34 +0100 Subject: [PATCH 16/26] make-ffmpeg: Rework config file --- camp2023/config.ini | 8 ++---- cccamp19/config.ini | 8 ++---- denog11/config.ini | 8 ++---- jh19-berlin/config.ini | 8 ++---- jh20-jue/config.ini | 7 +----- jh21-rn/config.ini | 8 ++---- jugendhackt/config.ini | 39 ++++++++++++++++++++---------- make-ffmpeg.py | 55 +++++++++++++++++++++++++----------------- mrmcd2019/config.ini | 8 ++---- vcfb24/config.ini | 2 +- 10 files changed, 73 insertions(+), 78 deletions(-) diff --git a/camp2023/config.ini b/camp2023/config.ini index 2072250..5dbefd6 100644 --- a/camp2023/config.ini +++ b/camp2023/config.ini @@ -1,15 +1,13 @@ -[default] +[meta] schedule = https://pretalx.c3voc.de/camp2023/schedule/export/schedule.xml template = intro.mp4 alpha = false prores = false -fontfile = true -inout = t +inout_type = t [title] in = 16 out = 24 -fontfamily = BeonRegular fontfile = saira.ttf fontsize = 100 fontcolor = #FB48C4 @@ -19,7 +17,6 @@ y = 100 [speaker] in = 16 out = 24 -fontfamily = BeonRegular fontfile = saira.ttf fontsize = 70 fontcolor = #3FFF21 @@ -29,7 +26,6 @@ y = 800 [text] in = 16 out = 24 -fontfamily = BeonRegular fontfile = saira.ttf fontsize = 45 fontcolor = #FB48C4 diff --git a/cccamp19/config.ini b/cccamp19/config.ini index 181caed..0316909 100644 --- a/cccamp19/config.ini +++ b/cccamp19/config.ini @@ -1,15 +1,13 @@ -[default] +[meta] schedule = https://fahrplan.events.ccc.de/camp/2019/Fahrplan/schedule.xml template = cccamp19_talks_intro_1080p.mov alpha = true prores = true -fontfile = true -inout = n +inout_type = n [title] in = 193 out = 324 -fontfamily = fontfile = Marvel-Bold.ttf fontsize = 120 fontcolor = #c68100 @@ -19,7 +17,6 @@ y = 480 [speaker] in = 233 out = 324 -fontfamily = fontfile = Marvel-Regular.ttf fontsize = 70 fontcolor = #c68100 @@ -29,7 +26,6 @@ y = 845 [text] in = 242 out = 324 -fontfamily = fontfile = Marvel-Regular.ttf fontsize = 45 fontcolor = #c68100 diff --git a/denog11/config.ini b/denog11/config.ini index 6f403b5..0716e7e 100644 --- a/denog11/config.ini +++ b/denog11/config.ini @@ -1,15 +1,13 @@ -[default] +[meta] schedule = https://pretalx.denog.de/denog11/schedule/export/schedule.xml template = denog11_intro_template.ts alpha = false prores = false -fontfile = true -inout = n +inout_type = n [title] in = 1 out = 6.5 -fontfamily = fontfile = DejaVuSans.ttf fontsize = 100 fontcolor = #f9cc12 @@ -19,7 +17,6 @@ y = 200 [speaker] in = 2 out = 6.5 -fontfamily = fontfile = DejaVuSans.ttf fontsize = 60 fontcolor = #ffffff @@ -29,7 +26,6 @@ y = 900 [text] in = 3 out = 6.5 -fontfamily = fontfile = DejaVuSans.ttf fontsize = 45 fontcolor = #ffffff diff --git a/jh19-berlin/config.ini b/jh19-berlin/config.ini index 6a8740d..171ea67 100644 --- a/jh19-berlin/config.ini +++ b/jh19-berlin/config.ini @@ -1,15 +1,13 @@ -[default] +[meta] schedule = https://projects.alpaka.space/media/jhber19-schedule.xml template = intro-alpha.mov alpha = true prores = true -fontfile = true -inout = n +inout_type = n [title] in = 175 out = 260 -fontfamily = fontfile = SourceSansPro-Bold.otf fontsize = 90 fontcolor = #ffffff @@ -19,7 +17,6 @@ y = 450 [speaker] in = 175 out = 260 -fontfamily = fontfile = SourceSansPro-Regular.otf fontsize = 36 fontcolor = #ffffff @@ -29,7 +26,6 @@ y = 900 [text] in = 200 out = 250 -fontfamily = fontfile = SourceSansPro-Regular.otf fontsize = 45 fontcolor = #c68100 diff --git a/jh20-jue/config.ini b/jh20-jue/config.ini index 163ca71..7f65b89 100644 --- a/jh20-jue/config.ini +++ b/jh20-jue/config.ini @@ -1,12 +1,10 @@ -[default] +[meta] schedule = https://releasing.c3voc.de/releases/jhjue2020/schedule-jhjue20.xml ; intro_template.ts was derived from a png which was derived from jhjue-20-intro.svg ; ffmpeg -loop 1 -i jh20-jue/jh20-jue-intro.png -ar 48000 -ac 2 -f s16le -i /dev/zero -c:v mpeg2video -pix_fmt:v yuv420p -qscale:v 2 -qmin:v 2 -qmax:v 7 -keyint_min 0 -bf 0 -g 0 -intra:0 -maxrate:0 90M -c:a mp2 -b:a 384k -t 5 jh20-jue/jh20-jue_intro_template.ts template = jh20-jue_intro_template.ts alpha = false prores = false -; enable using a font file -fontfile = true ; in and out time format: t for seconds, n for frame number inout = n @@ -17,7 +15,6 @@ in = 20 ; outframe for totle out = 225 ; title font (either font family or file, see default setting above) -fontfamily = fontfile = ebisu.ttf ; title font size fontsize = 70 @@ -30,7 +27,6 @@ y = 865 [speaker] in = 40 out = 225 -fontfamily = fontfile = ebisu.ttf fontsize = 40 fontcolor = #eeeeee @@ -41,7 +37,6 @@ y = 950 [text] in = 3 out = 4 -fontfamily = fontfile = ebisu.ttf fontsize = 45 fontcolor = #ffffff diff --git a/jh21-rn/config.ini b/jh21-rn/config.ini index a7870db..8c25d4d 100644 --- a/jh21-rn/config.ini +++ b/jh21-rn/config.ini @@ -1,15 +1,13 @@ -[default] +[meta] schedule = https://pretalx.c3voc.de/jugend-hackt-rhein-neckar-2021/schedule/export/schedule.xml template = jh21-rn-template.ts alpha = false prores = false -fontfile = true -inout = t +inout_type = t [title] in = 1 out = 6.5 -fontfamily = fontfile = SourceSansPro-Semibold.ttf fontsize = 85 fontcolor = #ffffff @@ -19,7 +17,6 @@ y = 877 [speaker] in = 2 out = 6.5 -fontfamily = fontfile = SourceSansPro-Semibold.ttf fontsize = 45 fontcolor = #ffffff @@ -29,7 +26,6 @@ y = 954 [text] in = 3 out = 6.5 -fontfamily = fontfile = SourceSansPro-Semibold.ttf fontsize = 45 fontcolor = #ffffff diff --git a/jugendhackt/config.ini b/jugendhackt/config.ini index 2400940..da1b7bd 100644 --- a/jugendhackt/config.ini +++ b/jugendhackt/config.ini @@ -1,39 +1,52 @@ -[default] +[meta] schedule = https://pretalx.c3voc.de/jhhh23/schedule/export/schedule.xml +;; path to background video template = intro-background.ts +;; whether background video uses transparency (needs to be .mov) alpha = false +;; whether background video is prores 4444 prores = false -fontfile = true -inout = t +;; in and out time format: t for seconds, n for frame number +inout_type = t +;; Some font settings can have defaults, which can be overridden in the +;; 'title', 'speaker' and 'text' sections below. +[default] +;; default font (either use 'fontfamily' or 'fontfile') +; fontfamily = arial +fontfile = SourceSansPro-Semibold.ttf +;; default font color +fontcolor = #ffffff + +;; fields for title and speaker names are empty in the template.ts, so we'll render them in via ffmpeg +;; parameters are: +;; - in: start frame/ time +;; - out: end frame/ time +;; - fontfamily: font family +;; - fontfile: font file +;; - fontcolor: font color +;; - fontsize: font size (pixel) +;; - x: horizontal position (top left corner) +;; - y: vertical position (top left corner) [title] in = 1 out = 9.5 -fontfamily = -fontfile = SourceSansPro-Semibold.ttf fontsize = 67 -fontcolor = #ffffff x = 400 y = 870 [speaker] in = 2 out = 9 -fontfamily = -fontfile = SourceSansPro-Semibold.ttf fontsize = 50 -fontcolor = #ffffff x = 400 y = 950 - +;; optional extra text [text] in = 0 out = 0 -fontfamily = -fontfile = SourceSansPro-Semibold.ttf fontsize = 0 -fontcolor = #ffffff x = 0 y = 0 text = '' diff --git a/make-ffmpeg.py b/make-ffmpeg.py index 0fbc353..3b69978 100755 --- a/make-ffmpeg.py +++ b/make-ffmpeg.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 # vim: tabstop=4 shiftwidth=4 expandtab +"""See jugendhackt/config.ini for some config file documentation.""" + import os import sys import subprocess @@ -21,33 +23,39 @@ class TextConfig: x: int y: int - use_fontfile: bool - fontfile: str fontfile_path: str fontfamily: str fontsize: int - fontcolor: str = "#ffffff" + fontcolor: str bordercolor: str = None # border is added, if a color is set - def parse(self, cparser_sect, use_fontfile: bool): + def uses_fontfile(self): + return self.fontfile_path is not None + + def parse(self, cparser_sect, default_fontfile, default_fontfamily, default_fontcolor): self.inpoint = cparser_sect.getfloat('in') self.outpoint = cparser_sect.getfloat('out') self.x = cparser_sect.getint('x') self.y = cparser_sect.getint('y') - self.use_fontfile = use_fontfile - if use_fontfile: - self.fontfile = cparser_sect.get('fontfile') - self.fontfile_path = str(PurePath(args.project, self.fontfile).as_posix()) + self.fontcolor = cparser_sect.get('fontcolor', default_fontcolor) + + fontfile = cparser_sect.get('fontfile', default_fontfile) + fontfamily = cparser_sect.get('fontfamily', default_fontfamily) + if fontfile != None and fontfamily is None: + self.fontfile_path = str(PurePath(args.project, fontfile).as_posix()) if not os.path.exists(self.fontfile_path): error("Font file {} in Project Path is missing".format(self.fontfile_path)) + + elif fontfamily != None and fontfile is None: + self.fontfamily = fontfamily + else: - self.fontfamily = cparser_sect.get('fontfamily') + error("Either provide a 'fontfamily' or 'fontfile', not both") self.fontsize = cparser_sect.getint('fontsize') - self.fontcolor = cparser_sect.get('fontcolor', self.fontcolor) self.bordercolor = cparser_sect.get('bordercolor', None) def fit_text(self, text: str): @@ -63,7 +71,7 @@ class TextConfig: filter_str = "drawtext=enable='between({},{},{})'".format( inout_type, self.inpoint, self.outpoint) - if self.use_fontfile: + if self.uses_fontfile(): filter_str += ":fontfile='{}'".format(self.fontfile_path) else: filter_str += ":font='{}'".format(self.fontfamily) @@ -82,7 +90,6 @@ class Config: template_file: str # video background alpha: bool = False prores: bool = False - use_fontfile: bool = False inout_type: str = "t" # in and out time format: t for seconds, n for frame number fileext: str @@ -102,21 +109,25 @@ def parse_config(filename) -> Config: cparser = ConfigParser() cparser.read(filename) - defaults = cparser['default'] - conf.schedule = defaults.get('schedule') - infile = PurePath(args.project, defaults.get('template')) + meta = cparser['meta'] + conf.schedule = meta.get('schedule') + infile = PurePath(args.project, meta.get('template')) conf.template_file = str(infile) - conf.alpha = defaults.getboolean('alpha', conf.alpha) - conf.prores = defaults.getboolean('prores', conf.prores) - conf.use_fontfile = defaults.get('fontfile', conf.use_fontfile) - conf.inout_type = defaults.get('inout', conf.inout_type) + conf.alpha = meta.getboolean('alpha', conf.alpha) + conf.prores = meta.getboolean('prores', conf.prores) + conf.inout_type = meta.get('inout_type', conf.inout_type) + + defaults = cparser['default'] + default_fontfile = defaults.get('fontfile', None) + default_fontfamily = defaults.get('fontfamily', None) + default_fontcolor = defaults.get('fontcolor', "#ffffff") conf.title = TextConfig() - conf.title.parse(cparser['title'], conf.use_fontfile) + conf.title.parse(cparser['title'], default_fontfile, default_fontfamily, default_fontcolor) conf.speaker = TextConfig() - conf.speaker.parse(cparser['speaker'], conf.use_fontfile) + conf.speaker.parse(cparser['speaker'], default_fontfile, default_fontfamily, default_fontcolor) conf.text = TextConfig() - conf.text.parse(cparser['text'], conf.use_fontfile) + conf.text.parse(cparser['text'], default_fontfile, default_fontfamily, default_fontcolor) conf.text_text = cparser['text'].get('text', '') diff --git a/mrmcd2019/config.ini b/mrmcd2019/config.ini index 165753c..30da816 100755 --- a/mrmcd2019/config.ini +++ b/mrmcd2019/config.ini @@ -1,16 +1,14 @@ -[default] +[meta] #schedule = https://talks.mrmcd.net/2019/schedule/export/schedule.xml schedule = file:///home/thorti/git/c3voc/intro-outro-generator/mrmcd2019/schedule.xml template = mrmcd2019.mov alpha = false prores = false -fontfile = true -inout = n +inout_type = n [title] in = 50 out = 225 -fontfamily = fontfile = Jura-Bold.ttf fontsize = 80 fontcolor = #47acda @@ -20,7 +18,6 @@ y = 540 [speaker] in = 75 out = 225 -fontfamily = fontfile = Jura-Regular.ttf fontsize = 50 fontcolor = #094762 @@ -30,7 +27,6 @@ y = 950 [text] in = 242 out = 324 -fontfamily = fontfile = Jura-Regular.ttf fontsize = 45 fontcolor = #c68100 diff --git a/vcfb24/config.ini b/vcfb24/config.ini index 0fb3ad3..fff89ad 100644 --- a/vcfb24/config.ini +++ b/vcfb24/config.ini @@ -1,4 +1,4 @@ -[default] +[meta] schedule = http://vcfb.de/2024/schedule.xml # ffmpeg -loop 1 -i intro.png -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -c:v libx264 -tune stillimage -pix_fmt yuv420p -c:a aac -r 25 -t 10 intro.mp4 template = intro.mp4 From 31f01ca3861bbbb42a231587f7f1a4d287575270 Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sat, 2 Nov 2024 17:21:47 +0100 Subject: [PATCH 17/26] make-ffmpeg: Use fit_text from make-ffmpeg-fade (break into lines array) --- camp2023/config.ini | 2 +- cccamp19/config.ini | 2 +- denog11/config.ini | 2 +- jh19-berlin/config.ini | 2 +- jh20-jue/config.ini | 2 +- jh21-rn/config.ini | 2 +- jugendhackt/config.ini | 4 +- make-ffmpeg.py | 84 ++++++++++++++++++++++++++---------------- mrmcd2019/config.ini | 2 +- vcfb24/config.ini | 2 +- 10 files changed, 63 insertions(+), 41 deletions(-) diff --git a/camp2023/config.ini b/camp2023/config.ini index 5dbefd6..e8c7ab6 100644 --- a/camp2023/config.ini +++ b/camp2023/config.ini @@ -31,5 +31,5 @@ fontsize = 45 fontcolor = #FB48C4 x = (w-text_w)/2 y = 1000 -text = 'Chaos Communication Camp 2023' +text = Chaos Communication Camp 2023 diff --git a/cccamp19/config.ini b/cccamp19/config.ini index 0316909..d723d7d 100644 --- a/cccamp19/config.ini +++ b/cccamp19/config.ini @@ -31,5 +31,5 @@ fontsize = 45 fontcolor = #c68100 x = (w-text_w)/2 y = 927 -text = 'chaos communication camp 2019' +text = chaos communication camp 2019 diff --git a/denog11/config.ini b/denog11/config.ini index 0716e7e..89c8096 100644 --- a/denog11/config.ini +++ b/denog11/config.ini @@ -31,5 +31,5 @@ fontsize = 45 fontcolor = #ffffff x = 640 y = 1000 -text = '' +; text = diff --git a/jh19-berlin/config.ini b/jh19-berlin/config.ini index 171ea67..73365a8 100644 --- a/jh19-berlin/config.ini +++ b/jh19-berlin/config.ini @@ -31,5 +31,5 @@ fontsize = 45 fontcolor = #c68100 x = (w-text_w)/2 y = 927 -text = '' +; text = diff --git a/jh20-jue/config.ini b/jh20-jue/config.ini index 7f65b89..d48087f 100644 --- a/jh20-jue/config.ini +++ b/jh20-jue/config.ini @@ -42,7 +42,7 @@ fontsize = 45 fontcolor = #ffffff x = 640 y = 1000 -text = '' +; text = ; build intros via diff --git a/jh21-rn/config.ini b/jh21-rn/config.ini index 8c25d4d..626db55 100644 --- a/jh21-rn/config.ini +++ b/jh21-rn/config.ini @@ -31,5 +31,5 @@ fontsize = 45 fontcolor = #ffffff x = 1920 y = 1080 -text = '' +; text = diff --git a/jugendhackt/config.ini b/jugendhackt/config.ini index da1b7bd..8af8ab6 100644 --- a/jugendhackt/config.ini +++ b/jugendhackt/config.ini @@ -42,11 +42,11 @@ fontsize = 50 x = 400 y = 950 -;; optional extra text +;; optional extra text, comment out "text" field to disable [text] in = 0 out = 0 fontsize = 0 x = 0 y = 0 -text = '' +;text = some additional text diff --git a/make-ffmpeg.py b/make-ffmpeg.py index 3b69978..aa67320 100755 --- a/make-ffmpeg.py +++ b/make-ffmpeg.py @@ -16,6 +16,8 @@ from PIL import ImageFont import schedulelib ssl._create_default_https_context = ssl._create_unverified_context +FRAME_WIDTH = 1920 + class TextConfig: inpoint: float @@ -58,31 +60,41 @@ class TextConfig: self.fontsize = cparser_sect.getint('fontsize') self.bordercolor = cparser_sect.get('bordercolor', None) - def fit_text(self, text: str): - global translation_font - translation_font = ImageFont.truetype( + def fit_text(self, text: str) -> list[str]: + if not text: + return [""] + + font = ImageFont.truetype( self.fontfile_path, size=self.fontsize, encoding="unic") # TODO: Make this work with font family as well! - return fit_text(text, (1920-self.x-100)) + return fit_text(text, (FRAME_WIDTH-self.x-100), font) - def get_ffmpeg_filter(self, inout_type: str, text: str): - filter_str = "drawtext=enable='between({},{},{})'".format( - inout_type, self.inpoint, self.outpoint) + def get_ffmpeg_filter(self, inout_type: str, text: list[str]): + if not text: + return "" - if self.uses_fontfile(): - filter_str += ":fontfile='{}'".format(self.fontfile_path) - else: - filter_str += ":font='{}'".format(self.fontfamily) + filter_str = "" + for idx, line in enumerate(text): + filter_str += "drawtext=enable='between({},{},{})'".format( + inout_type, self.inpoint, self.outpoint) - if self.bordercolor is not None: - filter_str += ":borderw={}:bordercolor={}".format(self.fontsize / 30, self.bordercolor) + if self.uses_fontfile(): + filter_str += ":fontfile='{}'".format(self.fontfile_path) + else: + filter_str += ":font='{}'".format(self.fontfamily) - filter_str += ":fontsize={0}:fontcolor={1}:x={2}:y={3}:text={4}".format( - self.fontsize, self.fontcolor, self.x, self.y, ffmpeg_escape_str(text)) + if self.bordercolor is not None: + filter_str += ":borderw={}:bordercolor={}".format( + self.fontsize / 30, self.bordercolor) - return filter_str + filter_str += ":fontsize={0}:fontcolor={1}:x={2}:y={3}:text={4}".format( + self.fontsize, self.fontcolor, self.x, self.y + (idx*self.fontsize), ffmpeg_escape_str(line)) + + filter_str += "," + + return filter_str[:-1] class Config: @@ -97,7 +109,7 @@ class Config: title: TextConfig speaker: TextConfig text: TextConfig - text_text: str = "" # additional text + extra_text: str = "" # additional text def parse_config(filename) -> Config: @@ -129,7 +141,7 @@ def parse_config(filename) -> Config: conf.text = TextConfig() conf.text.parse(cparser['text'], default_fontfile, default_fontfamily, default_fontcolor) - conf.text_text = cparser['text'].get('text', '') + conf.extra_text = cparser['text'].get('text', '') conf.fileext = infile.suffix @@ -165,20 +177,29 @@ def event_print(event, message): print("{} – {}".format(describe_event(event), message)) -def fit_text(string: str, frame_width): +def fit_text(string: str, max_width: int, font: ImageFont) -> list[str]: + """Break text into array of strings which fit certain a width (in pixels) for the specified font.""" + split_line = [x.strip() for x in string.split()] - lines = "" - line = "" + lines = [] + w = 0 + line = [] for word in split_line: - left, top, right, bottom = translation_font.getbbox(" ".join([line, word])) - width, height = right - left, bottom - top - if width > (frame_width - (2 * 6)): - lines += line.strip() + "\n" - line = "" + new_line = line + [word.rstrip(':')] + w = font.getlength(" ".join(new_line)) + if w > max_width: + lines.append(' '.join(line)) + line = [] - line += word + " " + line.append(word.rstrip(':')) + + if word.endswith(':'): + lines.append(' '.join(line)) + line = [] + + if line: + lines.append(' '.join(line)) - lines += line.strip() return lines @@ -210,9 +231,10 @@ def enqueue_job(conf: Config, event): title = conf.title.fit_text(event_title) speakers = conf.speaker.fit_text(event_personnames) + extra_text = conf.text.fit_text(conf.extra_text) if args.debug: - print('Title: ', title) + print('Title: ', title) print('Speaker: ', speakers) if platform.system() == 'Windows': @@ -222,7 +244,7 @@ def enqueue_job(conf: Config, event): videofilter = conf.title.get_ffmpeg_filter(conf.inout_type, title) + "," videofilter += conf.speaker.get_ffmpeg_filter(conf.inout_type, speakers) + "," - videofilter += conf.text.get_ffmpeg_filter(conf.inout_type, conf.text_text) + videofilter += conf.text.get_ffmpeg_filter(conf.inout_type, extra_text) cmd = [ffmpeg_path, '-y', '-i', conf.template_file, '-vf', videofilter] @@ -298,7 +320,7 @@ if __name__ == "__main__": persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko',] events = [{ 'id': 'debug', - 'title': 'wallet.fail', + 'title': 'wallet.fail and the longest talk title to test if the template is big enough', 'subtitle': 'Hacking the most popular cryptocurrency hardware wallets', 'persons': persons, 'personnames': ', '.join(persons), diff --git a/mrmcd2019/config.ini b/mrmcd2019/config.ini index 30da816..fb74efc 100755 --- a/mrmcd2019/config.ini +++ b/mrmcd2019/config.ini @@ -32,4 +32,4 @@ fontsize = 45 fontcolor = #c68100 x = (w-text_w)/2 y = 927 -text = '' +; text = diff --git a/vcfb24/config.ini b/vcfb24/config.ini index fff89ad..b363273 100644 --- a/vcfb24/config.ini +++ b/vcfb24/config.ini @@ -34,4 +34,4 @@ fontsize = 0 fontcolor = #ffffff x = 0 y = 0 -text = '' +; text = From 8933550f31688ffeb56c1d2ce83a824b0104fcdd Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sat, 2 Nov 2024 17:23:10 +0100 Subject: [PATCH 18/26] make-ffmpeg: Combine with make-ffmpeg-fade --- jugendhackt/config.ini | 2 + make-ffmpeg-fade.py | 326 +---------------------------------------- make-ffmpeg.py | 20 ++- requirements.txt | 2 +- vcfb24/config.ini | 10 +- 5 files changed, 26 insertions(+), 334 deletions(-) diff --git a/jugendhackt/config.ini b/jugendhackt/config.ini index 8af8ab6..4f507cd 100644 --- a/jugendhackt/config.ini +++ b/jugendhackt/config.ini @@ -8,6 +8,8 @@ alpha = false prores = false ;; in and out time format: t for seconds, n for frame number inout_type = t +;; fade-in duration (seconds), leave out or set to zero to disable +;fade_duration = 0.5 ;; Some font settings can have defaults, which can be overridden in the ;; 'title', 'speaker' and 'text' sections below. diff --git a/make-ffmpeg-fade.py b/make-ffmpeg-fade.py index 976c858..3c1eecd 100755 --- a/make-ffmpeg-fade.py +++ b/make-ffmpeg-fade.py @@ -1,327 +1,5 @@ #!/usr/bin/env python3 # vim: tabstop=4 shiftwidth=4 expandtab -import os -import sys -import subprocess -import renderlib -import schedulelib -import argparse -import shlex -from PIL import ImageFont -from configparser import ConfigParser -import json - -# Parse arguments -parser = argparse.ArgumentParser( - description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg', - usage="./make-ffmpeg.py yourproject/", - formatter_class=argparse.RawTextHelpFormatter) - -parser.add_argument('project', action="store", metavar='Project folder', type=str, help=''' - Path to your project folder - ''') - -parser.add_argument('--debug', action="store_true", default=False, help=''' - Run script in debug mode and render with placeholder texts, - not parsing or accessing a schedule. - This argument must not be used together with --id - Usage: ./make-ffmpeg.py yourproject/ --debug - ''') - -parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help=''' - Only render the given ID(s) from your projects schedule. - This argument must not be used together with --debug - Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337 - ''') - -parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help=''' - Only render the given room(s) from your projects schedule. - This argument must not be used together with --debug - Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal" - ''') - -parser.add_argument('--skip', nargs='+', action="store", type=str, help=''' - Skip ID(s) not needed to be rendered. - Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337 - ''') - -parser.add_argument('--force', action="store_true", default=False, help=''' - Force render if file exists. - ''') - -args = parser.parse_args() - -if (args.skip is None): - args.skip = [] - - -def headline(str): - print("##################################################") - print(str) - print("##################################################") - print() - - -def error(str): - headline(str) - parser.print_help() - sys.exit(1) - - -cparser = ConfigParser() -cparser.read(os.path.join(os.path.dirname(args.project), 'config.ini')) -template = cparser['default']['template'] -alpha = cparser['default']['alpha'] -prores = cparser['default']['prores'] - -fade_duration = 0.5 - -title_in = float(cparser['title']['in']) -title_out = float(cparser['title']['out']) -title_duration = title_out - title_in -title_font = cparser['title']['font'] -title_fontsize = int(cparser['title']['fontsize']) -title_fontcolor = cparser['title']['fontcolor'] -title_x = int(cparser['title']['x']) -title_y = int(cparser['title']['y']) - -speaker_in = float(cparser['speaker']['in']) -speaker_out = float(cparser['speaker']['out']) -speaker_duration = speaker_out - speaker_in -speaker_font = cparser['speaker']['font'] -speaker_fontsize = int(cparser['speaker']['fontsize']) -speaker_fontcolor = cparser['speaker']['fontcolor'] -speaker_x = int(cparser['speaker']['x']) -speaker_y = int(cparser['speaker']['y']) - -text_in = float(cparser['text']['in']) -text_out = float(cparser['text']['out']) -text_duration = text_out - text_in -text_font = cparser['text']['font'] -text_fontsize = int(cparser['text']['fontsize']) -text_fontcolor = cparser['text']['fontcolor'] -text_x = int(cparser['text']['x']) -text_y = int(cparser['text']['y']) -text_text = cparser['text']['text'] - -font_t = os.path.join(os.path.dirname(args.project), title_font) -font_s = os.path.join(os.path.dirname(args.project), speaker_font) -font_tt = os.path.join(os.path.dirname(args.project), text_font) - -fileformat = os.path.splitext(template)[1] -infile = os.path.join(os.path.dirname(args.project), template) - -schedule = cparser['default']['schedule'] - -if not (os.path.exists(os.path.join(args.project, template))): - error("Template file {} in Project Path is missing".format(template)) - -for ffile in (title_font, speaker_font, text_font): - if not (os.path.exists(os.path.join(args.project, ffile))): - error("Font file {} in Project Path is missing".format(ffile)) - -if not (os.path.exists(os.path.join(args.project, 'config.ini'))): - error("config.ini file in Project Path is missing") - -if alpha == 'true' and not fileformat == '.mov': - error("Alpha can only be rendered with .mov source files") - -if not args.project: - error("The Project Path is a required argument") - -if not args.debug and not schedule: - error("Either specify --debug or supply a schedule in config.ini") - -if args.debug: - persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko'] - events = [{ - 'id': 'debug', - 'title': 'wallet.fail', - 'subtitle': 'Hacking the most popular cryptocurrency hardware wallets', - 'persons': persons, - 'personnames': ', '.join(persons), - 'room': 'Borg', - }] - -else: - events = list(schedulelib.events(schedule)) - - -def describe_event(event): - return "#{}: {}".format(event['id'], event['title']) - - -def event_print(event, message): - print("{} – {}".format(describe_event(event), message)) - - -def fmt_command(command, **kwargs): - args = {} - for key, value in kwargs.items(): - args[key] = shlex.quote(value) - - command = command.format(**args) - return shlex.split(command) - - -def run(command, **kwargs): - return subprocess.check_call( - fmt_command(command, **kwargs), - stderr=subprocess.STDOUT, - stdout=subprocess.DEVNULL) - - -def fit_text(string: str, frame_width): - split_line = [x.strip() for x in string.split()] - lines = [] - w = 0 - line_num = 0 - line = [] - for word in split_line: - new_line = line + [word.rstrip(':')] - w, _ = translation_font.getsize(" ".join(new_line)) - print(w, new_line) - if w > frame_width: - print("too wide, breaking", line) - lines.append(' '.join(line)) - line = [] - - line.append(word.rstrip(':')) - - if word.endswith(':'): - print(':, breaking', line) - lines.append(' '.join(line)) - line = [] - - if line: - lines.append(' '.join(line)) - return lines - - -def fit_title(string: str): - global translation_font - translation_font = ImageFont.truetype(font_t, size=title_fontsize-10, encoding="unic") - title = fit_text(string, 1080) - - return title - - -def fit_speaker(string: str): - global translation_font - translation_font = ImageFont.truetype(font_s, size=speaker_fontsize-10, encoding="unic") - speaker = fit_text(string, 1080) - - return speaker - - -def enqueue_job(event): - event_id = str(event['id']) - if event_id in args.skip: - event_print(event, "skipping " + str(event['id'])) - return - if (os.path.exists(os.path.join(args.project, event_id + '.ts')) or os.path.exists(os.path.join(args.project, event_id + '.mov'))) and not args.force: - event_print(event, "file exist, skipping " + str(event['id'])) - return - - event_title = str(event['title']) - event_personnames = str(event['personnames']) - event_title = event_title.replace('"', '') - event_title = event_title.replace('\'', '') - event_personnames = event_personnames.replace('"', '') - - t = fit_title(event_title) - s = fit_speaker(event_personnames) - print(s) - - if args.debug: - print('Title: ', t) - print('Speaker: ', s) - - outfile = os.path.join(os.path.dirname(args.project), event_id + '.ts') - - videofilter = "" - for idx, line in enumerate(t): - 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 + (idx * title_fontsize), - text=line) - 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, - fade_in_end_time=title_in + fade_duration, - fade_out_start_time=title_in + fade_duration + title_duration, - fade_out_end_time=title_in + fade_duration + title_duration + fade_duration, - fade_duration=fade_duration - ) - - for idx, line in enumerate(s): - 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 + (idx * speaker_fontsize), - text=line) - 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, - fade_in_end_time=speaker_in + fade_duration, - fade_out_start_time=speaker_in + fade_duration + speaker_duration, - fade_out_end_time=speaker_in + fade_duration + speaker_duration + fade_duration, - fade_duration=fade_duration - ) - - if fileformat == '.mov': - if alpha == 'true': - if prores == 'true': - cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -vcodec prores_ks -pix_fmt yuva444p10le -profile:v 4444 -shortest -movflags faststart -f mov "{2}"'.format( - infile, videofilter, outfile) - else: - cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -shortest -c:v qtrle -movflags faststart -f mov "{2}"'.format( - infile, videofilter, outfile) - else: - cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format( - infile, videofilter, outfile) - else: - cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -pix_fmt:v yuv420p -qscale:v 2 -qmin:v 2 -qmax:v 7 -keyint_min 0 -bf 0 -g 0 -maxrate:0 90M -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format( - infile, videofilter, outfile) - - if args.debug: - print(cmd) - - run(cmd) - - return event_id - - -if args.ids: - if len(args.ids) == 1: - print("enqueuing {} job".format(len(args.ids))) - else: - print("enqueuing {} jobs".format(len(args.ids))) -else: - if len(events) == 1: - print("enqueuing {} job".format(len(events))) - else: - print("enqueuing {} jobs".format(len(events))) - - -for event in events: - if args.ids and event['id'] not in args.ids: - continue - - if args.rooms and event['room'] not in args.rooms: - print("skipping room %s (%s)" % (event['room'], event['title'])) - continue - - event_print(event, "enqueued as " + str(event['id'])) - - job_id = enqueue_job(event) - if not job_id: - event_print(event, "job was not enqueued successfully, skipping postprocessing") - continue - - -print('all done') +print("ERROR: The functionality of this script was added to 'make-ffmpeg.py'!") +print("Specify meta.fade_duration = 0.5 in the config.ini for the same effect.") diff --git a/make-ffmpeg.py b/make-ffmpeg.py index aa67320..68d2bf2 100755 --- a/make-ffmpeg.py +++ b/make-ffmpeg.py @@ -71,10 +71,11 @@ class TextConfig: return fit_text(text, (FRAME_WIDTH-self.x-100), font) - def get_ffmpeg_filter(self, inout_type: str, text: list[str]): + def get_ffmpeg_filter(self, inout_type: str, fade_time: float, text: list[str]): if not text: return "" + text_duration = self.outpoint - self.inpoint filter_str = "" for idx, line in enumerate(text): filter_str += "drawtext=enable='between({},{},{})'".format( @@ -92,6 +93,14 @@ class TextConfig: filter_str += ":fontsize={0}:fontcolor={1}:x={2}:y={3}:text={4}".format( self.fontsize, self.fontcolor, self.x, self.y + (idx*self.fontsize), ffmpeg_escape_str(line)) + if fade_time > 0: + filter_str += ":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=self.inpoint, + fade_in_end_time=self.inpoint + fade_time, + fade_out_start_time=self.inpoint + fade_time + text_duration, + fade_out_end_time=self.inpoint + fade_time + text_duration + fade_time, + fade_duration=fade_time) + filter_str += "," return filter_str[:-1] @@ -103,6 +112,7 @@ class Config: alpha: bool = False prores: bool = False inout_type: str = "t" # in and out time format: t for seconds, n for frame number + fade_duration: float = 0 # fade duration in seconds, 0 to disable fileext: str @@ -128,6 +138,7 @@ def parse_config(filename) -> Config: conf.alpha = meta.getboolean('alpha', conf.alpha) conf.prores = meta.getboolean('prores', conf.prores) conf.inout_type = meta.get('inout_type', conf.inout_type) + conf.fade_duration = meta.getfloat('fade_duration', conf.fade_duration) defaults = cparser['default'] default_fontfile = defaults.get('fontfile', None) @@ -242,9 +253,10 @@ def enqueue_job(conf: Config, event): else: ffmpeg_path = 'ffmpeg' - videofilter = conf.title.get_ffmpeg_filter(conf.inout_type, title) + "," - videofilter += conf.speaker.get_ffmpeg_filter(conf.inout_type, speakers) + "," - videofilter += conf.text.get_ffmpeg_filter(conf.inout_type, extra_text) + videofilter = conf.title.get_ffmpeg_filter(conf.inout_type, conf.fade_duration, title) + "," + videofilter += conf.speaker.get_ffmpeg_filter(conf.inout_type, + conf.fade_duration, speakers) + "," + videofilter += conf.text.get_ffmpeg_filter(conf.inout_type, conf.fade_duration, extra_text) cmd = [ffmpeg_path, '-y', '-i', conf.template_file, '-vf', videofilter] diff --git a/requirements.txt b/requirements.txt index 181482a..f8a9b74 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -pillow +pillow>=8.0.0 cssutils==1.0.2 lxml==4.9.1 svg.path==4.0.2 diff --git a/vcfb24/config.ini b/vcfb24/config.ini index b363273..712eff6 100644 --- a/vcfb24/config.ini +++ b/vcfb24/config.ini @@ -4,13 +4,13 @@ schedule = http://vcfb.de/2024/schedule.xml template = intro.mp4 alpha = false prores = false -fontfile = true -inout = t +inout_type = t +fade_duration = 0.5 [title] in = 1 out = 9.5 -font = Computerfont.ttf +fontfile = Computerfont.ttf fontsize = 100 fontcolor = #ffffff x = 85 @@ -19,7 +19,7 @@ y = 122 [speaker] in = 2 out = 9 -font = SourceSansPro-Semibold.ttf +fontfile = SourceSansPro-Semibold.ttf fontsize = 65 fontcolor = #ffffff x = 85 @@ -29,7 +29,7 @@ y = 861 [text] in = 0 out = 0 -font = Computerfont.ttf +fontfile = Computerfont.ttf fontsize = 0 fontcolor = #ffffff x = 0 From ca224b9d84ac376149a009aaa30304a9ec9c0fb3 Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sat, 2 Nov 2024 20:16:06 +0100 Subject: [PATCH 19/26] make-ffmpeg: Remove fontfamily option as it doesn't work --- jh20-jue/config.ini | 20 ++++++++++---------- jugendhackt/config.ini | 4 +--- make-ffmpeg.py | 40 +++++++++++----------------------------- 3 files changed, 22 insertions(+), 42 deletions(-) diff --git a/jh20-jue/config.ini b/jh20-jue/config.ini index d48087f..05878cf 100644 --- a/jh20-jue/config.ini +++ b/jh20-jue/config.ini @@ -8,26 +8,28 @@ prores = false ; in and out time format: t for seconds, n for frame number inout = n -; fields for title and speaker names are empty in the template.ts, so we'll render them in via ffmpeg +;; Some font settings can have defaults, which can be overridden in the +;; 'title', 'speaker' and 'text' sections below. +[default] +;; default font +fontfile = ebisu.ttf +;; default font color +fontcolor = #ffffff + +;; fields for title and speaker names are empty in the template.ts, so we'll render them in via ffmpeg [title] ; inframe for title in = 20 -; outframe for totle +; outframe for title out = 225 -; title font (either font family or file, see default setting above) -fontfile = ebisu.ttf ; title font size fontsize = 70 -; title color -fontcolor = #ffffff -; title position from upper left corner x = 600 y = 865 [speaker] in = 40 out = 225 -fontfile = ebisu.ttf fontsize = 40 fontcolor = #eeeeee x = 600 @@ -37,9 +39,7 @@ y = 950 [text] in = 3 out = 4 -fontfile = ebisu.ttf fontsize = 45 -fontcolor = #ffffff x = 640 y = 1000 ; text = diff --git a/jugendhackt/config.ini b/jugendhackt/config.ini index 4f507cd..94180a5 100644 --- a/jugendhackt/config.ini +++ b/jugendhackt/config.ini @@ -14,8 +14,7 @@ inout_type = t ;; Some font settings can have defaults, which can be overridden in the ;; 'title', 'speaker' and 'text' sections below. [default] -;; default font (either use 'fontfamily' or 'fontfile') -; fontfamily = arial +;; default font fontfile = SourceSansPro-Semibold.ttf ;; default font color fontcolor = #ffffff @@ -24,7 +23,6 @@ fontcolor = #ffffff ;; parameters are: ;; - in: start frame/ time ;; - out: end frame/ time -;; - fontfamily: font family ;; - fontfile: font file ;; - fontcolor: font color ;; - fontsize: font size (pixel) diff --git a/make-ffmpeg.py b/make-ffmpeg.py index 68d2bf2..94d1514 100755 --- a/make-ffmpeg.py +++ b/make-ffmpeg.py @@ -26,8 +26,6 @@ class TextConfig: y: int fontfile_path: str - fontfamily: str - fontsize: int fontcolor: str bordercolor: str = None # border is added, if a color is set @@ -35,7 +33,7 @@ class TextConfig: def uses_fontfile(self): return self.fontfile_path is not None - def parse(self, cparser_sect, default_fontfile, default_fontfamily, default_fontcolor): + def parse(self, cparser_sect, default_fontfile, default_fontcolor): self.inpoint = cparser_sect.getfloat('in') self.outpoint = cparser_sect.getfloat('out') self.x = cparser_sect.getint('x') @@ -44,18 +42,10 @@ class TextConfig: self.fontcolor = cparser_sect.get('fontcolor', default_fontcolor) fontfile = cparser_sect.get('fontfile', default_fontfile) - fontfamily = cparser_sect.get('fontfamily', default_fontfamily) - if fontfile != None and fontfamily is None: - self.fontfile_path = str(PurePath(args.project, fontfile).as_posix()) + self.fontfile_path = str(PurePath(args.project, fontfile).as_posix()) - if not os.path.exists(self.fontfile_path): - error("Font file {} in Project Path is missing".format(self.fontfile_path)) - - elif fontfamily != None and fontfile is None: - self.fontfamily = fontfamily - - else: - error("Either provide a 'fontfamily' or 'fontfile', not both") + if not os.path.exists(self.fontfile_path): + error("Font file {} in Project Path is missing".format(self.fontfile_path)) self.fontsize = cparser_sect.getint('fontsize') self.bordercolor = cparser_sect.get('bordercolor', None) @@ -67,8 +57,6 @@ class TextConfig: font = ImageFont.truetype( self.fontfile_path, size=self.fontsize, encoding="unic") - # TODO: Make this work with font family as well! - return fit_text(text, (FRAME_WIDTH-self.x-100), font) def get_ffmpeg_filter(self, inout_type: str, fade_time: float, text: list[str]): @@ -78,21 +66,16 @@ class TextConfig: text_duration = self.outpoint - self.inpoint filter_str = "" for idx, line in enumerate(text): - filter_str += "drawtext=enable='between({},{},{})'".format( - inout_type, self.inpoint, self.outpoint) + filter_str += "drawtext=enable='between({},{},{})':x={}:y={}".format( + inout_type, self.inpoint, self.outpoint, self.x, self.y + (idx*self.fontsize)) - if self.uses_fontfile(): - filter_str += ":fontfile='{}'".format(self.fontfile_path) - else: - filter_str += ":font='{}'".format(self.fontfamily) + filter_str += ":fontfile='{}':fontsize={}:fontcolor={}:text={}".format( + self.fontfile_path, self.fontsize, self.fontcolor, ffmpeg_escape_str(line)) if self.bordercolor is not None: filter_str += ":borderw={}:bordercolor={}".format( self.fontsize / 30, self.bordercolor) - filter_str += ":fontsize={0}:fontcolor={1}:x={2}:y={3}:text={4}".format( - self.fontsize, self.fontcolor, self.x, self.y + (idx*self.fontsize), ffmpeg_escape_str(line)) - if fade_time > 0: filter_str += ":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=self.inpoint, @@ -142,15 +125,14 @@ def parse_config(filename) -> Config: defaults = cparser['default'] default_fontfile = defaults.get('fontfile', None) - default_fontfamily = defaults.get('fontfamily', None) default_fontcolor = defaults.get('fontcolor', "#ffffff") conf.title = TextConfig() - conf.title.parse(cparser['title'], default_fontfile, default_fontfamily, default_fontcolor) + conf.title.parse(cparser['title'], default_fontfile, default_fontcolor) conf.speaker = TextConfig() - conf.speaker.parse(cparser['speaker'], default_fontfile, default_fontfamily, default_fontcolor) + conf.speaker.parse(cparser['speaker'], default_fontfile, default_fontcolor) conf.text = TextConfig() - conf.text.parse(cparser['text'], default_fontfile, default_fontfamily, default_fontcolor) + conf.text.parse(cparser['text'], default_fontfile, default_fontcolor) conf.extra_text = cparser['text'].get('text', '') From 2451c0f25f66662ee5b17d1d17247b7cd0c31afc Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Sat, 2 Nov 2024 21:49:30 +0100 Subject: [PATCH 20/26] bump some versions in requirements.txt - lxml 5 works - svg.path has no breaking changes according to change log - cssutils has a v2, but didn't find a changelog --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index f8a9b74..efa6214 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ pillow>=8.0.0 cssutils==1.0.2 -lxml==4.9.1 -svg.path==4.0.2 -Wand==0.6.5 +lxml~=5.3 +svg.path~=6.0 +Wand~=0.6.5 From d8c198f98496bb910b4c872ef888acf3d687e0e0 Mon Sep 17 00:00:00 2001 From: Lukas Schauer Date: Tue, 12 Nov 2024 11:38:27 +0100 Subject: [PATCH 21/26] god2024 --- god2024/__init__.py | 145 ++++++++++++++++++++++++++++++++++++++ god2024/artwork/intro.svg | 101 ++++++++++++++++++++++++++ god2024/artwork/outro.svg | 131 ++++++++++++++++++++++++++++++++++ god2024/artwork/pause.svg | 78 ++++++++++++++++++++ 4 files changed, 455 insertions(+) create mode 100644 god2024/__init__.py create mode 100644 god2024/artwork/intro.svg create mode 100644 god2024/artwork/outro.svg create mode 100644 god2024/artwork/pause.svg diff --git a/god2024/__init__.py b/god2024/__init__.py new file mode 100644 index 0000000..c04c938 --- /dev/null +++ b/god2024/__init__.py @@ -0,0 +1,145 @@ +#!/usr/bin/python3 + +from renderlib import * +from schedulelib import * +from easing import * + +# URL to Schedule-XML +scheduleUrl = 'https://import.c3voc.de/schedule/god2024.xml?showall=yes' + +titlemap = { + +} + +def introFrames(p): + givenFrame = 0 + + nr = p['$id']; + + # 1 Sekunden nix + frames = 1*fps + for i in range(0, frames): + givenFrame += 1 + yield ( + ('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)), + ('layer1', 'style', 'opacity', "%.4f" % 0), # nix + # ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)), + ) + + # 1 Sekunde Text Fadein + frames = 1*fps + for i in range(0, frames): + givenFrame += 1 + yield ( + ('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)), + ('layer1', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)), + # ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)), + ) + + # 5 Sekunden Text + frames = 5*fps + for i in range(0, frames): + givenFrame += 1 + yield ( + ('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)), + ('layer1', 'style', 'opacity', "%.4f" %1), + # ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)), + ) + +def outroFrames(p): + xml = etree.parse('god2024/artwork/outro.svg').getroot() + + frames = int(5*fps) + for i in range(0, frames): + yield () + +def pauseFrames(p): + # 1 sekunden fade in + frames = 1*fps + for i in range(0, frames): + yield ( + ('text1', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)), + ) + + # 1 sekunde sehen + for i in range(0, frames): + yield ( + ('text1', 'style', 'opacity', "%.4f" % 1), + ) + + # 1 sekunde fadeout + for i in range(0, frames): + yield ( + ('text1', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)), + ) + + # 1 sekunde bild + for i in range(0, frames): + yield ( + ('text1', 'style', 'opacity', "%.4f" % 0), + ) + +def debug(): + render( + 'intro.svg', + '../intro.ts', + introFrames, + { + '$id': 65, + '$title': 'OWASP Juice Shop 10th anniversary: Is it still fresh?'.upper(), + '$subtitle': '', + '$personnames': 'Jannik Hollenbach'.upper(), + #'only_render_frame': 353 + 'only_rerender_frames_after': 225 + } + ) + + # render( + # 'pause.svg', + # '../pause.ts', + # pauseFrames + # ) + +def tasks(queue, args, id_list, skip_list): + if not 'outro' in skip_list: + # place a task for the outro into the queue + queue.put(Rendertask( + infile = 'outro.svg', + outfile = 'outro.ts', + sequence = outroFrames + )) + + if not 'pause' in skip_list: + # place the pause-sequence into the queue + queue.put(Rendertask( + infile = 'pause.svg', + outfile = 'pause.ts', + sequence = pauseFrames + )) + + # iterate over all events extracted from the schedule xml-export + for event in events(scheduleUrl, titlemap): + + # skip events which will not be recorded + if event['room'] not in ('Da Capo',) or event['track'] == 'Nomnom': + print("skipping room %s (%s [%s])" % (event['room'], event['title'], event['id'])) + continue + + # when id_list is not empty, only render events which are in id_list + if id_list and int(event['id']) not in id_list: + print("skipping id (%s [%s])" % (event['title'], event['id'])) + continue + + # generate a task description and put them into the queue + queue.put(Rendertask( + infile = 'intro.svg', + outfile = str(event['id']) + ".ts", + sequence = introFrames, + parameters = { + '$id': event['id'], + '$title': event['title'].upper(), + '$subtitle': event['subtitle'], + '$personnames': event['personnames'].upper(), + } + )) + diff --git a/god2024/artwork/intro.svg b/god2024/artwork/intro.svg new file mode 100644 index 0000000..3767d64 --- /dev/null +++ b/god2024/artwork/intro.svg @@ -0,0 +1,101 @@ + + + +image/svg+xml$title$personnames diff --git a/god2024/artwork/outro.svg b/god2024/artwork/outro.svg new file mode 100644 index 0000000..44344e4 --- /dev/null +++ b/god2024/artwork/outro.svg @@ -0,0 +1,131 @@ + + + +image/svg+xmlCreative Commons Attribution 4.0 International http://creativecommons.org/licenses/by/4.0/ diff --git a/god2024/artwork/pause.svg b/god2024/artwork/pause.svg new file mode 100644 index 0000000..6dd0f4e --- /dev/null +++ b/god2024/artwork/pause.svg @@ -0,0 +1,78 @@ + + + +image/svg+xmlPAUSE From 5661e690de70e2f1ad12e00eb5dffbdcaba00daf Mon Sep 17 00:00:00 2001 From: Lukas Schauer Date: Tue, 12 Nov 2024 12:43:11 +0100 Subject: [PATCH 22/26] god2024 changes --- god2024/artwork/intro.svg | 26 +++++++++++++------------- god2024/artwork/outro.svg | 12 ++++++------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/god2024/artwork/intro.svg b/god2024/artwork/intro.svg index 3767d64..4a79ff0 100644 --- a/god2024/artwork/intro.svg +++ b/god2024/artwork/intro.svg @@ -33,13 +33,13 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1202" + inkscape:window-width="2211" inkscape:window-height="1330" id="namedview25" showgrid="false" - inkscape:zoom="0.6364738" - inkscape:cx="1139.0885" - inkscape:cy="1055.0316" + inkscape:zoom="1.8226104" + inkscape:cx="1088.823" + inkscape:cy="624.10487" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" @@ -68,29 +68,29 @@ style="opacity:1;display:inline">$title$title$personnames Date: Thu, 21 Nov 2024 19:08:46 +0100 Subject: [PATCH 23/26] make-apple-motion: add --no-cleanup flag --- make-apple-motion.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/make-apple-motion.py b/make-apple-motion.py index 1d4c631..079908a 100755 --- a/make-apple-motion.py +++ b/make-apple-motion.py @@ -57,6 +57,10 @@ parser.add_argument('--num-audio-streams', dest='naudio', type=int, default=1, h number of audio-streams to generate. defaults to 1 ''') +parser.add_argument('--no-cleanup', action='store_true', help=''' + keep temp-dir for debugging purposes + ''') + args = parser.parse_args() @@ -250,5 +254,9 @@ while len(active_jobs) > 0: finalize_job(job_id, event) -print('all done, cleaning up ' + tempdir.name) -tempdir.cleanup() +if args.no_cleanup: + print('all done, *NOT* cleaning up, *TEMPFILES REMAIN* in ' + tempdir.name) + +else: + print('all done, cleaning up ' + tempdir.name) + tempdir.cleanup() From 41db29d24b1c694a00ae3dcd3083b2b18bef2c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20K=C3=B6rner?= Date: Thu, 21 Nov 2024 19:19:58 +0100 Subject: [PATCH 24/26] make-apple-motion: add --setting-path flag and auto-detect absolute path to default .compressorsetting file --- make-apple-motion.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/make-apple-motion.py b/make-apple-motion.py index 079908a..4262030 100755 --- a/make-apple-motion.py +++ b/make-apple-motion.py @@ -61,6 +61,12 @@ parser.add_argument('--no-cleanup', action='store_true', help=''' keep temp-dir for debugging purposes ''') +parser.add_argument('--setting-path', default='hd1080p.compressorsetting', help=''' + filename in the script-dir (where this python script resides), + the work-dir (where the .motn-file resides) or absolute path to + a .compressorsetting file + ''') + args = parser.parse_args() @@ -105,9 +111,22 @@ def describe_event(event): def event_print(event, message): print("{} – {}".format(describe_event(event), message)) +def find_settingpath(): + artwork_dir = os.path.dirname(args.motn) + setting_path = os.path.join(artwork_dir, args.setting_path) + if os.path.exists(setting_path): + return setting_path + + setting_path = os.path.join(os.path.dirname(__file__), args.setting_path) + if os.path.exists(setting_path): + return setting_path + + return args.setting_path + tempdir = tempfile.TemporaryDirectory() print('working in ' + tempdir.name) +settingpath = find_settingpath() def fmt_command(command, **kwargs): @@ -148,10 +167,11 @@ def enqueue_job(event): fp.write(xmlstr) compressor_info = run_output( - '/Applications/Compressor.app/Contents/MacOS/Compressor -batchname {batchname} -jobpath {jobpath} -settingpath hd1080p.compressorsetting -locationpath {locationpath}', + '/Applications/Compressor.app/Contents/MacOS/Compressor -batchname {batchname} -jobpath {jobpath} -settingpath {settingpath} -locationpath {locationpath}', batchname=describe_event(event), jobpath=work_doc, - locationpath=intermediate_clip) + locationpath=intermediate_clip, + settingpath=settingpath) match = re.search(r"", compressor_info) if not match: From a9cbfc5eb3b0eaedf997e70bd9c3820ad93eedb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20K=C3=B6rner?= Date: Thu, 21 Nov 2024 19:26:10 +0100 Subject: [PATCH 25/26] make-apple-motion: add --snapshot-sec to automatically generate a snapshot of the final clip for inspection or as thumbnail --- make-apple-motion.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/make-apple-motion.py b/make-apple-motion.py index 4262030..f4317c4 100755 --- a/make-apple-motion.py +++ b/make-apple-motion.py @@ -61,6 +61,10 @@ parser.add_argument('--no-cleanup', action='store_true', help=''' keep temp-dir for debugging purposes ''') +parser.add_argument('--snapshot-sec', type=int, default=3, help=''' + number of seconds into the final clip when to take a snapshot (for inspection purposes or as thumbnail) + ''') + parser.add_argument('--setting-path', default='hd1080p.compressorsetting', help=''' filename in the script-dir (where this python script resides), the work-dir (where the .motn-file resides) or absolute path to @@ -226,6 +230,7 @@ def finalize_job(job_id, event): intermediate_clip = os.path.join(tempdir.name, event_id + '.mov') final_clip = os.path.join(os.path.dirname(args.motn), event_id + '.ts') copy_clip = os.path.join(os.path.dirname(args.motn), event_id + '.mov') + snapshot_file = os.path.join(os.path.dirname(args.motn), event_id + '.png') shutil.copy(intermediate_clip, copy_clip) @@ -235,6 +240,11 @@ def finalize_job(job_id, event): vcodec=args.vcodec, acodec=args.acodec) + run('ffmpeg -y -hide_banner -loglevel error -i {input} -ss {snapshot_sec} -frames:v 1 -vf scale="iw*sar:ih" -f image2 -y -c png {output}', + input=intermediate_clip, + output=snapshot_file, + snapshot_sec=str(args.snapshot_sec)) + event_print(event, "finalized intro to " + final_clip) From 21a8e014ef3911201f017833cc8fc2fa9f3b288b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20K=C3=B6rner?= Date: Thu, 21 Nov 2024 19:32:20 +0100 Subject: [PATCH 26/26] make-apple-motion: replace xml.sax.saxutils.xmlescape with custom routine, which also escapes quotes xml.sax.saxutils.xmlescape is only a str.replace in a trencoat anyways. --- make-apple-motion.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/make-apple-motion.py b/make-apple-motion.py index f4317c4..c2940e9 100755 --- a/make-apple-motion.py +++ b/make-apple-motion.py @@ -11,8 +11,6 @@ import sys import os import re -from xml.sax.saxutils import escape as xmlescape - # Parse arguments parser = argparse.ArgumentParser( description='C3VOC Intro-Outro-Generator - Variant to use with apple Motion Files', @@ -155,6 +153,13 @@ def run_output(command, **kwargs): os.system(f'{cmd} >{t.name} 2>&1') return t.read().decode('utf-8') +def xmlescape(xml): + xml = xml.replace("&", "&") + xml = xml.replace("<", "<") + xml = xml.replace(">", ">") + xml = xml.replace("\"", """) + xml = xml.replace("'", "'") + return xml def enqueue_job(event): event_id = str(event['id'])