diff --git a/src/en/gogoanime/build.gradle b/src/en/gogoanime/build.gradle index 2ac9777df..60c12c206 100644 --- a/src/en/gogoanime/build.gradle +++ b/src/en/gogoanime/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Gogoanime' pkgNameSuffix = 'en.gogoanime' extClass = '.GogoAnime' - extVersionCode = 24 + extVersionCode = 25 libVersion = '12' } diff --git a/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GetSourcesInterceptor.kt b/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GetSourcesInterceptor.kt new file mode 100644 index 000000000..624395b1e --- /dev/null +++ b/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GetSourcesInterceptor.kt @@ -0,0 +1,100 @@ +package eu.kanade.tachiyomi.animeextension.en.gogoanime + +import android.annotation.SuppressLint +import android.app.Application +import android.os.Handler +import android.os.Looper +import android.util.Log +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import eu.kanade.tachiyomi.network.GET +import okhttp3.Headers.Companion.toHeaders +import okhttp3.Interceptor +import okhttp3.Request +import okhttp3.Response +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.io.IOException +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit + +class GetSourcesInterceptor() : Interceptor { + private val context = Injekt.get() + private val handler by lazy { Handler(Looper.getMainLooper()) } + + private val initWebView by lazy { + WebSettings.getDefaultUserAgent(context) + } + + @Synchronized + override fun intercept(chain: Interceptor.Chain): Response { + initWebView + + val request = chain.request() + + try { + val newRequest = resolveWithWebView(request) + + return chain.proceed(newRequest ?: request) + } catch (e: Exception) { + throw IOException(e) + } + } + + @SuppressLint("SetJavaScriptEnabled") + private fun resolveWithWebView(request: Request): Request? { + val latch = CountDownLatch(1) + + var webView: WebView? = null + + val origRequestUrl = request.url.toString() + val headers = request.headers.toMultimap().mapValues { it.value.getOrNull(0) ?: "" }.toMutableMap() + var newRequest: Request? = null + + handler.post { + val webview = WebView(context) + webView = webview + with(webview.settings) { + javaScriptEnabled = true + domStorageEnabled = true + databaseEnabled = true + useWideViewPort = false + loadWithOverviewMode = false + userAgentString = "Mozilla/5.0 (Linux; Android) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.109 Safari/537.36 CrKey/1.54.248666" + } + webview.webViewClient = object : WebViewClient() { + override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest + ): WebResourceResponse? { + val url = request.url.toString() + if (url.contains("https://gogoplay.io/encrypt-ajax.php")) { + Log.i("bruh", "hi") + val newHeaders = request.requestHeaders.toHeaders() + newRequest = GET(url, newHeaders) + latch.countDown() + } + return super.shouldInterceptRequest(view, request) + } + } + + webView?.loadUrl(origRequestUrl, headers) + } + + latch.await(TIMEOUT_SEC, TimeUnit.SECONDS) + + handler.post { + webView?.stopLoading() + webView?.destroy() + webView = null + } + return newRequest + } + + companion object { + const val TIMEOUT_SEC: Long = 10 + } +} diff --git a/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GogoAnime.kt b/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GogoAnime.kt index 476db026e..fd89dbb06 100644 --- a/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GogoAnime.kt +++ b/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GogoAnime.kt @@ -4,6 +4,7 @@ import android.app.Application import android.content.SharedPreferences import androidx.preference.ListPreference import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animeextension.en.gogoanime.extractors.DoodExtractor import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilter import eu.kanade.tachiyomi.animesource.model.AnimeFilterList @@ -13,22 +14,29 @@ import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response +import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.nodes.Element -import org.jsoup.select.Elements import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy import java.lang.Exception class GogoAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val name = "Gogoanime" - override val baseUrl = "https://gogoanime.cm" + override val baseUrl = "https://www3.gogoanime.cm" override val lang = "en" @@ -36,6 +44,8 @@ class GogoAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val client: OkHttpClient = network.cloudflareClient + private val json: Json by injectLazy() + private val preferences: SharedPreferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) } @@ -80,103 +90,52 @@ class GogoAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { return episode } - override fun videoListRequest(episode: SEpisode): Request { - val document = client.newCall(GET(baseUrl + episode.url)).execute().asJsoup() - val link = document.selectFirst("li.dowloads a").attr("href") - return GET(link) - } - override fun videoListParse(response: Response): List