parent
ed21a5b397
commit
5f1f2df7f0
@ -1 +1 @@
|
||||
total: 1240
|
||||
total: 1241
|
||||
@ -0,0 +1,125 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.th
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.*
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
import java.util.Locale
|
||||
|
||||
@MangaSourceParser("MANHWABREAKUP", "ManhwaBreakup", "th")
|
||||
internal class ManhwaBreakup(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANHWABREAKUP, "www.manhwabreakup.com") {
|
||||
|
||||
override val datePattern = "MMMM dd, yyyy"
|
||||
override val sourceLocale: Locale = Locale("th")
|
||||
override val withoutAjax = true
|
||||
override val postReq = false
|
||||
|
||||
override val selectBodyPage = ".reading-content"
|
||||
override val selectPage = "img, div.displayImage + script:containsData(p,a,c,k,e,d)"
|
||||
|
||||
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
||||
val fullUrl = chapter.url.toAbsoluteUrl(domain)
|
||||
val doc = webClient.httpGet(fullUrl).parseHtml()
|
||||
|
||||
val root = doc.body().selectFirst(selectBodyPage) ?: doc.parseFailed("No content found")
|
||||
|
||||
val pages = mutableListOf<MangaPage>()
|
||||
|
||||
root.select(selectPage).forEachIndexed { index, element ->
|
||||
when (element.tagName()) {
|
||||
"img" -> {
|
||||
val url = element.requireSrc().toRelativeUrl(domain)
|
||||
pages.add(
|
||||
MangaPage(
|
||||
id = generateUid(url),
|
||||
url = url,
|
||||
preview = null,
|
||||
source = source,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
"script" -> {
|
||||
val scriptData = element.data()
|
||||
if (scriptData.contains("eval(function(p,a,c,k,e,d)")) {
|
||||
val unpackedScript = unpackScript(scriptData)
|
||||
|
||||
val imageUrl = unpackedScript
|
||||
.substringAfter("url(", "")
|
||||
.substringBefore(");", "")
|
||||
.trim()
|
||||
.removeSurrounding("'", "'")
|
||||
.removeSurrounding("\"", "\"")
|
||||
|
||||
if (imageUrl.isNotEmpty()) {
|
||||
val blockWidth = Regex("""width:\s*"?\s*\+?\s*(\d+)\s*\+?\s*"?px;""")
|
||||
.find(unpackedScript)?.groupValues?.get(1)?.toIntOrNull() ?: 0
|
||||
|
||||
val blockHeight = Regex("""height:\s*"?\s*\+?\s*(\d+)\s*\+?\s*"?px;""")
|
||||
.find(unpackedScript)?.groupValues?.get(1)?.toIntOrNull() ?: 0
|
||||
|
||||
val matrixData = unpackedScript
|
||||
.substringAfter("[", "")
|
||||
.substringBefore("];", "")
|
||||
.let { "[$it]" }
|
||||
|
||||
val scramblingData = buildString {
|
||||
append(blockWidth)
|
||||
append("|")
|
||||
append(blockHeight)
|
||||
append("|")
|
||||
append(matrixData)
|
||||
}
|
||||
|
||||
val urlWithData = "$imageUrl#$scramblingData"
|
||||
|
||||
pages.add(
|
||||
MangaPage(
|
||||
id = generateUid(urlWithData),
|
||||
url = urlWithData,
|
||||
preview = null,
|
||||
source = source,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return pages
|
||||
}
|
||||
|
||||
private fun unpackScript(packedScript: String): String {
|
||||
val regex = Regex(
|
||||
"""evalKATEX_INLINE_OPENfunctionKATEX_INLINE_OPENp,a,c,k,e,(?:r|d)KATEX_INLINE_CLOSE.*?KATEX_INLINE_OPEN'(.+?)'\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*'(.+?)'\.splitKATEX_INLINE_OPEN'\|'KATEX_INLINE_CLOSE""",
|
||||
RegexOption.DOT_MATCHES_ALL,
|
||||
)
|
||||
val match = regex.find(packedScript) ?: return ""
|
||||
|
||||
val (payload, radix, _, words) = match.destructured
|
||||
val wordList = words.split('|')
|
||||
|
||||
var unpacked = payload
|
||||
for (i in wordList.indices.reversed()) {
|
||||
val word = wordList.getOrNull(i) ?: ""
|
||||
if (word.isNotEmpty()) {
|
||||
val pattern = "\\b${i.toString(radix.toInt())}\\b"
|
||||
unpacked = unpacked.replace(Regex(pattern), word)
|
||||
}
|
||||
}
|
||||
return unpacked
|
||||
}
|
||||
|
||||
override suspend fun getFavicons(): Favicons {
|
||||
return Favicons(
|
||||
listOf(
|
||||
Favicon("https://$domain/wp-content/uploads/2022/03/break-up-logo1.png", 160, null),
|
||||
),
|
||||
domain,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue