diff --git a/multisrc/overrides/mangasar/meusmangas/src/MeusMangas.kt b/multisrc/overrides/mangasar/meusmangas/src/MeusMangas.kt index 2acb70232..e281a2f57 100644 --- a/multisrc/overrides/mangasar/meusmangas/src/MeusMangas.kt +++ b/multisrc/overrides/mangasar/meusmangas/src/MeusMangas.kt @@ -2,9 +2,13 @@ package eu.kanade.tachiyomi.extension.pt.meusmangas import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor import eu.kanade.tachiyomi.multisrc.mangasar.MangaSar +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.asJsoup import okhttp3.OkHttpClient +import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Element import java.util.concurrent.TimeUnit @@ -28,6 +32,33 @@ class MeusMangas : MangaSar( setUrlWithoutDomain(element.selectFirst("a").attr("abs:href")) } + override fun latestUpdatesRequest(page: Int): Request { + val newHeaders = headersBuilder() + .add("X-Requested-With", "XMLHttpRequest") + .build() + + val pagePath = if (page > 1) "page/$page" else "" + + return GET("$baseUrl/$pagePath", newHeaders) + } + + override fun latestUpdatesParse(response: Response): MangasPage { + val document = response.asJsoup() + + val mangaList = document.select("li.item_news-manga") + .map(::latestMangaFromElement) + + val hasNextPage = document.select("div.loadmore.morepage").firstOrNull() != null + + return MangasPage(mangaList, hasNextPage) + } + + private fun latestMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.select("h3.entry-title a").text() + thumbnail_url = element.select("img.manga").attr("src") + setUrlWithoutDomain(element.select("a").first().attr("abs:href")) + } + override fun mangaDetailsParse(response: Response): SManga { val document = response.asJsoup() val infoElement = document.selectFirst("div.box-single:has(div.mangapage)") @@ -36,12 +67,62 @@ class MeusMangas : MangaSar( title = infoElement.selectFirst("h1.kw-title").text() author = infoElement.selectFirst("div.mdq.author").text().trim() description = infoElement.selectFirst("div.sinopse-page").text() - genre = infoElement.select("div.touchcarousel a.widget-btn").joinToString { it.text() } + genre = infoElement.select("div.generos a.widget-btn").joinToString { it.text() } status = infoElement.selectFirst("span.mdq").text().toStatus() thumbnail_url = infoElement.selectFirst("div.thumb img").attr("abs:src") } } + override fun chapterListPaginatedRequest(mangaUrl: String, page: Int): Request { + val newHeaders = headersBuilder() + .add("X-Requested-With", "XMLHttpRequest") + .build() + + return GET("$baseUrl$mangaUrl/page/$page", newHeaders) + } + + override fun chapterListParse(response: Response): List { + var document = response.asJsoup() + + val chapterList = document.select(chapterListSelector()) + .map(::chapterFromElement) + .toMutableList() + + val mangaUrl = response.request.url.toString() + .substringAfter(baseUrl) + .substringBefore("/page") + var hasNextPage = document.select(chapterListNextPageSelector()) + .firstOrNull() + + while (hasNextPage != null && !hasNextPage.attr("href").endsWith("#")) { + val page = hasNextPage.attr("href") + .substringAfter("page/") + .toInt() + + val nextRequest = chapterListPaginatedRequest(mangaUrl, page) + val nextResponse = client.newCall(nextRequest).execute() + document = nextResponse.asJsoup() + + chapterList += document.select(chapterListSelector()) + .map(::chapterFromElement) + + hasNextPage = document.select(chapterListNextPageSelector()) + .firstOrNull() + } + + return chapterList + } + + private fun chapterListSelector() = "ul.list-of-chapters li > a" + + private fun chapterListNextPageSelector() = "div.loadmore a.loadmore" + + private fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + name = element.select("span.cap-text").text() + date_upload = element.select("span.chapter-date").text().toDate() + setUrlWithoutDomain(element.attr("abs:href")) + } + private fun String.toStatus(): Int = when (this) { "Em andamento" -> SManga.ONGOING "Completo" -> SManga.COMPLETED diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangasar/MangaSar.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangasar/MangaSar.kt index 50cad94b5..4a38cab1a 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangasar/MangaSar.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangasar/MangaSar.kt @@ -143,7 +143,7 @@ abstract class MangaSar( override fun chapterListRequest(manga: SManga): Request = chapterListPaginatedRequest(manga.url) - private fun chapterListPaginatedRequest(mangaUrl: String, page: Int = 1): Request { + protected open fun chapterListPaginatedRequest(mangaUrl: String, page: Int = 1): Request { val mangaId = mangaUrl.substringAfterLast("/") val newHeaders = apiHeadersBuilder() @@ -268,7 +268,7 @@ abstract class MangaSar( return chain.proceed(chain.request()) } - private fun String.toDate(): Long { + protected fun String.toDate(): Long { return try { DATE_FORMATTER.parse(this)?.time ?: 0L } catch (e: ParseException) { diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangasar/MangaSarGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangasar/MangaSarGenerator.kt index da68717e8..40f23c215 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangasar/MangaSarGenerator.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangasar/MangaSarGenerator.kt @@ -13,7 +13,7 @@ class MangaSarGenerator : ThemeSourceGenerator { override val sources = listOf( SingleLang("MangaTube", "https://mangatube.site", "pt-BR"), - SingleLang("Meus Mangás", "https://meusmangas.net", "pt-BR", isNsfw = true, className = "MeusMangas") + SingleLang("Meus Mangás", "https://meusmangas.net", "pt-BR", isNsfw = true, className = "MeusMangas", overrideVersionCode = 1) ) companion object {