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 f77d83a7..7660e495 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 @@ -131,6 +131,8 @@ internal abstract class GroupleParser( if (chaptersList == null && root.getElementsContainingOwnText(NO_CHAPTERS).isEmpty()) { root.parseFailed("No chapters found") } + val hashRegex = Regex("window.user_hash\\s*=\\s*\'([^\']+)\'") + val userHash = doc.select("script").firstNotNullOfOrNull { it.html().findGroupValue(hashRegex) } return manga.copy( source = newSource, title = doc.metaValue("name") ?: manga.title, @@ -153,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") + val href = a.attrAsRelativeUrl("href").setQueryParam("d", userHash) 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()) { @@ -497,7 +499,8 @@ internal abstract class GroupleParser( return result } - private fun String.setQueryParam(name: String, value: String): String { + private fun String.setQueryParam(name: String, value: String?): String { + if (value == null) return this return toAbsoluteUrl(domain) .toHttpUrl() .newBuilder() 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 6d08e974..f6237441 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/String.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/String.kt @@ -169,7 +169,9 @@ public fun String.substringBetweenLast(from: String, to: String, fallbackValue: } } -public fun String.find(regex: Regex) = regex.find(this)?.value +public fun String.find(regex: Regex): String? = regex.find(this)?.value + +public fun String.findGroupValue(regex: Regex): String? = regex.find(this)?.groupValues?.getOrNull(1) public fun String.removeSuffix(suffix: Char): String { if (lastOrNull() == suffix) {