♻️ Rename “TicketLink” to “Performance”
[rhynodge.git] / src / main / kotlin / net / pterodactylus / rhynodge / filters / webpages / savoy / MovieExtractor.kt
1 package net.pterodactylus.rhynodge.filters.webpages.savoy
2
3 import com.fasterxml.jackson.databind.JsonNode
4 import com.fasterxml.jackson.databind.ObjectMapper
5 import org.jsoup.nodes.Document
6 import java.time.LocalDateTime
7 import java.time.format.DateTimeFormatter
8
9 class MovieExtractor {
10
11         fun getMovies(document: Document) =
12                 document.select("body script#flebbe-state")
13                         .dataNodes().joinToString("").unescape()
14                         .let(objectMapper::readTree)
15                         .get("G./api/v1/de/config?").get("body").asText()
16                         .let(objectMapper::readTree)
17                         .get("movie_list")
18                         .map { it.extractMovie() }
19                         .toSet()
20
21         private fun String.unescape() = this
22                 .replace("&q;", "\"")
23                 .replace("&a;", "&")
24                 .replace("&s;", "'")
25                 .replace("&l;", "<")
26                 .replace("&g;", ">")
27
28         private fun JsonNode.extractMovie() = Movie(get("name").asText()).apply {
29                 this@extractMovie.get("performances")
30                         .map { performance ->
31                                 val begin = LocalDateTime.parse(performance.get("begin").asText(), dateFormat)
32                                 val slug = performance.get("slug").asText()
33                                 val link = "https://savoy.premiumkino.de/vorstellung/${slug}/${String.format("%tY%<tm%<td", begin)}/${String.format("%tH%<tM", begin)}/${performance.get("crypt_id").asText()}"
34                                 Performance(begin, link)
35                         }
36                         .forEach(this::addPerformance)
37         }
38
39 }
40
41 private val objectMapper = ObjectMapper()
42 private val dateFormat = DateTimeFormatter.ISO_LOCAL_DATE_TIME