From eebb6f0c445865bb32342bfac37bb8761976a8d5 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sun, 11 Sep 2022 14:41:32 +0300 Subject: [PATCH] [NeoxScans] Add source #47 --- .../parsers/site/madara/NeoxScansParser.kt | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/NeoxScansParser.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/NeoxScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/NeoxScansParser.kt new file mode 100644 index 00000000..6dd722ed --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/NeoxScansParser.kt @@ -0,0 +1,70 @@ +package org.koitharu.kotatsu.parsers.site.madara + +import org.jsoup.nodes.Element +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.exception.ParseException +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.util.* +import java.util.* + +@MangaSourceParser("NEOXSCANS", "NeoxScans", "pt") +internal class NeoxScansParser(context: MangaLoaderContext) : + Madara6Parser(context, MangaSource.NEOXSCANS, "neoxscans.net") { + + override val tagPrefix = "manga-genre/" + + override val datePattern: String = "dd/MM/yyyy" + + override fun getFaviconUrl(): String { + return "https://${getDomain()}/wp-content/uploads/2022/05/cropped-cropped-neoxscans-192x192.png" + } + + override fun parseDetails(manga: Manga, body: Element, chapters: List): Manga { + val root = body.selectFirstOrThrow(".site-content") + val postContent = root.selectFirstOrThrow(".post-content") + val tags = postContent.getElementsContainingOwnText("Genre") + .firstOrNull()?.tableValue() + ?.getElementsByAttributeValueContaining("href", tagPrefix) + ?.mapToSet { a -> a.asMangaTag() } ?: manga.tags + return manga.copy( + largeCoverUrl = root.selectFirst("picture") + ?.selectFirst("img[src]") + ?.attrAsAbsoluteUrlOrNull("src"), + description = (root.selectFirst(".post-content") + ?: root.selectFirstOrThrow(".manga-excerpt")).html(), + author = postContent.getElementsContainingOwnText("Autor") + .firstOrNull()?.tableValue()?.text()?.trim(), + state = postContent.getElementsContainingOwnText("Status") + .firstOrNull()?.tableValue()?.text()?.asMangaState(), + tags = tags, + isNsfw = body.hasClass("adult-content"), + chapters = chapters, + ) + } + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(getDomain()) + val doc = context.httpGet(fullUrl).parseHtml() + val root = doc.body().selectFirst("div.main-col-inner") + ?.selectFirst("div.reading-content") + ?: throw ParseException("Root not found", fullUrl) + return root.select("div.page-break").map { div -> + val img = div.selectFirst("img") ?: div.parseFailed("Page image not found") + val url = img.attr("src") ?: div.parseFailed("Image src not found") + MangaPage( + id = generateUid(url), + url = url, + preview = null, + referer = fullUrl, + source = source, + ) + } + } + + override fun String.asMangaState() = when (trim().lowercase(Locale.forLanguageTag("pt"))) { + "Em lançamento" -> MangaState.ONGOING + "Completo" -> MangaState.FINISHED + else -> null + } +} \ No newline at end of file