Update utils

master
Koitharu 1 year ago
parent 10dac6c0d4
commit f86d31f811
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -415,7 +415,7 @@ internal class ExHentaiParser(
joiner.append(lc.toLanguagePath()) joiner.append(lc.toLanguagePath())
joiner.append("\"$") joiner.append("\"$")
} }
return joiner.complete().takeUnless { it.isEmpty() } return joiner.complete().nullIfEmpty()
} }
private fun Collection<ContentType>.toFCats(): Int = fold(0) { acc, ct -> private fun Collection<ContentType>.toFCats(): Int = fold(0) { acc, ct ->

@ -9,14 +9,11 @@ import org.koitharu.kotatsu.parsers.MangaParser
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.util.domain import org.koitharu.kotatsu.parsers.util.*
import org.koitharu.kotatsu.parsers.util.generateUid
import org.koitharu.kotatsu.parsers.util.getDomain
import org.koitharu.kotatsu.parsers.util.json.asTypedList import org.koitharu.kotatsu.parsers.util.json.asTypedList
import org.koitharu.kotatsu.parsers.util.json.mapJSON import org.koitharu.kotatsu.parsers.util.json.mapJSON
import org.koitharu.kotatsu.parsers.util.json.mapJSONIndexed import org.koitharu.kotatsu.parsers.util.json.mapJSONIndexed
import org.koitharu.kotatsu.parsers.util.json.mapJSONNotNull import org.koitharu.kotatsu.parsers.util.json.mapJSONNotNull
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
import java.util.* import java.util.*
@Broken @Broken
@ -92,7 +89,7 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context,
title = title.getString("be"), title = title.getString("be"),
coverUrl = jo.getString("poster").removePrefix("/cdn") coverUrl = jo.getString("poster").removePrefix("/cdn")
.toAbsoluteUrl(getDomain("cdn")) + "?width=200&height=280", .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, author = null,
isNsfw = false, isNsfw = false,
rating = jo.getDouble("rating").toFloat() / 10f, rating = jo.getDouble("rating").toFloat() / 10f,
@ -144,7 +141,7 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context,
).getJSONObject("chapters").getJSONArray("docs") ).getJSONObject("chapters").getJSONArray("docs")
return manga.copy( return manga.copy(
title = title.getString("be"), 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", coverUrl = "$poster?width=200&height=280",
largeCoverUrl = poster, largeCoverUrl = poster,
description = details.getJSONObject("description").getString("be"), description = details.getJSONObject("description").getString("be"),
@ -239,7 +236,7 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context,
title = title.getString("be"), title = title.getString("be"),
coverUrl = jo.getString("poster").removePrefix("/cdn") coverUrl = jo.getString("poster").removePrefix("/cdn")
.toAbsoluteUrl(getDomain("cdn")) + "?width=200&height=280", .toAbsoluteUrl(getDomain("cdn")) + "?width=200&height=280",
altTitle = title.getString("en").takeUnless(String::isEmpty), altTitle = title.getString("en").nullIfEmpty(),
author = null, author = null,
isNsfw = false, isNsfw = false,
rating = RATING_UNKNOWN, rating = RATING_UNKNOWN,

@ -190,7 +190,7 @@ internal class AsuraScansParser(context: MangaLoaderContext) :
val data = doc.selectOrThrow("script").mapNotNull { x -> val data = doc.selectOrThrow("script").mapNotNull { x ->
x.data().substringBetween("self.__next_f.push(", ")", "") x.data().substringBetween("self.__next_f.push(", ")", "")
.trim() .trim()
.takeUnless { it.isEmpty() } .nullIfEmpty()
}.flatMap { it.jsonStrings() } }.flatMap { it.jsonStrings() }
.joinToString("") .joinToString("")
.split('\n') .split('\n')

@ -50,6 +50,7 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex
append(page.toString()) append(page.toString())
} }
} }
else -> { else -> {
when (order) { when (order) {
SortOrder.POPULARITY -> append("popular-comics") SortOrder.POPULARITY -> append("popular-comics")
@ -153,7 +154,7 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex
val doc = webClient.httpGet(fullUrl).parseHtml() val doc = webClient.httpGet(fullUrl).parseHtml()
return doc.select("div.chapter-container img").mapNotNull { img -> 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 { url?.let {
MangaPage( MangaPage(
id = generateUid(url), id = generateUid(url),

@ -10,10 +10,7 @@ import org.koitharu.kotatsu.parsers.model.MangaListFilterCapabilities
import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.MangaTag
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
import org.koitharu.kotatsu.parsers.util.attrAsAbsoluteUrl import org.koitharu.kotatsu.parsers.util.*
import org.koitharu.kotatsu.parsers.util.domain
import org.koitharu.kotatsu.parsers.util.parseHtml
import org.koitharu.kotatsu.parsers.util.toTitleCase
@Broken @Broken
@MangaSourceParser("FREAKCOMIC", "FreakComic", "en") @MangaSourceParser("FREAKCOMIC", "FreakComic", "en")
@ -41,7 +38,7 @@ internal class FreakComic(context: MangaLoaderContext) :
key = el.attrAsAbsoluteUrl("href") key = el.attrAsAbsoluteUrl("href")
.toHttpUrlOrNull() .toHttpUrlOrNull()
?.queryParameter("genre") ?.queryParameter("genre")
?.takeUnless { it.isEmpty() } ?.nullIfEmpty()
?: continue, ?: continue,
source = source, source = source,
) )

@ -150,7 +150,7 @@ internal class TruyenGG(context: MangaLoaderContext) : PagedMangaParser(context,
return manga.copy( return manga.copy(
altTitle = doc.selectFirst("h2.other-name")?.text(), 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 { tags = doc.select("a.clblue").mapToSet {
MangaTag( MangaTag(
key = it.attr("href").substringAfterLast('-').substringBeforeLast('.'), key = it.attr("href").substringAfterLast('-').substringBeforeLast('.'),

@ -127,9 +127,9 @@ public fun Element.selectLastOrThrow(cssQuery: String): Element = parseNotNull(s
"Cannot find \"$cssQuery\"" "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? { public fun Element.selectFirstParent(query: String): Element? {
val selector = QueryParser.parse(query) val selector = QueryParser.parse(query)

@ -17,7 +17,7 @@ public suspend fun Call.await(): Response = suspendCancellableCoroutine { contin
} }
public val Response.mimeType: String? public val Response.mimeType: String?
get() = header("content-type")?.takeUnless { it.isEmpty() } get() = header("content-type")?.nullIfEmpty()
public val Response.contentDisposition: String? public val Response.contentDisposition: String?
get() = header("Content-Disposition") get() = header("Content-Disposition")

@ -107,6 +107,8 @@ public fun String.nl2br(): String = replace("\n", "<br>")
public fun String.splitByWhitespace(): List<String> = trim().split(REGEX_WHITESPACE) public fun String.splitByWhitespace(): List<String> = trim().split(REGEX_WHITESPACE)
public fun <T : CharSequence> T.nullIfEmpty(): T? = takeUnless { it.isEmpty() }
public fun ByteArray.byte2HexFormatted(): String { public fun ByteArray.byte2HexFormatted(): String {
val str = StringBuilder(size * 2) val str = StringBuilder(size * 2)
for (i in indices) { for (i in indices) {

@ -4,6 +4,7 @@ import androidx.collection.ArraySet
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONException import org.json.JSONException
import org.json.JSONObject import org.json.JSONObject
import org.koitharu.kotatsu.parsers.util.nullIfEmpty
import java.util.* import java.util.*
import kotlin.contracts.contract import kotlin.contracts.contract
@ -67,9 +68,7 @@ public fun <T> JSONArray.mapJSONIndexed(block: (Int, JSONObject) -> T): List<T>
public fun JSONObject.getStringOrNull(name: String): String? = opt(name)?.takeUnless { public fun JSONObject.getStringOrNull(name: String): String? = opt(name)?.takeUnless {
it === JSONObject.NULL it === JSONObject.NULL
}?.toString()?.takeUnless { }?.toString()?.nullIfEmpty()
it.isEmpty()
}
public fun JSONObject.getBooleanOrDefault(name: String, defaultValue: Boolean): Boolean { public fun JSONObject.getBooleanOrDefault(name: String, defaultValue: Boolean): Boolean {
return when (val rawValue = opt(name)) { return when (val rawValue = opt(name)) {

Loading…
Cancel
Save