diff --git a/build.gradle b/build.gradle index affa0c2..3e5ccfc 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.jetbrains.kotlin:kotlin-stdlib' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1' - implementation 'org.jsoup:jsoup:1.14.3' + implementation 'org.jsoup:jsoup:1.15.3' implementation 'com.google.code.gson:gson:2.9.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' diff --git a/src/main/kotlin/org/mosad/thecitadelofricks/controller/StartupController.kt b/src/main/kotlin/org/mosad/thecitadelofricks/controller/StartupController.kt index 5ec69fc..31e1bad 100644 --- a/src/main/kotlin/org/mosad/thecitadelofricks/controller/StartupController.kt +++ b/src/main/kotlin/org/mosad/thecitadelofricks/controller/StartupController.kt @@ -44,7 +44,7 @@ class StartupController { var cachetAPIKey = "0" var cachetBaseURL = "https://status.mosad.xyz" var courseListURL = "https://www.hs-offenburg.de/studium/vorlesungsplaene/" - var mensaMenuURL = "https://www.swfr.de/essen-trinken/speiseplaene/mensa-offenburg/" + var mensaMenuURL = "https://www.swfr.de/essen/mensen-cafes-speiseplaene/mensa-offenburg" var mensaName = "Offenburg" } @@ -77,29 +77,21 @@ class StartupController { val properties = Properties() properties.loadFromXML(FileInputStream(fileConfig)) - cachetAPIKey = try { - properties.getProperty("cachetAPIKey") - } catch (ex: Exception) { - "0" - } + try { + cachetAPIKey = properties.getProperty("cachetAPIKey") + } catch (_: Exception) {} - cachetBaseURL = try { - properties.getProperty("cachetBaseURL") - } catch (ex: Exception) { - "https://status.mosad.xyz" - } + try { + cachetBaseURL = properties.getProperty("cachetBaseURL") + } catch (_: Exception) {} - mensaMenuURL = try { - properties.getProperty("mensaMenuURL") - } catch (ex: Exception) { - "https://www.swfr.de/essen-trinken/speiseplaene/mensa-offenburg/" - } + try { + mensaMenuURL = properties.getProperty("mensaMenuURL") + } catch (_: Exception) {} - mensaName = try { - properties.getProperty("mensaName") - } catch (ex: Exception) { - "Offenburg" - } + try { + mensaName = properties.getProperty("mensaName") + } catch (_: Exception) {} } catch (ex: Exception) { logger.error("error while loading config", ex) @@ -111,10 +103,10 @@ class StartupController { private fun createConfig() = try { val properties = Properties() - properties.setProperty("cachetAPIKey", "0") - properties.setProperty("cachetBaseURL", "https://status.mosad.xyz") - properties.setProperty("mensaMenuURL", "https://www.swfr.de/essen-trinken/speiseplaene/mensa-offenburg/") - properties.setProperty("mensaName", "Offenburg") + properties.setProperty("cachetAPIKey", cachetAPIKey) + properties.setProperty("cachetBaseURL", cachetBaseURL) + properties.setProperty("mensaMenuURL", mensaMenuURL) + properties.setProperty("mensaName", mensaName) val outputStream = FileOutputStream(fileConfig) properties.storeToXML(outputStream, "tcor configuration") diff --git a/src/main/kotlin/org/mosad/thecitadelofricks/hsoparser/MensaParser.kt b/src/main/kotlin/org/mosad/thecitadelofricks/hsoparser/MensaParser.kt index 3125994..40d0478 100644 --- a/src/main/kotlin/org/mosad/thecitadelofricks/hsoparser/MensaParser.kt +++ b/src/main/kotlin/org/mosad/thecitadelofricks/hsoparser/MensaParser.kt @@ -59,19 +59,24 @@ class MensaParser { val mealWeekList = MensaWeek() try { - htmlDoc.select("#speiseplan-tabs").select("div.tab-content").select("div.menu-tagesplan") + htmlDoc.select("#tabsWeekdaysMenu").select("div.menu-tagesplan") .forEachIndexed { dayIndex, day -> + val meals = mealWeekList.days[dayIndex].meals val strDay = day.select("h3").text() - day.select("div.row").forEachIndexed { _, meal -> - val heading = meal.select("h4.menu-header").text() - val parts = ArrayList(meal.select("div.menu-info").html().substringBefore("
")) - val additives = meal.select("span.show-with-allergenes").text() + day.select("div.menu-tagesplan > div.grid").first()?.select("div.flex-col")?.forEachIndexed { _, meal -> + val heading = meal.select("h5").text() + val parts = ArrayList(meal.select("small.extra-text").html().split("
").map { it.trim() }) + val additives = meal.select("small.zusatzsstoffe[x-show=showAllergenes]").text() parts.removeIf { x -> x.isEmpty() || x.isBlank() } - mealWeekList.days[dayIndex].meals.add(Meal(strDay, heading, parts, additives)) + meals.add(Meal(strDay, heading, parts, additives)) } + if (meals.isEmpty()) { + // Add an empty Meal entry to preserve the day information + meals.add(Meal(strDay, "", ArrayList(), "")) + } } } catch (pex: Exception) { logger.error("error while parsing the html file", pex) @@ -87,8 +92,7 @@ class MensaParser { */ fun getMenuLinkNextWeek(mensaMenuURL: String): String { val menuHTML = Jsoup.connect(mensaMenuURL).get() - - return "https://www.swfr.de" + menuHTML.select("#speiseplan-tabs").select("a.next-week").attr("href") + return "https://www.swfr.de" + menuHTML.select("div.section-mensa").select("a.next-week").attr("href") } } \ No newline at end of file diff --git a/src/test/kotlin/org/mosad/thecitadelofricks/hsoparser/MensaParserTest.kt b/src/test/kotlin/org/mosad/thecitadelofricks/hsoparser/MensaParserTest.kt index 02fed83..819ea8c 100644 --- a/src/test/kotlin/org/mosad/thecitadelofricks/hsoparser/MensaParserTest.kt +++ b/src/test/kotlin/org/mosad/thecitadelofricks/hsoparser/MensaParserTest.kt @@ -28,7 +28,7 @@ import org.junit.jupiter.api.Test import java.io.File internal class MensaParserTest { - private val mensaMenuURL = "https://www.swfr.de/essen-trinken/speiseplaene/mensa-offenburg/" + private val mensaMenuURL = "https://www.swfr.de/essen/mensen-cafes-speiseplaene/mensa-offenburg" @Test fun parseMensaMenuNormalWeek() { diff --git a/src/test/resources/expected/Mensa_empty-week.txt b/src/test/resources/expected/Mensa_empty-week.txt index 1f734ca..113a8e7 100644 --- a/src/test/resources/expected/Mensa_empty-week.txt +++ b/src/test/resources/expected/Mensa_empty-week.txt @@ -1 +1 @@ -MensaWeek(days=[Meals(meals=[Meal(day=Montag 12.08., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Dienstag 13.08., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Mittwoch 14.08., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Donnerstag 15.08., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Freitag 16.08., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Samstag 17.08., heading=, parts=[], additives=)]), Meals(meals=[])]) \ No newline at end of file +MensaWeek(days=[Meals(meals=[Meal(day=Montag 26.12., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Dienstag 27.12., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Mittwoch 28.12., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Donnerstag 29.12., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Freitag 30.12., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Samstag 31.12., heading=, parts=[], additives=)]), Meals(meals=[])]) \ No newline at end of file diff --git a/src/test/resources/expected/Mensa_normal-week.txt b/src/test/resources/expected/Mensa_normal-week.txt index 945337d..b6f457e 100644 --- a/src/test/resources/expected/Mensa_normal-week.txt +++ b/src/test/resources/expected/Mensa_normal-week.txt @@ -1 +1 @@ -MensaWeek(days=[Meals(meals=[Meal(day=Montag 09.03., heading=Essen 1, parts=[Kartoffel-Frischkäsebratling , Gemüseragout Toskana , Beilagensalat ], additives=enthält Allergene: Se,Gl,GlW,ML), Meal(day=Montag 09.03., heading=Essen 2, parts=[Schweineschnitzel Wiener Art , Bratensauce , Pommes frites , Mixsalat ], additives=Kennzeichnungen/Zusatzstoffe: sch enthält Allergene: Gl,GlW,GlG), Meal(day=Montag 09.03., heading=Buffet, parts=[Grill und Salatbar , Asiatisches aus dem Wok , Fleisch- und Fischspezialitäten , Pasta-, Reis und Kartoffelvariationen , Gemüse ], additives=)]), Meals(meals=[Meal(day=Dienstag 10.03., heading=Essen 1, parts=[Tortellini mit Gemüsefüllung , Tomatensauce , Geriebener Hartkäse , Beilagensalat ], additives=Kennzeichnungen/Zusatzstoffe: 6 enthält Allergene: Ei,Se,Gl,GlW,ML), Meal(day=Dienstag 10.03., heading=Essen 2, parts=[Frikadelle , Champignon-Rahmsauce , Bauernspätzle , Blattsalat ], additives=Kennzeichnungen/Zusatzstoffe: sch,ri enthält Allergene: Ei,Gl,GlW,GlG,ML), Meal(day=Dienstag 10.03., heading=Buffet, parts=[Grill und Salatbar , Asiatisches aus dem Wok , Fleisch- und Fischspezialitäten , Pasta-, Reis und Kartoffelvariationen , Gemüse ], additives=)]), Meals(meals=[Meal(day=Mittwoch 11.03., heading=Essen 1, parts=[Gebratener Gemüsereis Nasi Goreng , Raita , Mixsalat ], additives=Kennzeichnungen/Zusatzstoffe: 5 enthält Allergene: So,Sn,Se,Gl,GlW,ML), Meal(day=Mittwoch 11.03., heading=Essen 2, parts=[Kalbsbratwurst , Bratensauce , Kartoffelbrei , Apfelrotkraut ], additives=Kennzeichnungen/Zusatzstoffe: sch,5,6,8,ri enthält Allergene: Sn,Se,Sf,Gl,GlW,GlG,ML), Meal(day=Mittwoch 11.03., heading=Buffet, parts=[Grill und Salatbar , Asiatisches aus dem Wok , Fleisch- und Fischspezialitäten , Pasta-, Reis und Kartoffelvariationen , Gemüse ], additives=)]), Meals(meals=[Meal(day=Donnerstag 12.03., heading=Essen 1, parts=[Spaghetti , Chinagemüse , Sauce süß-sauer , Geriebener Hartkäse , Mixsalat ], additives=Kennzeichnungen/Zusatzstoffe: 5,6 enthält Allergene: Ei,Sn,Se,Sf,Gl,GlW,GlG,ML), Meal(day=Donnerstag 12.03., heading=Essen 2, parts=[Paniertes Seelachsfilet , Sesam-Mayonnaise , Salzkartoffeln , Karottenmix mit Brokkoli und Bohnen ], additives=Kennzeichnungen/Zusatzstoffe: nF enthält Allergene: Ei,Sn,Fi,Sa,Gl,GlW), Meal(day=Donnerstag 12.03., heading=Buffet, parts=[Grill und Salatbar , Asiatisches aus dem Wok , Fleisch- und Fischspezialitäten , Pasta-, Reis und Kartoffelvariationen , Gemüse ], additives=)]), Meals(meals=[Meal(day=Freitag 13.03., heading=Essen 1, parts=[Kartoffel-Gorgonzolagratin , Brokkoligemüse , Beilagensalat ], additives=enthält Allergene: ML), Meal(day=Freitag 13.03., heading=Essen 2, parts=[Hähnchenbrustfilet , Apfel-Rahmsauce , Mandelreis , Karottengemüse ], additives=Kennzeichnungen/Zusatzstoffe: 5 enthält Allergene: Gl,GlW,GlG,Nu,NM,ML), Meal(day=Freitag 13.03., heading=Buffet, parts=[Grill und Salatbar , Asiatisches aus dem Wok , Fleisch- und Fischspezialitäten , Pasta-, Reis und Kartoffelvariationen , Gemüse ], additives=)]), Meals(meals=[Meal(day=Samstag 14.03., heading=, parts=[], additives=)]), Meals(meals=[])]) \ No newline at end of file +MensaWeek(days=[Meals(meals=[Meal(day=Montag 19.12., heading=Essen 1, parts=[auf Wunsch vegan, Gemüselasagne oder, Cannelloni mit Gemüse und Käsekruste, Tomatensauce, Beilagensalat oder Regio-Apfel], additives=Kennzeichnungen/Zusatzstoffe: 5 enthält Allergene: ML,GlW,Gl,Ei,Se), Meal(day=Montag 19.12., heading=Essen 2, parts=[Grönsaksbullar -Gemüsebällchen oder, Köttbullar, Pfeffer-Rahmsauce, Blumenkohl-Kartoffelpüree, Beilagensalat oder Regio-Apfel], additives=Kennzeichnungen/Zusatzstoffe: 5,sch,ri,4 enthält Allergene: ML,GlW,Gl,Ei)]), Meals(meals=[Meal(day=Dienstag 20.12., heading=Essen 1, parts=[Brokkoli-Nussecken, Rotweinsauce, Kartoffel-Kürbispüree, Apfelrotkraut, Feldsalat], additives=Kennzeichnungen/Zusatzstoffe: 5 enthält Allergene: GlW,GlH,ML,NM,Gl,Sf,Se,Nu,NH), Meal(day=Dienstag 20.12., heading=Essen 2, parts=[Weihnachtsessen, Hirschgulasch, Rotweinsauce, Bauernspätzle, Apfelrotkraut, Feldsalat], additives=Kennzeichnungen/Zusatzstoffe: 5 enthält Allergene: Ei,Gl,GlW,ML,Sf)]), Meals(meals=[Meal(day=Mittwoch 21.12., heading=Essen 1, parts=[Gemüsenuggets, Mojo Dip, Gitterkartoffeln, Beilagensalat oder Regio-Apfel], additives=Kennzeichnungen/Zusatzstoffe: 5 enthält Allergene: GlW,GlG,Gl,ML), Meal(day=Mittwoch 21.12., heading=Essen 2, parts=[Gebratener Gemüsereis Nasi Goreng, Bio Tofu-Erdnusswürfel, Beilagensalat oder Regio-Apfel], additives=Kennzeichnungen/Zusatzstoffe: o enthält Allergene: Gl,GlW,Se,Sf,So,Sn)]), Meals(meals=[Meal(day=Donnerstag 22.12., heading=Essen 1, parts=[Schupfnudel-Gemüsepfanne, Weiße Sauce, Beilagensalat oder Regio-Apfel], additives=enthält Allergene: Gl,GlW,Se,So), Meal(day=Donnerstag 22.12., heading=Essen 2, parts=[Fischragout, Bandnudeln, Buntes Marktgemüse], additives=Kennzeichnungen/Zusatzstoffe: nF enthält Allergene: Se,ML,GlW,Gl,Ei,Fi)]), Meals(meals=[Meal(day=Freitag 23.12., heading=, parts=[], additives=)]), Meals(meals=[Meal(day=Samstag 24.12., heading=, parts=[], additives=)]), Meals(meals=[])]) \ No newline at end of file diff --git a/src/test/resources/html/Mensa_empty-week.html b/src/test/resources/html/Mensa_empty-week.html index c736dd7..54f87cd 100644 --- a/src/test/resources/html/Mensa_empty-week.html +++ b/src/test/resources/html/Mensa_empty-week.html @@ -1,134 +1,105 @@ -
- -
-
- - - - - - - - - - - - - - - -
vegetarisch
vegan
auf Wunsch vegan
-
- - -
-
-