From dac06ddd0ba587f5c6333a4610acfde67f16ff33 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sat, 30 Jul 2022 15:10:44 +0300 Subject: [PATCH] [Tatakae Scans] New source --- .../parsers/site/madara/Madara5Parser.kt | 3 +- .../parsers/site/madara/Madara6Parser.kt | 4 +- .../parsers/site/madara/MadaraParser.kt | 3 +- .../parsers/site/madara/TatakaeScansParser.kt | 50 +++++++++++++++++++ 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/TatakaeScansParser.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/Madara5Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/Madara5Parser.kt index 741c3fb0..26072e61 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/Madara5Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/Madara5Parser.kt @@ -18,6 +18,7 @@ abstract class Madara5Parser @InternalParsersApi constructor( domain: String, ) : PagedMangaParser(source, pageSize = 22) { + protected open val datePattern = "MMMM dd, HH:mm" protected open val tagPrefix = "/mangas/" protected open val nsfwTags = arraySetOf("yaoi", "yuri", "mature") @@ -125,7 +126,7 @@ abstract class Madara5Parser @InternalParsersApi constructor( } private suspend fun loadChapters(mangaId: Long): List { - val dateFormat = SimpleDateFormat("MMMM dd, HH:mm", sourceLocale ?: Locale.US) + val dateFormat = SimpleDateFormat(datePattern, sourceLocale ?: Locale.US) val doc = context.httpGet("https://${getDomain()}/ajax-list-chapter?mangaID=$mangaId").parseHtml() return doc.select("li.wp-manga-chapter").asReversed().mapChapters { i, li -> val a = li.selectFirstOrThrow("a") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/Madara6Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/Madara6Parser.kt index 6cef4bf7..5fa04a6c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/Madara6Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/Madara6Parser.kt @@ -15,6 +15,8 @@ internal abstract class Madara6Parser( domain: String, ) : MadaraParser(context, source, domain) { + override val datePattern: String = "dd MMMM yyyy" + override suspend fun getDetails(manga: Manga): Manga { return coroutineScope { val chapters = async { loadChapters(manga.url) } @@ -44,7 +46,7 @@ internal abstract class Madara6Parser( protected open suspend fun loadChapters(mangaUrl: String): List { val url = mangaUrl.toAbsoluteUrl(getDomain()).removeSuffix('/') + "/ajax/chapters/" - val dateFormat = SimpleDateFormat("dd MMMM yyyy", sourceLocale ?: Locale.ROOT) + val dateFormat = SimpleDateFormat(datePattern, sourceLocale ?: Locale.ROOT) val doc = context.httpPost(url, emptyMap()).parseHtml() return doc.select("li.wp-manga-chapter").asReversed().mapChapters { i, li -> val a = li.selectFirstOrThrow("a") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt index 4c8529b8..bffe2d24 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt @@ -27,6 +27,7 @@ internal abstract class MadaraParser( protected open val tagPrefix = "manga-genre/" protected open val isNsfwSource = false + protected open val datePattern = "MMMM dd, yyyy" init { paginator.firstPage = 0 @@ -125,7 +126,7 @@ internal abstract class MadaraParser( val root2 = doc.body().selectFirst("div.content-area") ?.selectFirst("div.c-page") ?: throw ParseException("Root2 not found", fullUrl) - val dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US) + val dateFormat = SimpleDateFormat(datePattern, Locale.US) return manga.copy( tags = root.selectFirst("div.genres-content")?.select("a") ?.mapNotNullToSet { a -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/TatakaeScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/TatakaeScansParser.kt new file mode 100644 index 00000000..0bb7c566 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/TatakaeScansParser.kt @@ -0,0 +1,50 @@ +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.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaChapter +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.MangaState +import org.koitharu.kotatsu.parsers.util.attrAsAbsoluteUrlOrNull +import org.koitharu.kotatsu.parsers.util.mapToSet +import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow +import java.util.* + +@MangaSourceParser("TATAKAE_SCANS", "Tatakae Scans", "pt") +internal class TatakaeScansParser(context: MangaLoaderContext) : + Madara6Parser(context, MangaSource.TATAKAE_SCANS, "tatakaescan.com") { + + override val datePattern: String = "dd 'de' MMMMM 'de' yyyy" + + 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("GĂȘnero") + .firstOrNull()?.tableValue() + ?.getElementsByAttributeValueContaining("href", tagPrefix) + ?.mapToSet { a -> a.asMangaTag() } ?: manga.tags + return manga.copy( + largeCoverUrl = root.selectFirst("picture") + ?.selectFirst("img[data-src]") + ?.attrAsAbsoluteUrlOrNull("data-src"), + description = (root.selectFirst(".detail-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 fun String.asMangaState() = when (trim().lowercase(Locale.ROOT)) { + "em lançamento" -> MangaState.ONGOING + + else -> null + } + +} \ No newline at end of file