ArgosScan: Fix popular manga (#9971)

* Fix popular manga

* Add 'isNsfw'

* Remove destructuring declaration
This commit is contained in:
Chopper 2025-08-06 11:49:45 -03:00 committed by Draff
parent b32672b47c
commit 31328ee895
Signed by: Draff
GPG Key ID: E8A89F3211677653
3 changed files with 27 additions and 68 deletions

View File

@ -1,7 +1,8 @@
ext { ext {
extName = 'Argos Scan' extName = 'Argos Scan'
extClass = '.ArgosScan' extClass = '.ArgosScan'
extVersionCode = 26 extVersionCode = 27
isNsfw = false
} }
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"

View File

@ -8,14 +8,13 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import keiyoushi.utils.parseAs
import keiyoushi.utils.tryParse import keiyoushi.utils.tryParse
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import rx.Observable
import java.io.IOException import java.io.IOException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
@ -42,8 +41,12 @@ class ArgosScan : ParsedHttpSource() {
// ============================ Popular ====================================== // ============================ Popular ======================================
override fun popularMangaRequest(page: Int) = GET(baseUrl, headers) override fun popularMangaRequest(page: Int) = GET(baseUrl, headers)
override fun popularMangaSelector() = throw UnsupportedOperationException() override fun popularMangaSelector() = "#projects-container .manga-block"
override fun popularMangaFromElement(element: Element) = throw UnsupportedOperationException() override fun popularMangaFromElement(element: Element) = SManga.create().apply {
title = element.selectFirst("h3")!!.text()
thumbnail_url = element.selectFirst("img")!!.absUrl("src")
setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href"))
}
override fun popularMangaNextPageSelector() = null override fun popularMangaNextPageSelector() = null
override fun popularMangaParse(response: Response): MangasPage { override fun popularMangaParse(response: Response): MangasPage {
@ -51,16 +54,9 @@ class ArgosScan : ParsedHttpSource() {
if (document.select("a[href*='auth/discord']").isNotEmpty()) { if (document.select("a[href*='auth/discord']").isNotEmpty()) {
throw IOException("Faça login na WebView") throw IOException("Faça login na WebView")
} }
return document.select(popularMangaSelector()).map(::popularMangaFromElement).let {
val script = document.selectFirst("script:containsData(projects)")!!.data() MangasPage(it, hasNextPage = false)
}
val mangas = POPULAR_REGEX.find(script)?.groups?.get(1)?.value?.let {
it.parseAs<List<MangaDto>>()
.filter { it.type != "novel" }
.map { it.toSManga(baseUrl) }
} ?: throw IOException("Não foi possivel encontrar os mangás")
return MangasPage(mangas, false)
} }
// ============================ Latest ====================================== // ============================ Latest ======================================
@ -75,18 +71,19 @@ class ArgosScan : ParsedHttpSource() {
// ============================ Search ====================================== // ============================ Search ======================================
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
val url = baseUrl.toHttpUrl().newBuilder() return fetchPopularManga(page).map { mangasPage ->
.addQueryParameter("s", query) MangasPage(mangasPage.mangas.filter { it.title.contains(query, ignoreCase = true) }, hasNextPage = false)
.build() }
return GET(url, headers)
} }
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = throw UnsupportedOperationException()
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) override fun searchMangaSelector() = throw UnsupportedOperationException()
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() override fun searchMangaFromElement(element: Element) = throw UnsupportedOperationException()
override fun searchMangaNextPageSelector() = throw UnsupportedOperationException()
// ============================ Details ===================================== // ============================ Details =====================================
@ -102,7 +99,12 @@ class ArgosScan : ParsedHttpSource() {
thumbnail_url = selectFirst(".trailer-box img")?.absUrl("src") thumbnail_url = selectFirst(".trailer-box img")?.absUrl("src")
description = selectFirst(".content p")?.text() description = selectFirst(".content p")?.text()
selectFirst("section[data-status]")?.attr("data-status")?.let { selectFirst("section[data-status]")?.attr("data-status")?.let {
status = it.toStatus() status = when (it.lowercase()) {
"ongoing" -> SManga.ONGOING
"completed" -> SManga.COMPLETED
"hiatus" -> SManga.ON_HIATUS
else -> SManga.UNKNOWN
}
} }
genre = select("h6:contains(Tags) + h6 > span").joinToString { it.text() } genre = select("h6:contains(Tags) + h6 > span").joinToString { it.text() }
} }

View File

@ -1,44 +0,0 @@
package eu.kanade.tachiyomi.extension.pt.argosscan
import eu.kanade.tachiyomi.source.model.SManga
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
class MangaDto(
@SerialName("attributes")
val details: DetailsDto,
@SerialName("cover_image_url")
val thumbnailUrl: String,
val id: String,
) {
val type get() = details.type
fun toSManga(baseUrl: String) = SManga.create().apply {
title = details.title.values.first()
description = details.description.values.firstOrNull()
genre = details.genres.get("genre")?.let(List<String>::joinToString)
thumbnail_url = "$baseUrl/$thumbnailUrl"
status = details.status.toStatus()
url = this@MangaDto.id
initialized = true
}
}
fun String.toStatus(): Int =
when (lowercase()) {
"em-lancamento" -> SManga.ONGOING
"completa" -> SManga.COMPLETED
"em-pausa" -> SManga.ON_HIATUS
else -> SManga.UNKNOWN
}
@Serializable
class DetailsDto(
val title: Map<String, String>,
val description: Map<String, String> = emptyMap(),
val status: String,
@SerialName("tags")
val genres: Map<String, List<String>> = emptyMap(),
val type: String,
)