diff --git a/src/pt/argosscan/build.gradle b/src/pt/argosscan/build.gradle index b3ae17943..66d838a01 100644 --- a/src/pt/argosscan/build.gradle +++ b/src/pt/argosscan/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Argos Scan' extClass = '.ArgosScan' - extVersionCode = 25 + extVersionCode = 26 } apply from: "$rootDir/common.gradle" diff --git a/src/pt/argosscan/src/eu/kanade/tachiyomi/extension/pt/argosscan/ArgosScan.kt b/src/pt/argosscan/src/eu/kanade/tachiyomi/extension/pt/argosscan/ArgosScan.kt index 69bff8441..ae492469c 100644 --- a/src/pt/argosscan/src/eu/kanade/tachiyomi/extension/pt/argosscan/ArgosScan.kt +++ b/src/pt/argosscan/src/eu/kanade/tachiyomi/extension/pt/argosscan/ArgosScan.kt @@ -19,6 +19,7 @@ import org.jsoup.nodes.Element import java.io.IOException import java.text.SimpleDateFormat import java.util.Locale +import java.util.concurrent.TimeUnit class ArgosScan : ParsedHttpSource() { @@ -31,14 +32,8 @@ class ArgosScan : ParsedHttpSource() { override val supportsLatest = false override val client: OkHttpClient = network.cloudflareClient.newBuilder() - .addInterceptor { chain -> - val response = chain.proceed(chain.request()) - if (response.request.url.pathSegments.any { it.equals("login", true) }) { - throw IOException("Faça login na WebView") - } - - response - } + .connectTimeout(1, TimeUnit.MINUTES) + .readTimeout(1, TimeUnit.MINUTES) .build() // Website changed custom CMS. @@ -52,7 +47,12 @@ class ArgosScan : ParsedHttpSource() { override fun popularMangaNextPageSelector() = null override fun popularMangaParse(response: Response): MangasPage { - val script = response.asJsoup().selectFirst("script:containsData(projects)")!!.data() + val document = response.asJsoup() + 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>() @@ -90,6 +90,12 @@ class ArgosScan : ParsedHttpSource() { // ============================ Details ===================================== + override fun getMangaUrl(manga: SManga) = "$baseUrl/projeto/${manga.getProjectId()}" + + override fun mangaDetailsRequest(manga: SManga): Request = GET(getMangaUrl(manga), headers) + + private fun SManga.getProjectId() = url.replace("/", "").substringAfter(ENTRY_URL_REGEX) + override fun mangaDetailsParse(document: Document) = SManga.create().apply { with(document) { title = selectFirst(".content h2")!!.text() @@ -100,17 +106,25 @@ class ArgosScan : ParsedHttpSource() { } genre = select("h6:contains(Tags) + h6 > span").joinToString { it.text() } } - setUrlWithoutDomain(document.location()) } // ============================ Chapter ===================================== + override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) + + override fun chapterListParse(response: Response): List { + return super.chapterListParse(response).sortedByDescending(SChapter::chapter_number) + } + override fun chapterListSelector() = ".manga-chapter" override fun chapterFromElement(element: Element) = SChapter.create().apply { - name = element.selectFirst("h5")!!.text() + name = element.selectFirst("h5")!!.ownText() element.selectFirst("h6")?.let { date_upload = dateFormat.tryParse(it.text()) + SIMPLE_NUMBER_REGEX.find(name)?.groups?.get(0)?.value?.toFloat()?.let { + chapter_number = it + } } setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href")) } @@ -127,8 +141,13 @@ class ArgosScan : ParsedHttpSource() { // ============================== Utilities ================================== + private fun String.substringAfter(regex: Regex): String = + regex.find(this)?.value?.let(::substringAfter) ?: this + companion object { - val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.ROOT) - val POPULAR_REGEX = """projects\s?=\s+([^;]+)""".toRegex() + private val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.ROOT) + private val POPULAR_REGEX = """projects(?:\s+)?=(?:\s+)?(.+\]);""".toRegex() + private val SIMPLE_NUMBER_REGEX = """\d+(\.?\d+)?""".toRegex() + private val ENTRY_URL_REGEX = """projetos?""".toRegex() } } diff --git a/src/pt/argosscan/src/eu/kanade/tachiyomi/extension/pt/argosscan/ArgosScanDto.kt b/src/pt/argosscan/src/eu/kanade/tachiyomi/extension/pt/argosscan/ArgosScanDto.kt index 8af9d711f..1480ff444 100644 --- a/src/pt/argosscan/src/eu/kanade/tachiyomi/extension/pt/argosscan/ArgosScanDto.kt +++ b/src/pt/argosscan/src/eu/kanade/tachiyomi/extension/pt/argosscan/ArgosScanDto.kt @@ -11,15 +11,16 @@ class MangaDto( @SerialName("cover_image_url") val thumbnailUrl: String, val id: String, - val type: String, ) { + val type get() = details.type + fun toSManga(baseUrl: String) = SManga.create().apply { title = details.title.values.first() - description = details.description.values.first() - genre = details.genres.joinToString() + description = details.description.values.firstOrNull() + genre = details.genres.get("genre")?.let(List::joinToString) thumbnail_url = "$baseUrl/$thumbnailUrl" status = details.status.toStatus() - url = "/projetos/${this@MangaDto.id}" + url = this@MangaDto.id initialized = true } } @@ -38,5 +39,6 @@ class DetailsDto( val description: Map = emptyMap(), val status: String, @SerialName("tags") - val genres: List = emptyList(), + val genres: Map> = emptyMap(), + val type: String, )