[NudeMoon] Fix large amount of pages parsing

Koitharu 4 years ago
parent 8e23a7fcd4
commit bb9a6630ac
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -13,6 +13,8 @@ import java.text.SimpleDateFormat
import java.util.*
import java.util.regex.Pattern
private const val MAX_THUMB_INDEX = 20
internal class NudeMoonParser(
override val context: MangaLoaderContext,
) : MangaParser(MangaSource.NUDEMOON), MangaParserAuthProvider {
@ -120,7 +122,7 @@ internal class NudeMoonParser(
chapters = listOf(
MangaChapter(
id = manga.id,
url = manga.url,
url = manga.url.replace("--", "-online-"),
source = source,
number = 1,
name = manga.title,
@ -138,21 +140,30 @@ internal class NudeMoonParser(
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain()
val doc = context.httpGet(fullUrl).parseHtml()
val root = doc.body().selectFirst("td.main-body")
?: parseFailed("Cannot find root")
val readlink = root.selectFirst("table.shoutbox")?.selectFirst("a")?.absUrl("href")
?: parseFailed("Cannot obtain read link")
val fullPages = getFullPages(readlink)
return root.getElementsByAttributeValueMatching("href", pageUrlPatter).mapIndexedNotNull { i, a ->
val url = a.relUrl("href")
val mangaId = chapter.url.substringAfterLast('/').substringBefore('-').toIntOrNull()
val script = doc.select("script").firstNotNullOfOrNull {
it.html().takeIf { x -> x.contains(" images = new ") }
} ?: parseFailed("Cannot find pages list")
val pagesRegex = Regex("images\\[(\\d+)].src\\s*=\\s*'([^']+)'", RegexOption.MULTILINE)
return pagesRegex.findAll(script).map { match ->
val i = match.groupValues[1].toInt()
val url = match.groupValues[2]
MangaPage(
id = generateUid(url),
url = fullPages[i] ?: return@mapIndexedNotNull null,
url = url,
referer = fullUrl,
preview = a.selectFirst("img")?.absUrl("src"),
preview = if (i <= MAX_THUMB_INDEX && mangaId != null) {
val part2 = url.substringBeforeLast('/')
val part3 = url.substringAfterLast('/')
val part1 = part2.substringBeforeLast('/')
"$part1/thumb/$mangaId/thumb_$part3"
} else {
null
},
source = source,
)
}
}.toList()
}
override suspend fun getTags(): Set<MangaTag> {

Loading…
Cancel
Save