[NudeMoon] Fix large amount of pages parsing

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

Loading…
Cancel
Save