From f86d31f8113fba7ac56b96f527ad7a3662301099 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 18 Dec 2024 14:00:43 +0200 Subject: [PATCH] Update utils --- .../kotatsu/parsers/site/all/ExHentaiParser.kt | 2 +- .../koitharu/kotatsu/parsers/site/be/AnibelParser.kt | 11 ++++------- .../kotatsu/parsers/site/en/AsuraScansParser.kt | 2 +- .../koitharu/kotatsu/parsers/site/en/ComicExtra.kt | 5 +++-- .../kotatsu/parsers/site/mangareader/en/FreakComic.kt | 7 ++----- .../org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt | 2 +- .../kotlin/org/koitharu/kotatsu/parsers/util/Jsoup.kt | 4 ++-- .../org/koitharu/kotatsu/parsers/util/OkHttp.kt | 2 +- .../org/koitharu/kotatsu/parsers/util/String.kt | 2 ++ .../org/koitharu/kotatsu/parsers/util/json/JsonExt.kt | 5 ++--- 10 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt index 01d336d5..12fc6a00 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt @@ -415,7 +415,7 @@ internal class ExHentaiParser( joiner.append(lc.toLanguagePath()) joiner.append("\"$") } - return joiner.complete().takeUnless { it.isEmpty() } + return joiner.complete().nullIfEmpty() } private fun Collection.toFCats(): Int = fold(0) { acc, ct -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt index b6967688..04459d4a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt @@ -9,14 +9,11 @@ import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.util.domain -import org.koitharu.kotatsu.parsers.util.generateUid -import org.koitharu.kotatsu.parsers.util.getDomain +import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList import org.koitharu.kotatsu.parsers.util.json.mapJSON import org.koitharu.kotatsu.parsers.util.json.mapJSONIndexed import org.koitharu.kotatsu.parsers.util.json.mapJSONNotNull -import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl import java.util.* @Broken @@ -92,7 +89,7 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context, title = title.getString("be"), coverUrl = jo.getString("poster").removePrefix("/cdn") .toAbsoluteUrl(getDomain("cdn")) + "?width=200&height=280", - altTitle = title.optJSONArray("alt")?.optString(0)?.takeUnless(String::isEmpty), + altTitle = title.optJSONArray("alt")?.optString(0)?.nullIfEmpty(), author = null, isNsfw = false, rating = jo.getDouble("rating").toFloat() / 10f, @@ -144,7 +141,7 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context, ).getJSONObject("chapters").getJSONArray("docs") return manga.copy( title = title.getString("be"), - altTitle = title.optJSONArray("alt")?.optString(0)?.takeUnless(String::isEmpty), + altTitle = title.optJSONArray("alt")?.optString(0)?.nullIfEmpty(), coverUrl = "$poster?width=200&height=280", largeCoverUrl = poster, description = details.getJSONObject("description").getString("be"), @@ -239,7 +236,7 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context, title = title.getString("be"), coverUrl = jo.getString("poster").removePrefix("/cdn") .toAbsoluteUrl(getDomain("cdn")) + "?width=200&height=280", - altTitle = title.getString("en").takeUnless(String::isEmpty), + altTitle = title.getString("en").nullIfEmpty(), author = null, isNsfw = false, rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt index 7e133a90..02427559 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt @@ -190,7 +190,7 @@ internal class AsuraScansParser(context: MangaLoaderContext) : val data = doc.selectOrThrow("script").mapNotNull { x -> x.data().substringBetween("self.__next_f.push(", ")", "") .trim() - .takeUnless { it.isEmpty() } + .nullIfEmpty() }.flatMap { it.jsonStrings() } .joinToString("") .split('\n') diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt index 0382847d..36347264 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt @@ -50,6 +50,7 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex append(page.toString()) } } + else -> { when (order) { SortOrder.POPULARITY -> append("popular-comics") @@ -151,9 +152,9 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(domain) + "/full" val doc = webClient.httpGet(fullUrl).parseHtml() - + return doc.select("div.chapter-container img").mapNotNull { img -> - val url = img.attr("src")?.takeUnless { it.isBlank() }?.toAbsoluteUrl(domain) + val url = img.attrAsAbsoluteUrlOrNull("src") url?.let { MangaPage( id = generateUid(url), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FreakComic.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FreakComic.kt index 55bc1c19..12c7f43c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FreakComic.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FreakComic.kt @@ -10,10 +10,7 @@ import org.koitharu.kotatsu.parsers.model.MangaListFilterCapabilities import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser -import org.koitharu.kotatsu.parsers.util.attrAsAbsoluteUrl -import org.koitharu.kotatsu.parsers.util.domain -import org.koitharu.kotatsu.parsers.util.parseHtml -import org.koitharu.kotatsu.parsers.util.toTitleCase +import org.koitharu.kotatsu.parsers.util.* @Broken @MangaSourceParser("FREAKCOMIC", "FreakComic", "en") @@ -41,7 +38,7 @@ internal class FreakComic(context: MangaLoaderContext) : key = el.attrAsAbsoluteUrl("href") .toHttpUrlOrNull() ?.queryParameter("genre") - ?.takeUnless { it.isEmpty() } + ?.nullIfEmpty() ?: continue, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt index 6b3986c0..374e2d8d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt @@ -150,7 +150,7 @@ internal class TruyenGG(context: MangaLoaderContext) : PagedMangaParser(context, return manga.copy( altTitle = doc.selectFirst("h2.other-name")?.text(), - author = doc.select("p:contains(Tác Giả) + p").joinToString { it.text() }.takeUnless { it.isEmpty() }, + author = doc.select("p:contains(Tác Giả) + p").joinToString { it.text() }.nullIfEmpty(), tags = doc.select("a.clblue").mapToSet { MangaTag( key = it.attr("href").substringAfterLast('-').substringBeforeLast('.'), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Jsoup.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Jsoup.kt index 7739976a..438547dd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Jsoup.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Jsoup.kt @@ -127,9 +127,9 @@ public fun Element.selectLastOrThrow(cssQuery: String): Element = parseNotNull(s "Cannot find \"$cssQuery\"" } -public fun Element.textOrNull(): String? = text().takeUnless { it.isEmpty() } +public fun Element.textOrNull(): String? = text().nullIfEmpty() -public fun Element.ownTextOrNull(): String? = ownText().takeUnless { it.isEmpty() } +public fun Element.ownTextOrNull(): String? = ownText().nullIfEmpty() public fun Element.selectFirstParent(query: String): Element? { val selector = QueryParser.parse(query) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/OkHttp.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/OkHttp.kt index a5f48173..4d692a8e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/OkHttp.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/OkHttp.kt @@ -17,7 +17,7 @@ public suspend fun Call.await(): Response = suspendCancellableCoroutine { contin } public val Response.mimeType: String? - get() = header("content-type")?.takeUnless { it.isEmpty() } + get() = header("content-type")?.nullIfEmpty() public val Response.contentDisposition: String? get() = header("Content-Disposition") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/String.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/String.kt index 96736632..06bf02b1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/String.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/String.kt @@ -107,6 +107,8 @@ public fun String.nl2br(): String = replace("\n", "
") public fun String.splitByWhitespace(): List = trim().split(REGEX_WHITESPACE) +public fun T.nullIfEmpty(): T? = takeUnless { it.isEmpty() } + public fun ByteArray.byte2HexFormatted(): String { val str = StringBuilder(size * 2) for (i in indices) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt index b5d65b28..0766bdb4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt @@ -4,6 +4,7 @@ import androidx.collection.ArraySet import org.json.JSONArray import org.json.JSONException import org.json.JSONObject +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import java.util.* import kotlin.contracts.contract @@ -67,9 +68,7 @@ public fun JSONArray.mapJSONIndexed(block: (Int, JSONObject) -> T): List public fun JSONObject.getStringOrNull(name: String): String? = opt(name)?.takeUnless { it === JSONObject.NULL -}?.toString()?.takeUnless { - it.isEmpty() -} +}?.toString()?.nullIfEmpty() public fun JSONObject.getBooleanOrDefault(name: String, defaultValue: Boolean): Boolean { return when (val rawValue = opt(name)) {