[Tatakae Scans] Migrate from Madara to Madara v6

pull/38/head
Zakhar Timoshenko 4 years ago
parent f3217bc2f0
commit 3fb37d6672

@ -18,6 +18,7 @@ abstract class Madara5Parser @InternalParsersApi constructor(
domain: String, domain: String,
) : PagedMangaParser(source, pageSize = 22) { ) : PagedMangaParser(source, pageSize = 22) {
protected open val datePattern = "MMMM dd, HH:mm"
protected open val tagPrefix = "/mangas/" protected open val tagPrefix = "/mangas/"
protected open val nsfwTags = arraySetOf("yaoi", "yuri", "mature") protected open val nsfwTags = arraySetOf("yaoi", "yuri", "mature")
@ -125,7 +126,7 @@ abstract class Madara5Parser @InternalParsersApi constructor(
} }
private suspend fun loadChapters(mangaId: Long): List<MangaChapter> { private suspend fun loadChapters(mangaId: Long): List<MangaChapter> {
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() val doc = context.httpGet("https://${getDomain()}/ajax-list-chapter?mangaID=$mangaId").parseHtml()
return doc.select("li.wp-manga-chapter").asReversed().mapChapters { i, li -> return doc.select("li.wp-manga-chapter").asReversed().mapChapters { i, li ->
val a = li.selectFirstOrThrow("a") val a = li.selectFirstOrThrow("a")

@ -15,6 +15,8 @@ internal abstract class Madara6Parser(
domain: String, domain: String,
) : MadaraParser(context, source, domain) { ) : MadaraParser(context, source, domain) {
override val datePattern: String = "dd MMMM yyyy"
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
return coroutineScope { return coroutineScope {
val chapters = async { loadChapters(manga.url) } val chapters = async { loadChapters(manga.url) }
@ -44,7 +46,7 @@ internal abstract class Madara6Parser(
protected open suspend fun loadChapters(mangaUrl: String): List<MangaChapter> { protected open suspend fun loadChapters(mangaUrl: String): List<MangaChapter> {
val url = mangaUrl.toAbsoluteUrl(getDomain()).removeSuffix('/') + "/ajax/chapters/" 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() val doc = context.httpPost(url, emptyMap()).parseHtml()
return doc.select("li.wp-manga-chapter").asReversed().mapChapters { i, li -> return doc.select("li.wp-manga-chapter").asReversed().mapChapters { i, li ->
val a = li.selectFirstOrThrow("a") val a = li.selectFirstOrThrow("a")

@ -27,6 +27,7 @@ internal abstract class MadaraParser(
protected open val tagPrefix = "manga-genre/" protected open val tagPrefix = "manga-genre/"
protected open val isNsfwSource = false protected open val isNsfwSource = false
protected open val datePattern = "MMMM dd, yyyy"
init { init {
paginator.firstPage = 0 paginator.firstPage = 0
@ -125,7 +126,7 @@ internal abstract class MadaraParser(
val root2 = doc.body().selectFirst("div.content-area") val root2 = doc.body().selectFirst("div.content-area")
?.selectFirst("div.c-page") ?.selectFirst("div.c-page")
?: throw ParseException("Root2 not found", fullUrl) ?: throw ParseException("Root2 not found", fullUrl)
val dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US) val dateFormat = SimpleDateFormat(datePattern, Locale.US)
return manga.copy( return manga.copy(
tags = root.selectFirst("div.genres-content")?.select("a") tags = root.selectFirst("div.genres-content")?.select("a")
?.mapNotNullToSet { 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 date ?: return 0
return when { return when {
date.endsWith(" ago", ignoreCase = true) -> { date.endsWith(" ago", ignoreCase = true) -> {

@ -1,61 +1,50 @@
package org.koitharu.kotatsu.parsers.site.madara package org.koitharu.kotatsu.parsers.site.madara
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.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.MangaState
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.attrAsAbsoluteUrlOrNull
import java.text.SimpleDateFormat import org.koitharu.kotatsu.parsers.util.mapToSet
import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow
import java.util.* import java.util.*
@MangaSourceParser("TATAKAE_SCANS", "Tatakae Scans", "pt-BR") @MangaSourceParser("TATAKAE_SCANS", "Tatakae Scans", "pt")
internal class TatakaeScansParser(context: MangaLoaderContext) : 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 { override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
val fullUrl = manga.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet(fullUrl).parseHtml() override fun parseDetails(manga: Manga, body: Element, chapters: List<MangaChapter>): Manga {
val root = doc.body().selectFirst("div.profile-manga") val root = body.selectFirstOrThrow(".site-content")
?.selectFirst("div.summary_content") val postContent = root.selectFirstOrThrow(".post-content")
?.selectFirst("div.post-content") val tags = postContent.getElementsContainingOwnText("Gênero")
?: throw ParseException("Root not found", fullUrl) .firstOrNull()?.tableValue()
val root2 = doc.body().selectFirst("div.content-area") ?.getElementsByAttributeValueContaining("href", tagPrefix)
?.selectFirst("div.c-page") ?.mapToSet { a -> a.asMangaTag() } ?: manga.tags
?: throw ParseException("Root2 not found", fullUrl)
val dateFormat = SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR"))
return manga.copy( return manga.copy(
tags = root.selectFirst("div.genres-content")?.select("a") largeCoverUrl = root.selectFirst("picture")
?.mapNotNullToSet { a -> ?.selectFirst("img[data-src]")
MangaTag( ?.attrAsAbsoluteUrlOrNull("data-src"),
key = a.attr("href").removeSuffix("/").substringAfterLast('/'), description = (root.selectFirst(".detail-content")
title = a.text().toTitleCase(), ?: root.selectFirstOrThrow(".manga-excerpt")).html(),
source = source, author = postContent.getElementsContainingOwnText("Autor")
) .firstOrNull()?.tableValue()?.text()?.trim(),
} ?: manga.tags, state = postContent.getElementsContainingOwnText("Status")
description = root.selectFirst("div.post-content") .firstOrNull()?.tableValue()?.text()?.asMangaState(),
?.select("p") tags = tags,
?.joinToString { it.html() }, isNsfw = body.hasClass("adult-content"),
chapters = root2.select("li").asReversed().mapChapters { i, li -> chapters = chapters,
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,
)
},
) )
} }
override fun String.asMangaState() = when (trim().lowercase(Locale.ROOT)) {
"em lançamento" -> MangaState.ONGOING
else -> null
}
} }
Loading…
Cancel
Save