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 e8025121..2e0bae3a 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
@@ -289,7 +289,7 @@ internal class ExHentaiParser(
val response = chain.proceed(chain.request())
if (response.headersContentLength() <= 256) {
val text = response.peekBody(256).string()
- if (text.startsWith("Your IP address has been temporarily banned", ignoreCase = true)) {
+ if (text.contains("IP address has been temporarily banned", ignoreCase = true)) {
val hours = Regex("([0-9]+) hours?").find(text)?.groupValues?.getOrNull(1)?.toLongOrNull() ?: 0
val minutes = Regex("([0-9]+) minutes?").find(text)?.groupValues?.getOrNull(1)?.toLongOrNull() ?: 0
val seconds = Regex("([0-9]+) seconds?").find(text)?.groupValues?.getOrNull(1)?.toLongOrNull() ?: 0
diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt
index 7660e495..c470c919 100644
--- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt
+++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt
@@ -155,7 +155,7 @@ internal abstract class GroupleParser(
chapters = chaptersList?.select("a.chapter-link")
?.flatMapChapters(reversed = true) { a ->
val tr = a.selectFirstParent("tr") ?: return@flatMapChapters emptyList()
- val href = a.attrAsRelativeUrl("href").setQueryParam("d", userHash)
+ val href = a.attrAsRelativeUrl("href")
val number = tr.attr("data-num").toFloatOrNull()?.div(10f) ?: 0f
val volume = tr.attr("data-vol").toIntOrNull() ?: 0
if (translations.isNullOrEmpty() || a.attr("data-translations").isEmpty()) {
@@ -170,7 +170,7 @@ internal abstract class GroupleParser(
name = a.text().removePrefix(manga.title).trim(),
number = number,
volume = volume,
- url = href,
+ url = href.withQueryParam("d", userHash),
uploadDate = dateFormat.tryParse(tr.selectFirst("td.date")?.text()),
scanlator = translators,
source = newSource,
@@ -181,13 +181,13 @@ internal abstract class GroupleParser(
val translationData = JSONArray(a.attr("data-translations"))
translationData.mapJSON { jo ->
val personId = jo.getLong("personId")
- val link = href.setQueryParam("tran", personId.toString())
+ val link = href.withQueryParam("tran", personId.toString())
MangaChapter(
id = generateUid(link),
name = a.text().removePrefix(manga.title).trim(),
number = number,
volume = volume,
- url = link,
+ url = link.withQueryParam("d", userHash),
uploadDate = dateFormat.tryParse(jo.getStringOrNull("dateCreated")),
scanlator = null,
source = newSource,
@@ -499,7 +499,7 @@ internal abstract class GroupleParser(
return result
}
- private fun String.setQueryParam(name: String, value: String?): String {
+ private fun String.withQueryParam(name: String, value: String?): String {
if (value == null) return this
return toAbsoluteUrl(domain)
.toHttpUrl()
diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt
index e1466010..ac7b4f77 100644
--- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt
+++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt
@@ -5,7 +5,6 @@ package org.koitharu.kotatsu.parsers.util
import okhttp3.Response
import okhttp3.ResponseBody
import okhttp3.internal.closeQuietly
-import org.jetbrains.annotations.Blocking
import org.json.JSONArray
import org.json.JSONObject
import org.jsoup.Jsoup
@@ -18,7 +17,7 @@ import java.text.DateFormat
* @see [parseJson]
* @see [parseJsonArray]
*/
-@Blocking
+// TODO suspend
public fun Response.parseHtml(): Document = try {
val body = requireBody()
val charset = body.contentType()?.charset()?.name()
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 f6237441..0d4d83ba 100644
--- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/String.kt
+++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/String.kt
@@ -76,11 +76,11 @@ public fun String.transliterate(skipMissing: Boolean): String {
}
}
-public fun String.toFileNameSafe() = this.transliterate(false)
+public fun String.toFileNameSafe(): String = this.transliterate(false)
.replace(Regex("[^a-z0-9_\\-]", arraySetOf(RegexOption.IGNORE_CASE)), " ")
.replace(Regex("\\s+"), "_")
-public fun String.ellipsize(maxLength: Int) = if (this.length > maxLength) {
+public fun String.ellipsize(maxLength: Int): String = if (this.length > maxLength) {
this.take(maxLength - 1) + Typography.ellipsis
} else this
@@ -102,7 +102,7 @@ public fun String.urlEncoded(): String = URLEncoder.encode(this, Charsets.UTF_8.
public fun String.urlDecode(): String = URLDecoder.decode(this, Charsets.UTF_8.name())
-public fun String.nl2br() = replace("\n", "
")
+public fun String.nl2br(): String = replace("\n", "
")
public fun ByteArray.byte2HexFormatted(): String {
val str = StringBuilder(size * 2)
@@ -229,7 +229,7 @@ public fun String.almostEquals(other: String, @FloatRange(from = 0.0) threshold:
return diff < threshold
}
-public fun String.isNumeric() = all { c -> c.isDigit() }
+public fun String.isNumeric(): Boolean = all { c -> c.isDigit() }
internal fun StringBuilder.removeTrailingZero() {
if (length > 2 && get(length - 1) == '0') {