diff --git a/src/it/animeworld/build.gradle b/src/it/animeworld/build.gradle index 6d4c910e..42715c1f 100644 --- a/src/it/animeworld/build.gradle +++ b/src/it/animeworld/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'ANIMEWORLD.tv' extClass = '.ANIMEWORLD' - extVersionCode = 41 + extVersionCode = 42 } apply from: "$rootDir/common.gradle" diff --git a/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/ANIMEWORLD.kt b/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/ANIMEWORLD.kt index f1f6fd92..3a91492c 100644 --- a/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/ANIMEWORLD.kt +++ b/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/ANIMEWORLD.kt @@ -19,6 +19,7 @@ import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.util.asJsoup import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json +import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Request import okhttp3.Response @@ -28,6 +29,7 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import java.lang.Exception +import java.util.regex.Pattern class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() { @@ -39,6 +41,9 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val lang = "it" + private var token: String = "" + private var lastTokenRefresh: Long = -1 + override val supportsLatest = true private val json: Json by injectLazy() @@ -47,10 +52,42 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() { Injekt.get().getSharedPreferences("source_$id", 0x0000) } + fun extractCookie(html: String): String? { + val regex = """document\.cookie="([^"]+);""" + val pattern = Pattern.compile(regex) + val matcher = pattern.matcher(html) + + return if (matcher.find()) { + matcher.group(1) // Extract the cookie value + } else { + null + } + } + + fun localGet( + url: String, + headers: Headers? = null, + ): Request { + if (lastTokenRefresh == -1L || System.currentTimeMillis() - lastTokenRefresh > 1000 * 60 * 60 * 24) { + val response = client.newCall(GET(baseUrl)).execute() + val body = response.body!!.string() + val cookie = extractCookie(body) + if (cookie != null) { + token = cookie + lastTokenRefresh = System.currentTimeMillis() + } + } + if (headers == null) { + return GET(url, headers = Headers.headersOf("Cookie", token)) + } + + return GET(url, headers = headers.newBuilder().add("Cookie", token).build()) + } + // Popular Anime - Same Format as Search override fun popularAnimeSelector(): String = searchAnimeSelector() - override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/filter?sort=6&page=$page") + override fun popularAnimeRequest(page: Int): Request = localGet("$baseUrl/filter?sort=6&page=$page") override fun popularAnimeFromElement(element: Element): SAnime = searchAnimeFromElement(element) override fun popularAnimeNextPageSelector(): String = searchAnimeNextPageSelector() @@ -82,7 +119,7 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun videoListRequest(episode: SEpisode): Request { val iframe = baseUrl + episode.url - return GET(iframe) + return localGet(iframe) } override fun videoListParse(response: Response): List