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 {
extName = 'Argos Scan'
extClass = '.ArgosScan'
extVersionCode = 26
extVersionCode = 27
isNsfw = false
}
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.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import keiyoushi.utils.parseAs
import keiyoushi.utils.tryParse
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import rx.Observable
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.Locale
@ -42,8 +41,12 @@ class ArgosScan : ParsedHttpSource() {
// ============================ Popular ======================================
override fun popularMangaRequest(page: Int) = GET(baseUrl, headers)
override fun popularMangaSelector() = throw UnsupportedOperationException()
override fun popularMangaFromElement(element: Element) = throw UnsupportedOperationException()
override fun popularMangaSelector() = "#projects-container .manga-block"
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 popularMangaParse(response: Response): MangasPage {
@ -51,16 +54,9 @@ class ArgosScan : ParsedHttpSource() {
if (document.select("a[href*='auth/discord']").isNotEmpty()) {
throw IOException("Faça login na WebView")
}
val script = document.selectFirst("script:containsData(projects)")!!.data()
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)
return document.select(popularMangaSelector()).map(::popularMangaFromElement).let {
MangasPage(it, hasNextPage = false)
}
}
// ============================ Latest ======================================
@ -75,18 +71,19 @@ class ArgosScan : ParsedHttpSource() {
// ============================ Search ======================================
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = baseUrl.toHttpUrl().newBuilder()
.addQueryParameter("s", query)
.build()
return GET(url, headers)
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
return fetchPopularManga(page).map { mangasPage ->
MangasPage(mangasPage.mangas.filter { it.title.contains(query, ignoreCase = true) }, hasNextPage = false)
}
}
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 =====================================
@ -102,7 +99,12 @@ class ArgosScan : ParsedHttpSource() {
thumbnail_url = selectFirst(".trailer-box img")?.absUrl("src")
description = selectFirst(".content p")?.text()
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() }
}

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,
)