From 3fb37d667239118831b4a3c779fa5565daf229c2 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sat, 30 Jul 2022 15:00:55 +0300 Subject: [PATCH] [Tatakae Scans] Migrate from Madara to Madara v6 --- .../parsers/site/madara/Madara5Parser.kt | 3 +- .../parsers/site/madara/Madara6Parser.kt | 4 +- .../parsers/site/madara/MadaraParser.kt | 5 +- .../parsers/site/madara/TatakaeScansParser.kt | 79 ++++++++----------- 4 files changed, 42 insertions(+), 49 deletions(-) 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 88fbbe55..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 -> @@ -179,7 +180,7 @@ internal abstract class MadaraParser( } } - fun parseChapterDate(dateFormat: DateFormat, date: String?): Long { + private fun parseChapterDate(dateFormat: DateFormat, date: String?): Long { date ?: return 0 return when { date.endsWith(" ago", ignoreCase = true) -> { 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 index f5706ffb..0bb7c566 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/TatakaeScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/TatakaeScansParser.kt @@ -1,61 +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.exception.ParseException 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.MangaTag -import org.koitharu.kotatsu.parsers.util.* -import java.text.SimpleDateFormat +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-BR") +@MangaSourceParser("TATAKAE_SCANS", "Tatakae Scans", "pt") internal class TatakaeScansParser(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.TATAKAE_SCANS, "tatakaescan.com") { + Madara6Parser(context, MangaSource.TATAKAE_SCANS, "tatakaescan.com") { - override suspend fun getDetails(manga: Manga): Manga { - val fullUrl = manga.url.toAbsoluteUrl(getDomain()) - val doc = context.httpGet(fullUrl).parseHtml() - val root = doc.body().selectFirst("div.profile-manga") - ?.selectFirst("div.summary_content") - ?.selectFirst("div.post-content") - ?: throw ParseException("Root not found", fullUrl) - val root2 = doc.body().selectFirst("div.content-area") - ?.selectFirst("div.c-page") - ?: throw ParseException("Root2 not found", fullUrl) - val dateFormat = SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR")) + 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( - tags = root.selectFirst("div.genres-content")?.select("a") - ?.mapNotNullToSet { a -> - MangaTag( - key = a.attr("href").removeSuffix("/").substringAfterLast('/'), - title = a.text().toTitleCase(), - source = source, - ) - } ?: manga.tags, - description = root.selectFirst("div.post-content") - ?.select("p") - ?.joinToString { it.html() }, - chapters = root2.select("li").asReversed().mapChapters { i, li -> - val a = li.selectFirst("a") - val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing") - MangaChapter( - id = generateUid(href), - name = a.ownText(), - number = i + 1, - url = href, - uploadDate = parseChapterDate( - dateFormat, - li.selectFirst("span.chapter-release-date")?.text(), - ), - source = source, - scanlator = null, - branch = null, - ) - }, + 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