diff --git a/src/en/nineanime/build.gradle b/src/en/nineanime/build.gradle
index 7f07a1bb3..03e5d5733 100644
--- a/src/en/nineanime/build.gradle
+++ b/src/en/nineanime/build.gradle
@@ -5,7 +5,7 @@ ext {
extName = '9anime'
pkgNameSuffix = 'en.nineanime'
extClass = '.NineAnime'
- extVersionCode = 24
+ extVersionCode = 25
libVersion = '13'
}
diff --git a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsInterceptor.kt b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsInterceptor.kt
index 749f78eb3..fe423cd1b 100644
--- a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsInterceptor.kt
+++ b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsInterceptor.kt
@@ -52,7 +52,7 @@ class JsInterceptor(private val lang: String) : Interceptor {
// JavaSrcipt gets the Dub or Sub link of vidstream
val jsScript = """
(function(){
- setTimeout(function(){
+ window.onload = (function() {
let el = document.querySelector('div[data-type="$lang"] ul li[data-sv-id="41"]');
let e = document.createEvent('HTMLEvents');
e.initEvent('click',true,true);
@@ -64,8 +64,8 @@ class JsInterceptor(private val lang: String) : Interceptor {
window.android.passPayload(entry.name);
}
});
- }, 2000);
- }, 1000);
+ }, 5000);
+ })();
})();"""
val headers = request.headers.toMultimap().mapValues { it.value.getOrNull(0) ?: "" }.toMutableMap()
diff --git a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsVizInterceptor.kt b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsVizInterceptor.kt
index 7fb92771f..6f461bac6 100644
--- a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsVizInterceptor.kt
+++ b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsVizInterceptor.kt
@@ -52,19 +52,28 @@ class JsVizInterceptor(private val embedLink: String) : Interceptor {
// JavaSrcipt creates Iframe on vidstream page to bypass iframe-cors and gets the sourceUrl
val jsScript = """
(function(){
- const html = '';
- document.body.innerHTML += html;
- setTimeout(function() {
- const iframe = document.querySelector('iframe');
- const entries = iframe.contentWindow.performance.getEntries();
- entries.forEach((entry) => {
- if(entry.initiatorType.includes("xmlhttprequest")){
- if(!entry.name.includes("/ping/") && !entry.name.includes("/assets/")){
- window.android.passPayload(entry.name);
- }
+ const html = '';
+ document.body.innerHTML += html;
+ const iframe = document.querySelector('iframe');
+
+ const originalOpen = iframe.contentWindow.XMLHttpRequest.prototype.open;
+ iframe.contentWindow.XMLHttpRequest.prototype.open = function(method, url, async) {
+ if (!url.includes("ping") && !url.includes("/assets/") && !url.includes("thumbnails") && !url.includes("jpg") && !url.includes("m3u8")) {
+ if (url == null) {
+ const entries = iframe.contentWindow.performance.getEntries();
+ entries.forEach((entry) => {
+ if (entry.initiatorType.includes("xmlhttprequest")) {
+ if (!entry.name.includes("/ping/") && !entry.name.includes("/assets/") && !entry.name.includes("thumbnails")) {
+ window.android.passPayload(entry.name);
+ }
+ }
+ });
+ } else {
+ window.android.passPayload("https://" + document.domain + "/" + url);
}
- });
- }, 2000);
+ }
+ originalOpen.apply(this, arguments);
+ }
})();
"""
diff --git a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/NineAnime.kt b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/NineAnime.kt
index 7beb44271..bad13bd03 100644
--- a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/NineAnime.kt
+++ b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/NineAnime.kt
@@ -71,7 +71,7 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val id = client.newCall(GET(baseUrl + anime.url)).execute().asJsoup().selectFirst("div[data-id]").attr("data-id")
val jsVrfInterceptor = client.newBuilder().addInterceptor(JsVrfInterceptor(id, baseUrl)).build()
val vrf = jsVrfInterceptor.newCall(GET("$baseUrl/filter")).execute().request.header("url").toString()
- return GET("$baseUrl/ajax/episode/list/$id?vrf=$vrf", headers = Headers.headersOf("url", anime.url))
+ return GET("$baseUrl/ajax/episode/list/$id?vrf=${java.net.URLEncoder.encode(vrf, "utf-8")}", headers = Headers.headersOf("url", anime.url))
}
private fun Iterable.parallelMap(f: suspend (A) -> B): List =
@@ -128,7 +128,7 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val ids = episode.url.substringAfter("list/").substringBefore("?vrf")
val jsVrfInterceptor = client.newBuilder().addInterceptor(JsVrfInterceptor(ids, baseUrl)).build()
val vrf = jsVrfInterceptor.newCall(GET("$baseUrl/filter")).execute().request.header("url").toString()
- val url = "/ajax/server/list/$ids?vrf=$vrf"
+ val url = "/ajax/server/list/$ids?vrf=${java.net.URLEncoder.encode(vrf, "utf-8")}"
val epurl = episode.url.substringAfter("epurl=")
return GET(baseUrl + url, headers = Headers.headersOf("url", epurl))
}
@@ -222,7 +222,7 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
val jsVrfInterceptor = client.newBuilder().addInterceptor(JsVrfInterceptor(query, baseUrl)).build()
val vrf = jsVrfInterceptor.newCall(GET("$baseUrl/filter")).execute().request.header("url").toString()
- return GET("$baseUrl/filter?keyword=$query&vrf=$vrf&page=$page", headers = Headers.headersOf("Referer", "$baseUrl/"))
+ return GET("$baseUrl/filter?keyword=$query&vrf=${java.net.URLEncoder.encode(vrf, "utf-8")}&page=$page", headers = Headers.headersOf("Referer", "$baseUrl/"))
}
override fun animeDetailsParse(document: Document): SAnime {