[Grouple] Fix chapters parsing

pull/180/head
Koitharu 3 years ago
parent 44e28b40d3
commit f732582d55
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -175,9 +175,9 @@ internal abstract class GroupleParser(
}, },
author = root.selectFirst("a.person-link")?.text() ?: manga.author, author = root.selectFirst("a.person-link")?.text() ?: manga.author,
isNsfw = manga.isNsfw || root.select(".alert-warning").any { it.ownText().contains(NSFW_ALERT) }, isNsfw = manga.isNsfw || root.select(".alert-warning").any { it.ownText().contains(NSFW_ALERT) },
chapters = root.selectFirst("div.chapters-link")?.selectFirst("table") chapters = root.requireElementById("chapters-list").select("a.chapter-link")
?.select("tr:has(td > a)")?.mapChapters(reversed = true) { i, tr -> .mapChapters(reversed = true) { i, a ->
val a = tr.selectFirst("a.chapter-link") ?: return@mapChapters null val tr = a.selectFirstParent("tr") ?: return@mapChapters null
val href = a.attrAsRelativeUrl("href") val href = a.attrAsRelativeUrl("href")
var translators = "" var translators = ""
val translatorElement = a.attr("title") val translatorElement = a.attr("title")
@ -188,7 +188,7 @@ internal abstract class GroupleParser(
} }
MangaChapter( MangaChapter(
id = generateUid(href), id = generateUid(href),
name = tr.selectFirst("a")?.text().orEmpty().removePrefix(manga.title).trim(), name = a.text().removePrefix(manga.title).trim(),
number = i + 1, number = i + 1,
url = href, url = href,
uploadDate = dateFormat.tryParse(tr.selectFirst("td.date")?.text()), uploadDate = dateFormat.tryParse(tr.selectFirst("td.date")?.text()),

@ -4,6 +4,7 @@ import androidx.collection.arraySetOf
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.exception.ParseException
import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.*
import java.util.* import java.util.*
@ -60,7 +61,12 @@ internal class MangaRead(context: MangaLoaderContext) :
}, },
) )
} }
val root = webClient.httpGet(url.build()).parseHtml().body().selectFirstOrThrow(".search-wrap") val body = webClient.httpGet(url.build()).parseHtml().body()
val root = body.selectFirst(".search-wrap") ?: if (body.selectFirst(".not-found-content") != null) {
return emptyList()
} else {
throw ParseException(".search-wrap not found", body.baseUri())
}
return root.select(".c-tabs-item__content").map { div -> return root.select(".c-tabs-item__content").map { div ->
val a = div.selectFirstOrThrow("a") val a = div.selectFirstOrThrow("a")
val img = div.selectLastOrThrow("img") val img = div.selectLastOrThrow("img")

@ -5,6 +5,7 @@ package org.koitharu.kotatsu.parsers.util
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import org.jsoup.select.Elements import org.jsoup.select.Elements
import org.jsoup.select.QueryParser
import org.jsoup.select.Selector import org.jsoup.select.Selector
import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.exception.ParseException
@ -119,3 +120,12 @@ fun Element.selectLastOrThrow(cssQuery: String): Element {
fun Element.textOrNull(): String? = text().takeUnless { it.isEmpty() } fun Element.textOrNull(): String? = text().takeUnless { it.isEmpty() }
fun Element.ownTextOrNull(): String? = ownText().takeUnless { it.isEmpty() } fun Element.ownTextOrNull(): String? = ownText().takeUnless { it.isEmpty() }
fun Element.selectFirstParent(query: String): Element? {
val selector = QueryParser.parse(query)
val parents = parents()
val root = parents.lastOrNull() ?: return null
return parents.firstOrNull {
selector.matches(root, it)
}
}

Loading…
Cancel
Save