diff --git a/src/en/elarcpage/build.gradle b/src/en/elarcpage/build.gradle index bd5039241..464657d0f 100644 --- a/src/en/elarcpage/build.gradle +++ b/src/en/elarcpage/build.gradle @@ -3,7 +3,7 @@ ext { extClass = '.ElarcPage' themePkg = 'mangathemesia' baseUrl = 'https://elarctoon.com' - overrideVersionCode = 3 + overrideVersionCode = 4 isNsfw = false } diff --git a/src/en/elarcpage/src/eu/kanade/tachiyomi/extension/en/elarcpage/ElarcPage.kt b/src/en/elarcpage/src/eu/kanade/tachiyomi/extension/en/elarcpage/ElarcPage.kt index 6132231de..59fb1f7a8 100644 --- a/src/en/elarcpage/src/eu/kanade/tachiyomi/extension/en/elarcpage/ElarcPage.kt +++ b/src/en/elarcpage/src/eu/kanade/tachiyomi/extension/en/elarcpage/ElarcPage.kt @@ -1,12 +1,81 @@ package eu.kanade.tachiyomi.extension.en.elarcpage import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia +import eu.kanade.tachiyomi.network.GET +import okhttp3.Interceptor +import okhttp3.Response +import org.jsoup.Jsoup +import java.io.IOException class ElarcPage : MangaThemesia( "Elarc Toon", "https://elarctoon.com", "en", - "/readtoons98111", ) { override val id = 5482125641807211052 + + override val client = network.cloudflareClient.newBuilder() + .addInterceptor(::dynamicUrlInterceptor) + .build() + + private var dynamicUrlUpdated: Long = 0 + private val dynamicUrlValidity: Long = 10 * 60 // 10 minutes + + private fun dynamicUrlInterceptor(chain: Interceptor.Chain): Response { + val request = chain.request() + val timeNow = System.currentTimeMillis() / 1000 + + // Check if request requires an up-to-date URL + if (request.url.pathSegments[0] == mangaUrlDirectory.substring(1)) { + // Force update URL if required + if (timeNow - dynamicUrlUpdated > dynamicUrlValidity) { + client.newCall(GET(baseUrl)).execute() + if (timeNow - dynamicUrlUpdated > dynamicUrlValidity) { + throw IOException("Failed to update dynamic url") + } + } + + if (request.url.pathSegments[0] != mangaUrlDirectory.substring(1)) { + // Need to rewrite URL + + val newUrl = request.url.newBuilder() + .setPathSegment(0, mangaUrlDirectory.substring(1)) + .build() + + val newRequest = request.newBuilder() + .url(newUrl) + .build() + + return chain.proceed(newRequest) + } + } + + // Always update URL + val response = chain.proceed(request) + val document = Jsoup.parse( + response.peekBody(Long.MAX_VALUE).string(), + request.url.toString(), + ) + + document.select("#menu-item-14 > a, a:contains(All Series), #main-menu a, .mm a") + .reversed() + .map { it.attr("href") } + .lastOrNull { it.length >= 2 && it[0] == '/' } + ?.let { + setMangaUrlDirectory(it) + dynamicUrlUpdated = timeNow + } + + return response + } + + private fun setMangaUrlDirectory(mangaUrlDirectory: String) { + try { + // this is fine + val field = this.javaClass.superclass.getDeclaredField("mangaUrlDirectory") + field.isAccessible = true + field.set(this, mangaUrlDirectory) + } catch (_: Exception) { + } + } }