From abe89d454c913efcf7d8cc8d645fc62b44df201b Mon Sep 17 00:00:00 2001 From: Chopper <156493704+choppeh@users.noreply.github.com> Date: Thu, 29 May 2025 22:12:42 -0300 Subject: [PATCH] Fix GreenShit (#9005) * Fix greenshit * Add applyIf * Fix mediocre * Remove applyIf --- lib-multisrc/greenshit/build.gradle.kts | 2 +- .../tachiyomi/multisrc/greenshit/GreenShit.kt | 110 +++++++++++++++++- .../extension/pt/aurorascan/AuroraScan.kt | 2 + .../extension/pt/maidscan/MaidScan.kt | 2 + .../MediocreToons.kt | 4 + .../extension/pt/sussyscan/SussyToons.kt | 47 +------- 6 files changed, 115 insertions(+), 52 deletions(-) rename src/pt/mediocretoons/src/eu/kanade/tachiyomi/extension/pt/{sussyscan => mediocretoons}/MediocreToons.kt (77%) diff --git a/lib-multisrc/greenshit/build.gradle.kts b/lib-multisrc/greenshit/build.gradle.kts index 9dce2478c..e2f11e9c1 100644 --- a/lib-multisrc/greenshit/build.gradle.kts +++ b/lib-multisrc/greenshit/build.gradle.kts @@ -2,4 +2,4 @@ plugins { id("lib-multisrc") } -baseVersionCode = 2 +baseVersionCode = 3 diff --git a/lib-multisrc/greenshit/src/eu/kanade/tachiyomi/multisrc/greenshit/GreenShit.kt b/lib-multisrc/greenshit/src/eu/kanade/tachiyomi/multisrc/greenshit/GreenShit.kt index fae5ae5fa..d9a746032 100644 --- a/lib-multisrc/greenshit/src/eu/kanade/tachiyomi/multisrc/greenshit/GreenShit.kt +++ b/lib-multisrc/greenshit/src/eu/kanade/tachiyomi/multisrc/greenshit/GreenShit.kt @@ -84,14 +84,33 @@ abstract class GreenShit( } } + open val targetAudience: TargetAudience = TargetAudience.All + + open val contentOrigin: ContentOrigin = ContentOrigin.Web + override fun headersBuilder() = super.headersBuilder() .set("scan-id", scanId.toString()) // ============================= Popular ================================== - override fun popularMangaRequest(page: Int) = GET(baseUrl, headers) + override fun popularMangaRequest(page: Int) = + when (contentOrigin) { + ContentOrigin.Mobile -> GET("$apiUrl/obras/top5", headers) + else -> GET(baseUrl, headers) + } - override fun popularMangaParse(response: Response): MangasPage { + override fun popularMangaParse(response: Response): MangasPage = + when (contentOrigin) { + ContentOrigin.Mobile -> popularMangaParseMobile(response) + else -> popularMangaParseWeb(response) + } + + private fun popularMangaParseMobile(response: Response): MangasPage { + val mangas = response.parseAs>>().toSMangaList() + return MangasPage(mangas, hasNextPage = false) + } + + private fun popularMangaParseWeb(response: Response): MangasPage { val json = response.parseScriptToJson().let(POPULAR_JSON_REGEX::find) ?.groups?.get(1)?.value ?: return MangasPage(emptyList(), false) @@ -105,11 +124,16 @@ abstract class GreenShit( val url = "$apiUrl/obras/novos-capitulos".toHttpUrl().newBuilder() .addQueryParameter("pagina", page.toString()) .addQueryParameter("limite", "24") - .addQueryParameter("gen_id", "4") + .addQueryParameterIf(targetAudience != TargetAudience.All, "gen_id", targetAudience.toString()) .build() return GET(url, headers) } + private fun HttpUrl.Builder.addQueryParameterIf(predicate: Boolean, name: String, value: String): HttpUrl.Builder { + if (predicate) addQueryParameter(name, value) + return this + } + override fun latestUpdatesParse(response: Response): MangasPage { val dto = response.parseAs>>() val mangas = dto.toSMangaList() @@ -134,8 +158,29 @@ abstract class GreenShit( } // ============================= Details ================================== + override fun getMangaUrl(manga: SManga) = when (contentOrigin) { + ContentOrigin.Mobile -> "$baseUrl${manga.url}" + else -> super.getMangaUrl(manga) + } - override fun mangaDetailsParse(response: Response): SManga { + override fun mangaDetailsRequest(manga: SManga): Request = + when (contentOrigin) { + ContentOrigin.Mobile -> mangaDetailsRequestMobile(manga) + else -> super.mangaDetailsRequest(manga) + } + + private fun mangaDetailsRequestMobile(manga: SManga): Request { + val pathSegment = manga.url.substringBeforeLast("/").replace("obra", "obras") + return GET("$apiUrl$pathSegment", headers) + } + + override fun mangaDetailsParse(response: Response) = + when (contentOrigin) { + ContentOrigin.Mobile -> response.parseAs>().results.toSManga() + else -> mangaDetailsParseWeb(response) + } + + private fun mangaDetailsParseWeb(response: Response): SManga { val json = response.parseScriptToJson().let(DETAILS_CHAPTER_REGEX::find) ?.groups?.get(0)?.value ?: throw IOException("Details do mangá não foi encontrado") @@ -143,8 +188,27 @@ abstract class GreenShit( } // ============================= Chapters ================================= + override fun getChapterUrl(chapter: SChapter) = when (contentOrigin) { + ContentOrigin.Mobile -> "$baseUrl${chapter.url}" + else -> super.getChapterUrl(chapter) + } - override fun chapterListParse(response: Response): List { + override fun chapterListRequest(manga: SManga) = + when (contentOrigin) { + ContentOrigin.Mobile -> mangaDetailsRequest(manga) + else -> super.chapterListRequest(manga) + } + + override fun chapterListParse(response: Response): List = + when (contentOrigin) { + ContentOrigin.Mobile -> chapterListParseMobile(response) + else -> chapterListParseWeb(response) + } + + private fun chapterListParseMobile(response: Response): List = + response.parseAs>().toSChapterList() + + private fun chapterListParseWeb(response: Response): List { val json = response.parseScriptToJson().let(DETAILS_CHAPTER_REGEX::find) ?.groups?.get(0)?.value ?: return emptyList() @@ -155,7 +219,27 @@ abstract class GreenShit( private val pageUrlSelector = "img.chakra-image" - override fun pageListParse(response: Response): List { + override fun pageListRequest(chapter: SChapter): Request = + when (contentOrigin) { + ContentOrigin.Mobile -> pageListRequestMobile(chapter) + else -> super.pageListRequest(chapter) + } + + private fun pageListRequestMobile(chapter: SChapter): Request { + val pathSegment = chapter.url.replace("capitulo", "capitulo-app") + return GET("$apiUrl$pathSegment", headers) + } + + override fun pageListParse(response: Response): List = + when (contentOrigin) { + ContentOrigin.Mobile -> pageListParseMobile(response) + else -> pageListParseWeb(response) + } + + private fun pageListParseMobile(response: Response): List = + response.parseAs>().toPageList() + + private fun pageListParseWeb(response: Response): List { val document = response.asJsoup() pageListParse(document).takeIf(List::isNotEmpty)?.let { return it } @@ -299,6 +383,20 @@ abstract class GreenShit( return this } + enum class TargetAudience(val value: Int) { + All(1), + Shoujo(4), + Yaoi(7), + ; + + override fun toString() = value.toString() + } + + enum class ContentOrigin { + Mobile, + Web, + } + companion object { const val CDN_URL = "https://cdn.sussytoons.site" diff --git a/src/pt/aurorascan/src/eu/kanade/tachiyomi/extension/pt/aurorascan/AuroraScan.kt b/src/pt/aurorascan/src/eu/kanade/tachiyomi/extension/pt/aurorascan/AuroraScan.kt index 9b777b1a8..058764b0a 100644 --- a/src/pt/aurorascan/src/eu/kanade/tachiyomi/extension/pt/aurorascan/AuroraScan.kt +++ b/src/pt/aurorascan/src/eu/kanade/tachiyomi/extension/pt/aurorascan/AuroraScan.kt @@ -9,6 +9,8 @@ class AuroraScan : GreenShit( "pt-BR", scanId = 4, ) { + override val targetAudience = TargetAudience.Shoujo + override val client = super.client.newBuilder() .rateLimit(2) .build() diff --git a/src/pt/maidscan/src/eu/kanade/tachiyomi/extension/pt/maidscan/MaidScan.kt b/src/pt/maidscan/src/eu/kanade/tachiyomi/extension/pt/maidscan/MaidScan.kt index 3d23cad7f..4f12b9c30 100644 --- a/src/pt/maidscan/src/eu/kanade/tachiyomi/extension/pt/maidscan/MaidScan.kt +++ b/src/pt/maidscan/src/eu/kanade/tachiyomi/extension/pt/maidscan/MaidScan.kt @@ -10,6 +10,8 @@ class MaidScan : GreenShit( "pt-BR", scanId = 3, ) { + override val targetAudience = TargetAudience.Shoujo + override val client: OkHttpClient = super.client.newBuilder() .rateLimit(2) .build() diff --git a/src/pt/mediocretoons/src/eu/kanade/tachiyomi/extension/pt/sussyscan/MediocreToons.kt b/src/pt/mediocretoons/src/eu/kanade/tachiyomi/extension/pt/mediocretoons/MediocreToons.kt similarity index 77% rename from src/pt/mediocretoons/src/eu/kanade/tachiyomi/extension/pt/sussyscan/MediocreToons.kt rename to src/pt/mediocretoons/src/eu/kanade/tachiyomi/extension/pt/mediocretoons/MediocreToons.kt index a0cebb03f..584047e5d 100644 --- a/src/pt/mediocretoons/src/eu/kanade/tachiyomi/extension/pt/sussyscan/MediocreToons.kt +++ b/src/pt/mediocretoons/src/eu/kanade/tachiyomi/extension/pt/mediocretoons/MediocreToons.kt @@ -9,6 +9,10 @@ class MediocreToons : GreenShit( "pt-BR", scanId = 2, ) { + override val targetAudience = TargetAudience.Shoujo + + override val contentOrigin = ContentOrigin.Mobile + override val client = super.client.newBuilder() .rateLimit(2) .build() diff --git a/src/pt/sussyscan/src/eu/kanade/tachiyomi/extension/pt/sussyscan/SussyToons.kt b/src/pt/sussyscan/src/eu/kanade/tachiyomi/extension/pt/sussyscan/SussyToons.kt index 3a9d81aaf..51cdab20f 100644 --- a/src/pt/sussyscan/src/eu/kanade/tachiyomi/extension/pt/sussyscan/SussyToons.kt +++ b/src/pt/sussyscan/src/eu/kanade/tachiyomi/extension/pt/sussyscan/SussyToons.kt @@ -1,20 +1,8 @@ package eu.kanade.tachiyomi.extension.pt.sussyscan -import eu.kanade.tachiyomi.multisrc.greenshit.ChapterPageDto import eu.kanade.tachiyomi.multisrc.greenshit.GreenShit -import eu.kanade.tachiyomi.multisrc.greenshit.MangaDto -import eu.kanade.tachiyomi.multisrc.greenshit.ResultDto -import eu.kanade.tachiyomi.multisrc.greenshit.WrapperChapterDto -import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.interceptor.rateLimit -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import keiyoushi.utils.parseAs import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response class SussyToons : GreenShit( "Sussy Toons", @@ -25,40 +13,9 @@ class SussyToons : GreenShit( override val versionId = 2 + override val contentOrigin: ContentOrigin = ContentOrigin.Mobile + override val client: OkHttpClient = super.client.newBuilder() .rateLimit(2) .build() - - override fun popularMangaRequest(page: Int): Request = - GET("$apiUrl/obras/top5", headers) - - override fun popularMangaParse(response: Response): MangasPage { - val mangas = response.parseAs>>().toSMangaList() - return MangasPage(mangas, hasNextPage = false) - } - - override fun getMangaUrl(manga: SManga) = "$baseUrl${manga.url}" - - override fun mangaDetailsRequest(manga: SManga): Request { - val pathSegment = manga.url.substringBeforeLast("/").replace("obra", "obras") - return GET("$apiUrl$pathSegment", headers) - } - - override fun mangaDetailsParse(response: Response) = - response.parseAs>().results.toSManga() - - override fun getChapterUrl(chapter: SChapter) = "$baseUrl${chapter.url}" - - override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) - - override fun chapterListParse(response: Response): List = - response.parseAs>().toSChapterList() - - override fun pageListRequest(chapter: SChapter): Request { - val pathSegment = chapter.url.replace("capitulo", "capitulo-app") - return GET("$apiUrl$pathSegment", headers) - } - - override fun pageListParse(response: Response): List = - response.parseAs>().toPageList() }