Add support for collections and refactor manga description (#5407)
This commit is contained in:
@ -5,7 +5,7 @@ ext {
|
|||||||
extName = 'Pururin'
|
extName = 'Pururin'
|
||||||
pkgNameSuffix = 'en.pururin'
|
pkgNameSuffix = 'en.pururin'
|
||||||
extClass = '.Pururin'
|
extClass = '.Pururin'
|
||||||
extVersionCode = 2
|
extVersionCode = 3
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
containsNsfw = true
|
containsNsfw = true
|
||||||
}
|
}
|
||||||
|
@ -68,53 +68,85 @@ class Pururin : ParsedHttpSource() {
|
|||||||
manga.genre = genres.joinToString(", ")
|
manga.genre = genres.joinToString(", ")
|
||||||
manga.thumbnail_url = document.select("div.cover-wrapper v-lazy-image").attr("abs:src")
|
manga.thumbnail_url = document.select("div.cover-wrapper v-lazy-image").attr("abs:src")
|
||||||
|
|
||||||
var tags = ""
|
manga.description = getDesc(document)
|
||||||
genres.forEach { tags += " <$it>" }
|
|
||||||
|
|
||||||
manga.description = "Title: " + manga.title + "\n\n" + getDesc(document) + tags
|
|
||||||
|
|
||||||
return manga
|
return manga
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getDesc(document: Document): String {
|
private fun getDesc(document: Document): String {
|
||||||
val infoElement = document.select("div.box.box-gallery")
|
val infoElement = document.select("div.box.box-gallery")
|
||||||
val stringBuilder = StringBuilder()
|
val uploader = infoElement.select("tr:has(td:contains(Uploader)) .user-link")?.text()
|
||||||
val magazine = infoElement.select("tr:has(td:contains(Convention)) a").text()
|
val pages = infoElement.select("tr:has(td:contains(Pages)) td:eq(1)").text()
|
||||||
val parodies = infoElement.select("tr:has(td:contains(Parody)) a").text()
|
val ratingCount = infoElement.select("tr:has(td:contains(Ratings)) span[itemprop=\"ratingCount\"]")?.attr("content")
|
||||||
val pagess = infoElement.select("tr:has(td:contains(Pages)) td:eq(1)").text()
|
|
||||||
|
|
||||||
if (magazine.isNotEmpty()) {
|
val rating = infoElement.select("tr:has(td:contains(Ratings)) gallery-rating").attr(":rating")?.toFloatOrNull()?.let {
|
||||||
stringBuilder.append("Magazine: ")
|
if (it > 5.0f) minOf(it, 5.0f) // cap rating to 5.0 for rare cases where value exceeds 5.0f
|
||||||
stringBuilder.append(magazine)
|
else it
|
||||||
stringBuilder.append("\n\n")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parodies.isNotEmpty()) {
|
val multiDescriptions = listOf(
|
||||||
stringBuilder.append("Parodies: ")
|
"Convention",
|
||||||
stringBuilder.append(parodies)
|
"Parody",
|
||||||
stringBuilder.append("\n\n")
|
"Circle",
|
||||||
}
|
"Category",
|
||||||
|
"Character",
|
||||||
|
"Language"
|
||||||
|
).map { it to infoElement.select("tr:has(td:contains($it)) a").map { v -> v.text() } }
|
||||||
|
.filter { !it.second.isNullOrEmpty() }
|
||||||
|
.map { "${it.first}: ${it.second.joinToString()}" }
|
||||||
|
|
||||||
stringBuilder.append("Pages: ")
|
val descriptions = listOf(
|
||||||
stringBuilder.append(pagess)
|
multiDescriptions.joinToString("\n\n"),
|
||||||
stringBuilder.append("\n\n")
|
uploader?.let { "Uploader: $it" },
|
||||||
|
pages?.let { "Pages: $it" },
|
||||||
|
rating?.let { "Ratings: $it" + (ratingCount?.let { c -> " ($c ratings)" } ?: "") }
|
||||||
|
)
|
||||||
|
|
||||||
return stringBuilder.toString()
|
return descriptions.joinToString("\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun chapterListSelector() = "div.gallery-action a"
|
override fun chapterListParse(response: Response) = with(response.asJsoup()) {
|
||||||
|
val mangaInfoElements = this.select(".table-gallery-info tr td:first-child").map {
|
||||||
|
it.text() to it.nextElementSibling()
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
// TODO Make it work for collections
|
val chapters = this.select(".table-collection tbody tr")
|
||||||
override fun chapterFromElement(element: Element): SChapter {
|
if (!chapters.isNullOrEmpty())
|
||||||
|
chapters.map {
|
||||||
|
val details = it.select("td")
|
||||||
|
SChapter.create().apply {
|
||||||
|
chapter_number = details[0].text().removePrefix("#").toFloat()
|
||||||
|
name = details[1].select("a").text()
|
||||||
|
setUrlWithoutDomain(details[1].select("a").attr("href"))
|
||||||
|
|
||||||
val chapter = SChapter.create()
|
if (it.hasClass("active") && mangaInfoElements.containsKey("Scanlator"))
|
||||||
|
scanlator = mangaInfoElements.getValue("Scanlator").select("li a")?.joinToString { s -> s.text() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
listOf(
|
||||||
|
SChapter.create().apply {
|
||||||
|
name = "Chapter"
|
||||||
|
setUrlWithoutDomain(response.request().url().toString())
|
||||||
|
|
||||||
chapter.setUrlWithoutDomain(element.attr("href"))
|
if (mangaInfoElements.containsKey("Scanlator"))
|
||||||
chapter.name = "Read the chapter"
|
scanlator = mangaInfoElements.getValue("Scanlator").select("li a")?.joinToString { s -> s.text() }
|
||||||
|
}
|
||||||
return chapter
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun pageListRequest(chapter: SChapter): Request = GET(
|
||||||
|
"$baseUrl${chapter.url.let {
|
||||||
|
it.substringAfterLast("/").let { titleUri ->
|
||||||
|
it.replace(titleUri, "01/$titleUri")
|
||||||
|
}.replace("gallery", "read")
|
||||||
|
}}"
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun chapterListSelector(): String = throw UnsupportedOperationException("Not used")
|
||||||
|
|
||||||
|
override fun chapterFromElement(element: Element): SChapter = throw UnsupportedOperationException("Not used")
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
val pages = mutableListOf<Page>()
|
val pages = mutableListOf<Page>()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user