forked from AlmightyHak/extensions-source
fix(it/animeworld): 202 redirect proper fix (#582)
* Set SecurityAW-gl cookie and update years filter * Update extVersionCode * Create ShittyRedirectionInterceptor.kt * Update extVersionCode * Fix ANIMEWORLD.tv cookies and update Years filter * Don't use headersBuilder Whoops, messed up with GitHub
This commit is contained in:
parent
bf54b7cd4e
commit
a21e1225c9
3 changed files with 54 additions and 44 deletions
|
@ -1,7 +1,7 @@
|
|||
ext {
|
||||
extName = 'ANIMEWORLD.tv'
|
||||
extClass = '.ANIMEWORLD'
|
||||
extVersionCode = 42
|
||||
extVersionCode = 43
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
||||
|
|
|
@ -19,7 +19,6 @@ 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
|
||||
|
@ -29,7 +28,6 @@ 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() {
|
||||
|
||||
|
@ -41,10 +39,12 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||
|
||||
override val lang = "it"
|
||||
|
||||
private var token: String = ""
|
||||
private var lastTokenRefresh: Long = -1
|
||||
|
||||
override val supportsLatest = true
|
||||
override val client by lazy {
|
||||
network.client.newBuilder()
|
||||
.addInterceptor(ShittyRedirectionInterceptor(network.client))
|
||||
.build()
|
||||
}
|
||||
|
||||
private val json: Json by injectLazy()
|
||||
|
||||
|
@ -52,42 +52,10 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||
Injekt.get<Application>().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 = localGet("$baseUrl/filter?sort=6&page=$page")
|
||||
override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/filter?sort=6&page=$page")
|
||||
override fun popularAnimeFromElement(element: Element): SAnime = searchAnimeFromElement(element)
|
||||
override fun popularAnimeNextPageSelector(): String = searchAnimeNextPageSelector()
|
||||
|
||||
|
@ -119,7 +87,7 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||
|
||||
override fun videoListRequest(episode: SEpisode): Request {
|
||||
val iframe = baseUrl + episode.url
|
||||
return localGet(iframe)
|
||||
return GET(iframe)
|
||||
}
|
||||
|
||||
override fun videoListParse(response: Response): List<Video> {
|
||||
|
@ -159,7 +127,7 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||
.add("X-Requested-With", "XMLHttpRequest")
|
||||
.build()
|
||||
val target = json.decodeFromString<ServerResponse>(
|
||||
client.newCall(localGet(apiUrl, headers = apiHeaders)).execute().body.string(),
|
||||
client.newCall(GET(apiUrl, headers = apiHeaders)).execute().body.string(),
|
||||
).grabber
|
||||
serverList.add(Pair(serverPair.first, target))
|
||||
}
|
||||
|
@ -224,7 +192,7 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||
override fun searchAnimeNextPageSelector(): String = "div.paging-wrapper a#go-next-page"
|
||||
|
||||
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request =
|
||||
localGet("$baseUrl/filter?${getSearchParameters(filters)}&keyword=$query&page=$page")
|
||||
GET("$baseUrl/filter?${getSearchParameters(filters)}&keyword=$query&page=$page")
|
||||
|
||||
// Details
|
||||
|
||||
|
@ -250,7 +218,7 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||
|
||||
// Latest - Same format as search
|
||||
|
||||
override fun latestUpdatesRequest(page: Int): Request = localGet("$baseUrl/updated?page=$page")
|
||||
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/updated?page=$page")
|
||||
override fun latestUpdatesSelector(): String = searchAnimeSelector()
|
||||
override fun latestUpdatesNextPageSelector(): String = searchAnimeNextPageSelector()
|
||||
override fun latestUpdatesFromElement(element: Element): SAnime = searchAnimeFromElement(element)
|
||||
|
@ -373,6 +341,9 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||
Year("2020"),
|
||||
Year("2021"),
|
||||
Year("2022"),
|
||||
Year("2023"),
|
||||
Year("2024"),
|
||||
Year("2025"),
|
||||
)
|
||||
|
||||
internal class Type(val id: String, name: String) : AnimeFilter.CheckBox(name)
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
package eu.kanade.tachiyomi.animeextension.it.animeworld
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import okhttp3.Cookie
|
||||
import okhttp3.Interceptor
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import java.io.IOException
|
||||
|
||||
class ShittyRedirectionInterceptor(private val client: OkHttpClient) : Interceptor {
|
||||
|
||||
override fun intercept(chain: Interceptor.Chain): Response {
|
||||
val request = chain.request()
|
||||
val response = chain.proceed(request)
|
||||
// ignore non-protected requests
|
||||
if (response.code != 202) return response
|
||||
return try {
|
||||
chain.proceed(loadCookies(request, response))
|
||||
} catch (e: Throwable) {
|
||||
// Because OkHttp's enqueue only handles IOExceptions, wrap the exception so that
|
||||
// we don't crash the entire app
|
||||
e.printStackTrace()
|
||||
throw IOException(e)
|
||||
}
|
||||
}
|
||||
|
||||
private fun loadCookies(request: Request, response: Response): Request {
|
||||
val (cookieString) = """document\.cookie="([^"]+)""".toRegex().find(response.body.string())!!.destructured
|
||||
val cookie = Cookie.parse(request.url, cookieString)!!
|
||||
|
||||
client.cookieJar.saveFromResponse(request.url, listOf(cookie))
|
||||
val headers = request.headers.newBuilder()
|
||||
.add("Cookie", cookie.toString())
|
||||
.build()
|
||||
|
||||
return GET(request.url.toString(), headers)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue