From 1279cec7d83f2752abb5eff48b17283cbdd286ef Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Thu, 2 Oct 2025 15:22:14 +0200 Subject: [PATCH] =?utf8?q?=E2=9C=A8=20Add=20comic=20filter=20for=20Splatba?= =?utf8?q?ll?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../filters/comics/SplatballComicFilter.kt | 20 + .../rhynodge/watchers/SplatballWatcher.kt | 14 + .../filters/comics/SplatballComicFilterTest.kt | 18 + .../rhynodge/filters/comics/splatball.html | 422 +++++++++++++++++++++ 4 files changed, 474 insertions(+) create mode 100644 src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SplatballComicFilter.kt create mode 100644 src/main/kotlin/net/pterodactylus/rhynodge/watchers/SplatballWatcher.kt create mode 100644 src/test/kotlin/net/pterodactylus/rhynodge/filters/comics/SplatballComicFilterTest.kt create mode 100644 src/test/resources/net/pterodactylus/rhynodge/filters/comics/splatball.html diff --git a/src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SplatballComicFilter.kt b/src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SplatballComicFilter.kt new file mode 100644 index 0000000..be7c190 --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SplatballComicFilter.kt @@ -0,0 +1,20 @@ +package net.pterodactylus.rhynodge.filters.comics + +import com.google.common.base.Optional +import com.google.common.base.Optional.absent +import net.pterodactylus.rhynodge.filters.ComicSiteFilter +import org.jsoup.nodes.Document + +class SplatballComicFilter : ComicSiteFilter() { + + override fun extractTitle(document: Document): Optional = absent() + + override fun extractImageUrls(document: Document) = + document.select(".row") + .takeWhile { !it.attr("class").contains("adsrow") } + .flatMap { it.select("picture.comic-image source:first-child") } + .map { it.attr("srcset") } + + override fun extractImageComments(document: Document) = emptyList() + +} diff --git a/src/main/kotlin/net/pterodactylus/rhynodge/watchers/SplatballWatcher.kt b/src/main/kotlin/net/pterodactylus/rhynodge/watchers/SplatballWatcher.kt new file mode 100644 index 0000000..b1b6920 --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/rhynodge/watchers/SplatballWatcher.kt @@ -0,0 +1,14 @@ +package net.pterodactylus.rhynodge.watchers + +import net.pterodactylus.rhynodge.filters.HtmlFilter +import net.pterodactylus.rhynodge.filters.comics.BexAndKeitComicFilter +import net.pterodactylus.rhynodge.filters.comics.SplatballComicFilter +import net.pterodactylus.rhynodge.mergers.ComicMerger +import net.pterodactylus.rhynodge.queries.HttpQuery + +@Suppress("unused") +class SplatballWatcher : DefaultWatcher(query, filters, merger) + +private val query = HttpQuery("https://krooxworld.com/splatball") +private val filters = listOf(HtmlFilter(), SplatballComicFilter()) +private val merger = ComicMerger() diff --git a/src/test/kotlin/net/pterodactylus/rhynodge/filters/comics/SplatballComicFilterTest.kt b/src/test/kotlin/net/pterodactylus/rhynodge/filters/comics/SplatballComicFilterTest.kt new file mode 100644 index 0000000..8fb33d9 --- /dev/null +++ b/src/test/kotlin/net/pterodactylus/rhynodge/filters/comics/SplatballComicFilterTest.kt @@ -0,0 +1,18 @@ +package net.pterodactylus.rhynodge.filters.comics + +import net.pterodactylus.rhynodge.states.ComicState + +class SplatballComicFilterTest : ComicSiteFilterTest() { + + override val filter = SplatballComicFilter() + override val baseUrl = "https://krooxworld.com/splatball" + override val resource = "splatball.html" + override val expectedComics = listOf( + ComicState.Comic("") + .add(ComicState.Strip("https://cdn.sanity.io/images/4h3kafsm/production/c727206d258bc2c063167854b5000b0e9f4e628f-1080x1329.jpg?w=672&fit=max", "")) + .add(ComicState.Strip("https://cdn.sanity.io/images/4h3kafsm/production/7a5a43f792907867f262e2a6fbed30d3db4ecbba-1080x1329.jpg?w=672&fit=max", "")) + .add(ComicState.Strip("https://cdn.sanity.io/images/4h3kafsm/production/1ebf804e838c8f607478add915fc6bb21eb30877-1080x1329.jpg?w=672&fit=max", "")) + .add(ComicState.Strip("https://cdn.sanity.io/images/4h3kafsm/production/fe9c4a783c7d9a80bd10fee14925762be65bf334-1080x1329.jpg?w=672&fit=max", "")) + ) + +} diff --git a/src/test/resources/net/pterodactylus/rhynodge/filters/comics/splatball.html b/src/test/resources/net/pterodactylus/rhynodge/filters/comics/splatball.html new file mode 100644 index 0000000..7ba8d51 --- /dev/null +++ b/src/test/resources/net/pterodactylus/rhynodge/filters/comics/splatball.html @@ -0,0 +1,422 @@ + + + + + + + + + + + + + + Home page - Krooxworld + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+ + +
+
+ + + + + + +
+
+ + +
+
+
+ + + + + + + + + Sample + +
+
+
+
+
+
+ + + + + + + + + Sample + +
+
+
+
+
+
+ + + + + + + + + Sample + +
+
+
+
+
+
+ + + + + + + + + Sample + +
+
+
+
+ +

Replace these ads with a bonus panel by becoming a + +

+ +
+ + + + +
+ + +

Bonus panels are never required reading to understand the free content, in fact sometimes bonus + panels ruins the joke!

+
+ + +
+
+

Pages 5-8 are now available on Patreon! On top of bonus panels, Patreon supporters always get access to twice as many Splatball pages compared to the public release. So, when page 5 is posted here, pages 9 and 10 will already be available to supporters, and so on. I'm working on a feature to offer staggered content directly on this website for supporters, but for now you got to visit pareon.com/creux to find them.

+
+
+ + + +
+
+
+
+ + + + + + + + + + + + -- 2.7.4