From 42065686b3dc26f6a4692b79666a09602c59d122 Mon Sep 17 00:00:00 2001 From: imper1aldev <23511335+imper1aldev@users.noreply.github.com> Date: Sat, 3 Aug 2024 11:26:49 -0600 Subject: [PATCH] fix(src/es): Pelisplushd and Hackstore fixes (#97) * VoeExtractor, PelisplusHD & Hackstore fixes * VoeExtractor, PelisplusHD & Hackstore fixes --- .../lib/voeextractor/DdosGuardInterceptor.kt | 73 +++++++ .../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 | 62 +++--- .../es/pelisplushd/PelisplushdFactory.kt | 2 +- .../es/pelisplushd/Pelisplusph.kt | 5 +- .../es/pelisplushd/Pelisplusto.kt | 5 +- .../es/pelisplushd/extractors/JsUnpacker.kt | 205 ------------------ .../extractors/StreamHideExtractor.kt | 34 --- 11 files changed, 136 insertions(+), 282 deletions(-) create mode 100644 lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/DdosGuardInterceptor.kt delete mode 100644 src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/extractors/JsUnpacker.kt delete mode 100644 src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/extractors/StreamHideExtractor.kt 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 new file mode 100644 index 00000000..dddd3982 --- /dev/null +++ b/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/DdosGuardInterceptor.kt @@ -0,0 +1,73 @@ +package eu.kanade.tachiyomi.lib.voeextractor + +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