Fix GreenShit (#9005)

* Fix greenshit

* Add applyIf

* Fix mediocre

* Remove applyIf
This commit is contained in:
Chopper 2025-05-29 22:12:42 -03:00 committed by Draff
parent ab711b37ed
commit abe89d454c
Signed by: Draff
GPG Key ID: E8A89F3211677653
6 changed files with 115 additions and 52 deletions

View File

@ -2,4 +2,4 @@ plugins {
id("lib-multisrc") id("lib-multisrc")
} }
baseVersionCode = 2 baseVersionCode = 3

View File

@ -84,14 +84,33 @@ abstract class GreenShit(
} }
} }
open val targetAudience: TargetAudience = TargetAudience.All
open val contentOrigin: ContentOrigin = ContentOrigin.Web
override fun headersBuilder() = super.headersBuilder() override fun headersBuilder() = super.headersBuilder()
.set("scan-id", scanId.toString()) .set("scan-id", scanId.toString())
// ============================= Popular ================================== // ============================= 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<ResultDto<List<MangaDto>>>().toSMangaList()
return MangasPage(mangas, hasNextPage = false)
}
private fun popularMangaParseWeb(response: Response): MangasPage {
val json = response.parseScriptToJson().let(POPULAR_JSON_REGEX::find) val json = response.parseScriptToJson().let(POPULAR_JSON_REGEX::find)
?.groups?.get(1)?.value ?.groups?.get(1)?.value
?: return MangasPage(emptyList(), false) ?: return MangasPage(emptyList(), false)
@ -105,11 +124,16 @@ abstract class GreenShit(
val url = "$apiUrl/obras/novos-capitulos".toHttpUrl().newBuilder() val url = "$apiUrl/obras/novos-capitulos".toHttpUrl().newBuilder()
.addQueryParameter("pagina", page.toString()) .addQueryParameter("pagina", page.toString())
.addQueryParameter("limite", "24") .addQueryParameter("limite", "24")
.addQueryParameter("gen_id", "4") .addQueryParameterIf(targetAudience != TargetAudience.All, "gen_id", targetAudience.toString())
.build() .build()
return GET(url, headers) 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 { override fun latestUpdatesParse(response: Response): MangasPage {
val dto = response.parseAs<ResultDto<List<MangaDto>>>() val dto = response.parseAs<ResultDto<List<MangaDto>>>()
val mangas = dto.toSMangaList() val mangas = dto.toSMangaList()
@ -134,8 +158,29 @@ abstract class GreenShit(
} }
// ============================= Details ================================== // ============================= 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<ResultDto<MangaDto>>().results.toSManga()
else -> mangaDetailsParseWeb(response)
}
private fun mangaDetailsParseWeb(response: Response): SManga {
val json = response.parseScriptToJson().let(DETAILS_CHAPTER_REGEX::find) val json = response.parseScriptToJson().let(DETAILS_CHAPTER_REGEX::find)
?.groups?.get(0)?.value ?.groups?.get(0)?.value
?: throw IOException("Details do mangá não foi encontrado") ?: throw IOException("Details do mangá não foi encontrado")
@ -143,8 +188,27 @@ abstract class GreenShit(
} }
// ============================= Chapters ================================= // ============================= Chapters =================================
override fun getChapterUrl(chapter: SChapter) = when (contentOrigin) {
ContentOrigin.Mobile -> "$baseUrl${chapter.url}"
else -> super.getChapterUrl(chapter)
}
override fun chapterListParse(response: Response): List<SChapter> { override fun chapterListRequest(manga: SManga) =
when (contentOrigin) {
ContentOrigin.Mobile -> mangaDetailsRequest(manga)
else -> super.chapterListRequest(manga)
}
override fun chapterListParse(response: Response): List<SChapter> =
when (contentOrigin) {
ContentOrigin.Mobile -> chapterListParseMobile(response)
else -> chapterListParseWeb(response)
}
private fun chapterListParseMobile(response: Response): List<SChapter> =
response.parseAs<ResultDto<WrapperChapterDto>>().toSChapterList()
private fun chapterListParseWeb(response: Response): List<SChapter> {
val json = response.parseScriptToJson().let(DETAILS_CHAPTER_REGEX::find) val json = response.parseScriptToJson().let(DETAILS_CHAPTER_REGEX::find)
?.groups?.get(0)?.value ?.groups?.get(0)?.value
?: return emptyList() ?: return emptyList()
@ -155,7 +219,27 @@ abstract class GreenShit(
private val pageUrlSelector = "img.chakra-image" private val pageUrlSelector = "img.chakra-image"
override fun pageListParse(response: Response): List<Page> { 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<Page> =
when (contentOrigin) {
ContentOrigin.Mobile -> pageListParseMobile(response)
else -> pageListParseWeb(response)
}
private fun pageListParseMobile(response: Response): List<Page> =
response.parseAs<ResultDto<ChapterPageDto>>().toPageList()
private fun pageListParseWeb(response: Response): List<Page> {
val document = response.asJsoup() val document = response.asJsoup()
pageListParse(document).takeIf(List<Page>::isNotEmpty)?.let { return it } pageListParse(document).takeIf(List<Page>::isNotEmpty)?.let { return it }
@ -299,6 +383,20 @@ abstract class GreenShit(
return this 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 { companion object {
const val CDN_URL = "https://cdn.sussytoons.site" const val CDN_URL = "https://cdn.sussytoons.site"

View File

@ -9,6 +9,8 @@ class AuroraScan : GreenShit(
"pt-BR", "pt-BR",
scanId = 4, scanId = 4,
) { ) {
override val targetAudience = TargetAudience.Shoujo
override val client = super.client.newBuilder() override val client = super.client.newBuilder()
.rateLimit(2) .rateLimit(2)
.build() .build()

View File

@ -10,6 +10,8 @@ class MaidScan : GreenShit(
"pt-BR", "pt-BR",
scanId = 3, scanId = 3,
) { ) {
override val targetAudience = TargetAudience.Shoujo
override val client: OkHttpClient = super.client.newBuilder() override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(2) .rateLimit(2)
.build() .build()

View File

@ -9,6 +9,10 @@ class MediocreToons : GreenShit(
"pt-BR", "pt-BR",
scanId = 2, scanId = 2,
) { ) {
override val targetAudience = TargetAudience.Shoujo
override val contentOrigin = ContentOrigin.Mobile
override val client = super.client.newBuilder() override val client = super.client.newBuilder()
.rateLimit(2) .rateLimit(2)
.build() .build()

View File

@ -1,20 +1,8 @@
package eu.kanade.tachiyomi.extension.pt.sussyscan 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.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.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.OkHttpClient
import okhttp3.Request
import okhttp3.Response
class SussyToons : GreenShit( class SussyToons : GreenShit(
"Sussy Toons", "Sussy Toons",
@ -25,40 +13,9 @@ class SussyToons : GreenShit(
override val versionId = 2 override val versionId = 2
override val contentOrigin: ContentOrigin = ContentOrigin.Mobile
override val client: OkHttpClient = super.client.newBuilder() override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(2) .rateLimit(2)
.build() .build()
override fun popularMangaRequest(page: Int): Request =
GET("$apiUrl/obras/top5", headers)
override fun popularMangaParse(response: Response): MangasPage {
val mangas = response.parseAs<ResultDto<List<MangaDto>>>().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<ResultDto<MangaDto>>().results.toSManga()
override fun getChapterUrl(chapter: SChapter) = "$baseUrl${chapter.url}"
override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga)
override fun chapterListParse(response: Response): List<SChapter> =
response.parseAs<ResultDto<WrapperChapterDto>>().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<Page> =
response.parseAs<ResultDto<ChapterPageDto>>().toPageList()
} }