From d863f4fb1e489503da6a39ee6a36f56aca042cc4 Mon Sep 17 00:00:00 2001 From: Hannes Braun Date: Sat, 23 Oct 2021 23:39:18 +0200 Subject: [PATCH] TimetableParser: parse year This also adds the parsed year to the meta object included in the timetable response --- .../kotlin/org/mosad/thecitadelofricks/DataTypes.kt | 5 ++++- .../thecitadelofricks/controller/CacheController.kt | 9 ++++++--- .../thecitadelofricks/hsoparser/TimetableParser.kt | 11 +++++++---- .../hsoparser/TimetableParserTest.kt | 7 ++++--- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/org/mosad/thecitadelofricks/DataTypes.kt b/src/main/kotlin/org/mosad/thecitadelofricks/DataTypes.kt index 86160fe..9c9b178 100644 --- a/src/main/kotlin/org/mosad/thecitadelofricks/DataTypes.kt +++ b/src/main/kotlin/org/mosad/thecitadelofricks/DataTypes.kt @@ -46,6 +46,9 @@ data class MensaMeta(val updateTime: Long, val mensaName: String) data class MensaMenu(val meta: MensaMeta, val currentWeek: MensaWeek, val nextWeek: MensaWeek) // data classes for the timetable part + +data class CalendarWeek(val week: Int, val year: Int) + data class Lesson( val lessonID: String, val lessonSubject: String, @@ -58,7 +61,7 @@ data class TimetableDay(val timeslots: Array> = Array(6) { Arr data class TimetableWeek(val days: Array = Array(6) { TimetableDay() }) -data class TimetableCourseMeta(var updateTime: Long = 0, val courseName: String = "", val weekIndex: Int = 0, var weekNumberYear: Int = 0, val link: String = "") +data class TimetableCourseMeta(var updateTime: Long = 0, val courseName: String = "", val weekIndex: Int = 0, var weekNumberYear: Int = 0, val year: Int = 0, val link: String = "") data class TimetableCourseWeek(val meta: TimetableCourseMeta = TimetableCourseMeta(), var timetable: TimetableWeek = TimetableWeek()) diff --git a/src/main/kotlin/org/mosad/thecitadelofricks/controller/CacheController.kt b/src/main/kotlin/org/mosad/thecitadelofricks/controller/CacheController.kt index f438870..5cc1a83 100644 --- a/src/main/kotlin/org/mosad/thecitadelofricks/controller/CacheController.kt +++ b/src/main/kotlin/org/mosad/thecitadelofricks/controller/CacheController.kt @@ -68,6 +68,7 @@ class CacheController { val currentTime = System.currentTimeMillis() / 1000 val timetableLink = "https://mosad.xyz" val weekNumberYear = 0 + val year = 0 val instr = CacheController::class.java.getResourceAsStream("/html/Timetable_normal-week.html") val timetableParser = @@ -80,6 +81,7 @@ class CacheController { courseName, weekIndex, weekNumberYear, + year, timetableLink ), timetableTest ?: TimetableWeek() ) @@ -95,7 +97,7 @@ class CacheController { val currentTime = System.currentTimeMillis() / 1000 val timetableParser = TimetableParser(timetableLink) - val weekNumberYear = timetableParser.parseWeekNumberYear() + val calendarWeek = timetableParser.parseCalendarWeek() val timetable = timetableParser.parseTimeTable() TimetableCourseWeek( @@ -103,7 +105,8 @@ class CacheController { currentTime, courseName, weekIndex, - weekNumberYear ?: 0, + calendarWeek?.week ?: 0, + calendarWeek?.year ?: 0, timetableLink ), timetable ?: TimetableWeek() ).also { if (timetable != null) timetableList[key] = it } @@ -198,7 +201,7 @@ class CacheController { val timetableParser = TimetableParser(timetableCourse.value.meta.link) timetableCourse.value.timetable = timetableParser.parseTimeTable() ?: return@execute timetableCourse.value.meta.weekNumberYear = - timetableParser.parseWeekNumberYear() ?: return@execute + timetableParser.parseCalendarWeek()?.week ?: return@execute timetableCourse.value.meta.updateTime = System.currentTimeMillis() / 1000 saveTimetableToCache(timetableCourse.value) // save the updated timetable to the cache directory diff --git a/src/main/kotlin/org/mosad/thecitadelofricks/hsoparser/TimetableParser.kt b/src/main/kotlin/org/mosad/thecitadelofricks/hsoparser/TimetableParser.kt index 3fc6c4d..7e2c02f 100644 --- a/src/main/kotlin/org/mosad/thecitadelofricks/hsoparser/TimetableParser.kt +++ b/src/main/kotlin/org/mosad/thecitadelofricks/hsoparser/TimetableParser.kt @@ -26,6 +26,7 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Semaphore import org.jsoup.Jsoup import org.jsoup.nodes.Document +import org.mosad.thecitadelofricks.CalendarWeek import org.mosad.thecitadelofricks.Lesson import org.mosad.thecitadelofricks.TimetableWeek import org.slf4j.LoggerFactory @@ -131,11 +132,13 @@ class TimetableParser(timetableURL: String? = null, htmlDoc: Document? = null) { } /** - * parse the week number of the year for the timetable + * parse the calendar week and the associated year for the timetable */ - fun parseWeekNumberYear(): Int? = htmlDoc?.let { - it.select("h1.timetable-caption").text().substringAfter("- ") - .substringBefore(".").replace(" ", "").toInt() + fun parseCalendarWeek(): CalendarWeek? = htmlDoc?.let { + val dateStr = it.select("h1.timetable-caption").text().substringAfter("- ") + val week = dateStr.substringBefore(".").replace(" ", "").toInt() + val year = dateStr.substringAfter("Woche ").replace(" ", "").toInt() + CalendarWeek(week, year) } @Suppress("unused") diff --git a/src/test/kotlin/org/mosad/thecitadelofricks/hsoparser/TimetableParserTest.kt b/src/test/kotlin/org/mosad/thecitadelofricks/hsoparser/TimetableParserTest.kt index 8fb1ead..8331210 100644 --- a/src/test/kotlin/org/mosad/thecitadelofricks/hsoparser/TimetableParserTest.kt +++ b/src/test/kotlin/org/mosad/thecitadelofricks/hsoparser/TimetableParserTest.kt @@ -25,6 +25,7 @@ package org.mosad.thecitadelofricks.hsoparser import org.jsoup.Jsoup import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test +import org.mosad.thecitadelofricks.CalendarWeek import java.io.File class TimetableParserTest { @@ -50,11 +51,11 @@ class TimetableParserTest { } @Test - fun parseWeekNumberYear() { + fun parseCalendarWeek() { val htmlFile = File(TimetableParserTest::class.java.getResource("/html/Timetable_normal-week.html").path) val htmlDoc = Jsoup.parse(htmlFile, "UTF-8", "https://www.hs-offenburg.de/") - val actualWeekNumberYear = TimetableParser(htmlDoc = htmlDoc).parseWeekNumberYear() + val actualCalendarWeek = TimetableParser(htmlDoc = htmlDoc).parseCalendarWeek() - Assertions.assertEquals(42, actualWeekNumberYear) + Assertions.assertEquals(CalendarWeek(42, 2019), actualCalendarWeek) } } \ No newline at end of file