From 6cfdd729388e51a6378150fda9ef1824a8f8ce7b Mon Sep 17 00:00:00 2001 From: imper1aldev <23511335+imper1aldev@users.noreply.github.com> Date: Sat, 3 Aug 2024 04:16:46 -0600 Subject: [PATCH] VoeExtractor, PelisplusHD & Hackstore fixes --- .../lib/voeextractor/DdosGuardInterceptor.kt | 71 ++++++++++++++++++- .../lib/voeextractor/VoeExtractor.kt | 17 ++++- src/es/hackstore/build.gradle | 2 +- .../animeextension/es/hackstore/Hackstore.kt | 10 +-- src/es/pelisplushd/build.gradle | 3 +- .../es/pelisplushd/Pelisplushd.kt | 58 ++++++++------- .../es/pelisplushd/PelisplushdFactory.kt | 2 +- .../es/pelisplushd/Pelisplusph.kt | 5 +- .../es/pelisplushd/Pelisplusto.kt | 5 +- 9 files changed, 131 insertions(+), 42 deletions(-) diff --git a/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/DdosGuardInterceptor.kt b/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/DdosGuardInterceptor.kt index 5796c6af..dddd3982 100644 --- a/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/DdosGuardInterceptor.kt +++ b/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/DdosGuardInterceptor.kt @@ -1,4 +1,73 @@ package eu.kanade.tachiyomi.lib.voeextractor -class DdosGuardInterceptor { +import android.webkit.CookieManager +import eu.kanade.tachiyomi.network.GET +import okhttp3.Cookie +import okhttp3.HttpUrl +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Response + +class DdosGuardInterceptor(private val client: OkHttpClient) : Interceptor { + + private val cookieManager by lazy { CookieManager.getInstance() } + + override fun intercept(chain: Interceptor.Chain): Response { + val originalRequest = chain.request() + val response = chain.proceed(originalRequest) + + // Check if DDos-GUARD is on + if (response.code !in ERROR_CODES || response.header("Server") !in SERVER_CHECK) { + return response + } + + response.close() + val cookies = cookieManager.getCookie(originalRequest.url.toString()) + val oldCookie = if (cookies != null && cookies.isNotEmpty()) { + cookies.split(";").mapNotNull { Cookie.parse(originalRequest.url, it) } + } else { + emptyList() + } + + val ddg2Cookie = oldCookie.firstOrNull { it.name == "__ddg2_" } + if (!ddg2Cookie?.value.isNullOrEmpty()) { + return chain.proceed(originalRequest) + } + + val newCookie = getNewCookie(originalRequest.url) ?: return chain.proceed(originalRequest) + val newCookieHeader = buildString { + (oldCookie + newCookie).forEachIndexed { index, cookie -> + if (index > 0) append("; ") + append(cookie.name).append('=').append(cookie.value) + } + } + + return chain.proceed(originalRequest.newBuilder().addHeader("cookie", newCookieHeader).build()) + } + + fun getNewCookie(url: HttpUrl): Cookie? { + val cookies = cookieManager.getCookie(url.toString()) + val oldCookie = if (cookies != null && cookies.isNotEmpty()) { + cookies.split(";").mapNotNull { Cookie.parse(url, it) } + } else { + emptyList() + } + val ddg2Cookie = oldCookie.firstOrNull { it.name == "__ddg2_" } + if (!ddg2Cookie?.value.isNullOrEmpty()) { + return ddg2Cookie + } + val wellKnown = client.newCall(GET("https://check.ddos-guard.net/check.js")) + .execute().body.string() + .substringAfter("'", "") + .substringBefore("'", "") + val checkUrl = "${url.scheme}://${url.host + wellKnown}" + return client.newCall(GET(checkUrl)).execute().header("set-cookie")?.let { + Cookie.parse(url, it) + } + } + + companion object { + private val ERROR_CODES = listOf(403) + private val SERVER_CHECK = listOf("ddos-guard") + } } diff --git a/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt b/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt index 398dc0cf..40878ebc 100644 --- a/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt +++ b/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt @@ -14,7 +14,9 @@ class VoeExtractor(private val client: OkHttpClient) { private val json: Json by injectLazy() - private val playlistUtils by lazy { PlaylistUtils(client) } + private val clientDdos by lazy { client.newBuilder().addInterceptor(DdosGuardInterceptor(client)).build() } + + private val playlistUtils by lazy { PlaylistUtils(clientDdos) } private val linkRegex = "(http|https)://([\\w_-]+(?:\\.[\\w_-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])".toRegex() @@ -24,7 +26,16 @@ class VoeExtractor(private val client: OkHttpClient) { data class VideoLinkDTO(val file: String) fun videosFromUrl(url: String, prefix: String = ""): List