From 34a963784557f9df6ee3ebceed6b22eeb56acb79 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 30 Jan 2025 23:45:58 +0100 Subject: [PATCH] added importer for Kasseturm Weimar Signed-off-by: Stephan Richter --- .../de/srsoftware/cal/app/AutoImporter.java | 1 + .../java/de/srsoftware/cal/BaseImporter.java | 7 - .../cal/importer/weimar/Kasseturm.java | 152 ++++++++++++++++++ 3 files changed, 153 insertions(+), 7 deletions(-) create mode 100644 de.srsoftware.cal.importer/src/main/java/de/srsoftware/cal/importer/weimar/Kasseturm.java diff --git a/de.srsoftware.cal.app/src/main/java/de/srsoftware/cal/app/AutoImporter.java b/de.srsoftware.cal.app/src/main/java/de/srsoftware/cal/app/AutoImporter.java index 93c960c..04bddac 100644 --- a/de.srsoftware.cal.app/src/main/java/de/srsoftware/cal/app/AutoImporter.java +++ b/de.srsoftware.cal.app/src/main/java/de/srsoftware/cal/app/AutoImporter.java @@ -101,6 +101,7 @@ public class AutoImporter implements Runnable, ClassListener { entry("industrial metal","IndustrialMetal"), entry("jam session","JamSession"), entry("jazz","Jazz"), + entry("karaoke","Karaoke"), entry("karneval","Karneval"), entry("kammer musik","Kammermusik"), entry("kino","Kino"), diff --git a/de.srsoftware.cal.base/src/main/java/de/srsoftware/cal/BaseImporter.java b/de.srsoftware.cal.base/src/main/java/de/srsoftware/cal/BaseImporter.java index 51f9115..4b12af5 100644 --- a/de.srsoftware.cal.base/src/main/java/de/srsoftware/cal/BaseImporter.java +++ b/de.srsoftware.cal.base/src/main/java/de/srsoftware/cal/BaseImporter.java @@ -11,8 +11,6 @@ import de.srsoftware.cal.api.*; import de.srsoftware.tools.*; import java.io.InputStream; import java.net.*; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -25,11 +23,6 @@ import java.util.stream.Stream; public abstract class BaseImporter implements Importer { public static final System.Logger LOG = System.getLogger(BaseImporter.class.getSimpleName()); private static final String SHA256 = "SHA-256"; - private final MessageDigest digest; - - public BaseImporter() throws NoSuchAlgorithmException { - digest = MessageDigest.getInstance(SHA256); - } protected abstract String baseUrl(); diff --git a/de.srsoftware.cal.importer/src/main/java/de/srsoftware/cal/importer/weimar/Kasseturm.java b/de.srsoftware.cal.importer/src/main/java/de/srsoftware/cal/importer/weimar/Kasseturm.java new file mode 100644 index 0000000..62e39a7 --- /dev/null +++ b/de.srsoftware.cal.importer/src/main/java/de/srsoftware/cal/importer/weimar/Kasseturm.java @@ -0,0 +1,152 @@ +/* © SRSoftware 2024 */ +package de.srsoftware.cal.importer.weimar; + +import static de.srsoftware.tools.Result.transform; +import static de.srsoftware.tools.Tag.CLASS; +import static de.srsoftware.tools.Tag.HREF; +import static de.srsoftware.tools.TagFilter.*; + +import de.srsoftware.cal.BaseImporter; +import de.srsoftware.cal.Util; +import de.srsoftware.cal.api.Coords; +import de.srsoftware.tools.Payload; +import de.srsoftware.tools.Result; +import de.srsoftware.tools.Tag; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; + +public class Kasseturm extends BaseImporter { + + public static final Coords DEFAULT_COORDS= new Coords(50.98191, 11.32599); + @Override + protected String baseUrl() { + return "https://kasseturm.de/"; + } + + @Override + public String description() { + return "Importer für Events des Kasseturm Weimar"; + } + + @Override + protected Predicate extractAttachmentsFilter() { + return attributeEquals(CLASS,"wpem-single-event-body-content"); + } + + @Override + protected Result extractDescriptionTag(Tag eventTag) { + var desc = new Tag("div"); + super.extractDescriptionTag(eventTag).optional().ifPresent(tag -> tag.find(IS_PARAGRAPH).forEach(desc::add)); + return Payload.of(desc); + } + + @Override + protected Predicate extractDescriptionFilter() { + return attributeEquals(CLASS,"wpem-single-event-body-content"); + } + + @Override + protected Result extractCoords(Tag eventTag) { + return Payload.of(DEFAULT_COORDS); + } + + @Override + protected Predicate extractEndDateFilter() { + return null; + } + + @Override + protected Predicate extractEndTimeFilter() { + return null; + } + + @Override + protected Predicate extractEventTagFilter() { + return attributeEquals(CLASS,"wpem-single-event-body"); + } + + @Override + protected Result> extractEventUrls(Result programPage) { + var opt = programPage.optional(); + if (opt.isEmpty()) return transform(programPage); + var list = opt.get() + .find(withAttribute(HREF)) + .stream() + .map(anchor -> anchor.get(HREF)) + .filter(Objects::nonNull) + .filter(url -> url.contains("/veranstaltung/")) + .distinct() + .toList(); + return Payload.of(list); + } + + @Override + protected Predicate extractLinksFilter() { + return attributeEquals(CLASS,"wpem-single-event-body"); + } + + @Override + protected Result extractLocation(Tag eventTag) { + String loc = "Kasseturm, Goetheplatz 10, 99423 Weimar"; + var opt = super.extractLocation(eventTag).optional(); + return Payload.of(opt.map(s -> s.trim()+", "+loc).orElse(loc)); + } + + @Override + protected Predicate extractLocationFilter() { + return attributeContains(HREF,"maps.google.com"); + } + + @Override + protected Predicate extractStartDateFilter() { + return attributeEquals(CLASS,"wpem-event-date-time-text"); + } + + @Override + protected Predicate extractStartTimeFilter() { + return attributeEquals(CLASS,"wpem-event-date-time-text"); + } + + @Override + protected List extractTags(Tag eventTag) { + var list = new ArrayList(); + list.add("Weimar"); + list.add("Kasseturm"); + eventTag.find(IS_SPAN.and(attributeHas(CLASS,"event-type").or(attributeHas(CLASS,"event-category")))).forEach(tag -> tag.inner(0).ifPresent(list::add)); + return list; + } + + @Override + protected Predicate extractTitleFilter() { + return ofType("h3"); + } + + @Override + protected Result parseEndDate(String string) { + return null; + } + + @Override + protected Result parseEndTime(String string) { + return null; + } + + @Override + protected Result parseStartDate(String string) { + return Util.parseGermanDate(string); + } + + @Override + protected Result parseStartTime(String string) { + return Util.parseGermanTime(string); + } + + @Override + protected String programURL() { + return baseUrl(); + } +}