diff --git a/lib-multisrc/zerotheme/build.gradle.kts b/lib-multisrc/zerotheme/build.gradle.kts index dc076cc37..9dce2478c 100644 --- a/lib-multisrc/zerotheme/build.gradle.kts +++ b/lib-multisrc/zerotheme/build.gradle.kts @@ -2,4 +2,4 @@ plugins { id("lib-multisrc") } -baseVersionCode = 1 +baseVersionCode = 2 diff --git a/lib-multisrc/zerotheme/src/eu/kanade/tachiyomi/multisrc/zerotheme/ZeroTheme.kt b/lib-multisrc/zerotheme/src/eu/kanade/tachiyomi/multisrc/zerotheme/ZeroTheme.kt index 12c160572..ea0841b58 100644 --- a/lib-multisrc/zerotheme/src/eu/kanade/tachiyomi/multisrc/zerotheme/ZeroTheme.kt +++ b/lib-multisrc/zerotheme/src/eu/kanade/tachiyomi/multisrc/zerotheme/ZeroTheme.kt @@ -1,16 +1,19 @@ package eu.kanade.tachiyomi.multisrc.zerotheme import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.source.model.FilterList 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 eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.asJsoup import keiyoushi.utils.parseAs import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Request import okhttp3.Response +import org.jsoup.nodes.Element +import java.io.IOException abstract class ZeroTheme( override val name: String, @@ -20,14 +23,25 @@ abstract class ZeroTheme( override val supportsLatest: Boolean = true - override val client = network.cloudflareClient.newBuilder() - .rateLimit(2) - .build() + override val client = network.cloudflareClient open val cdnUrl: String = "https://cdn.${baseUrl.substringAfterLast("/")}" open val imageLocation: String = "images" + open val mangaSubString: String by lazy { + val response = client.newCall(GET(baseUrl, headers)).execute() + val script = response.asJsoup().select("script") + .map(Element::data) + .firstOrNull(MANGA_SUBSTRING_REGEX::containsMatchIn) + ?: throw IOException("manga substring não foi localizado") + + MANGA_SUBSTRING_REGEX.find(script)?.groups?.get(1)?.value + ?: throw IOException("Não foi extrair a substring do manga") + } + + open val chapterSubString: String = "chapter" + private val sourceLocation: String get() = "$cdnUrl/$imageLocation" // =========================== Popular ================================ @@ -61,14 +75,30 @@ abstract class ZeroTheme( // =========================== Details ================================= + override fun getMangaUrl(manga: SManga) = "$baseUrl/$mangaSubString/${manga.url.substringAfterLast("/")}" + + override fun mangaDetailsRequest(manga: SManga): Request { + checkEntry(manga.url) + return GET(getMangaUrl(manga), headers) + } + override fun mangaDetailsParse(response: Response) = response.toDto().toSManga(sourceLocation) // =========================== Chapter ================================= + override fun getChapterUrl(chapter: SChapter) = "$baseUrl/$chapterSubString/${chapter.url.substringAfterLast("/")}" + + override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) + override fun chapterListParse(response: Response) = response.toDto().toSChapterList() // =========================== Pages =================================== + override fun pageListRequest(chapter: SChapter): Request { + checkEntry(chapter.url) + return GET(getChapterUrl(chapter), headers) + } + override fun pageListParse(response: Response): List = response.toDto().toPageList(sourceLocation) @@ -76,8 +106,18 @@ abstract class ZeroTheme( // =========================== Utilities =============================== + private fun checkEntry(url: String) { + if (listOf(mangaSubString, chapterSubString).any(url::contains)) { + throw IOException("Migre a obra para extensão $name") + } + } + inline fun Response.toDto(): T { val jsonString = asJsoup().selectFirst("[data-page]")!!.attr("data-page") return jsonString.parseAs() } + + companion object { + val MANGA_SUBSTRING_REGEX = """"(\w+)\\/\{slug\}""".toRegex() + } } diff --git a/lib-multisrc/zerotheme/src/eu/kanade/tachiyomi/multisrc/zerotheme/ZeroThemeDto.kt b/lib-multisrc/zerotheme/src/eu/kanade/tachiyomi/multisrc/zerotheme/ZeroThemeDto.kt index f3eaa893a..378954a1c 100644 --- a/lib-multisrc/zerotheme/src/eu/kanade/tachiyomi/multisrc/zerotheme/ZeroThemeDto.kt +++ b/lib-multisrc/zerotheme/src/eu/kanade/tachiyomi/multisrc/zerotheme/ZeroThemeDto.kt @@ -108,7 +108,7 @@ class MangaDto( else -> SManga.UNKNOWN } genre = genres?.joinToString { it.name } - url = "/comic/$slug" + url = slug } @Serializable @@ -130,7 +130,7 @@ class ChapterDto( name = number.toString() chapter_number = number date_upload = dateFormat.tryParse(createdAt) - url = "/chapter/$path" + url = path } companion object { diff --git a/src/pt/lertoons/src/eu/kanade/tachiyomi/extension/pt/lertoons/LerToons.kt b/src/pt/lertoons/src/eu/kanade/tachiyomi/extension/pt/lertoons/LerToons.kt index da6c72424..3e69e31c8 100644 --- a/src/pt/lertoons/src/eu/kanade/tachiyomi/extension/pt/lertoons/LerToons.kt +++ b/src/pt/lertoons/src/eu/kanade/tachiyomi/extension/pt/lertoons/LerToons.kt @@ -13,4 +13,6 @@ class LerToons : ZeroTheme( override val client = network.cloudflareClient.newBuilder() .rateLimit(2) .build() + + override val mangaSubString: String = "manga" }