diff --git a/src/en/nineanime/build.gradle b/src/en/nineanime/build.gradle index 8f9d8ec7c..c12b86e92 100644 --- a/src/en/nineanime/build.gradle +++ b/src/en/nineanime/build.gradle @@ -6,7 +6,7 @@ ext { extName = '9anime' pkgNameSuffix = 'en.nineanime' extClass = '.NineAnime' - extVersionCode = 34 + extVersionCode = 35 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 975ddef9e..32104c7cc 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 @@ -27,7 +27,7 @@ class JsInterceptor(private val lang: String) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() handler.post { - context.let { Toast.makeText(it, "This might take a while, Don't close me", Toast.LENGTH_LONG).show() } + context.let { Toast.makeText(it, "Getting $lang. This might take a while, Don't close me", Toast.LENGTH_LONG).show() } } val newRequest = resolveWithWebView(originalRequest) ?: throw Exception("Someting went wrong") diff --git a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsVrfInterceptor.kt b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsVrfInterceptor.kt index 3cfbb51d6..8c1cb1cd9 100644 --- a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsVrfInterceptor.kt +++ b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/JsVrfInterceptor.kt @@ -18,8 +18,6 @@ class JsVrfInterceptor(private val baseUrl: String) { private val handler by lazy { Handler(Looper.getMainLooper()) } private val vrfWebView = createWebView() - fun wake() = "" - fun getVrf(query: String): String { if (query.isBlank()) return "" val jscript = getJs(query) 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 b5f8a7f66..3348953bd 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 @@ -15,7 +15,6 @@ import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.asObservableSuccess -import eu.kanade.tachiyomi.util.asJsoup import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -24,13 +23,10 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json -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 rx.Observable @@ -65,8 +61,6 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // ============================== Popular =============================== override fun popularAnimeRequest(page: Int): Request { - // make the vrf webview available beforehand - vrfInterceptor.wake() return GET("$baseUrl/filter?sort=trending&page=$page") } @@ -84,8 +78,6 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // =============================== Latest =============================== override fun latestUpdatesRequest(page: Int): Request { - // make the vrf webview available beforehand. - vrfInterceptor.wake() return GET("$baseUrl/filter?sort=recently_updated&page=$page") } @@ -131,11 +123,7 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun searchAnimeSelector(): String = popularAnimeSelector() - override fun searchAnimeFromElement(element: Element): SAnime = SAnime.create().apply { - setUrlWithoutDomain(element.select("div.poster a").attr("href")) - thumbnail_url = element.select("div.poster img").attr("src") - title = element.select("a.name").text() - } + override fun searchAnimeFromElement(element: Element): SAnime = popularAnimeFromElement(element) override fun searchAnimeNextPageSelector(): String = popularAnimeNextPageSelector() @@ -167,37 +155,30 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // ============================== Episodes ============================== override fun episodeListRequest(anime: SAnime): Request { - val id = client.newCall(GET(baseUrl + anime.url)).execute().asJsoup() - .selectFirst("div[data-id]")!!.attr("data-id") - val vrf = vrfInterceptor.getVrf(id) - return GET( - "$baseUrl/ajax/episode/list/$id?vrf=${java.net.URLEncoder.encode(vrf, "utf-8")}", - headers = Headers.headersOf("url", anime.url), - ) + val link = "https://api.consumet.org/anime/9anime" + anime.url.replace("watch", "info", true) + return GET(link, headers = Headers.headersOf("url", anime.url)) } - override fun episodeListSelector() = "div.episodes ul > li > a" + override fun episodeListSelector() = throw Exception("not used") override fun episodeListParse(response: Response): List { val animeUrl = response.request.header("url").toString() - val responseObject = json.decodeFromString(response.body.string()) - val document = Jsoup.parse(JSONUtil.unescape(responseObject["result"]!!.jsonPrimitive.content)) - val episodeElements = document.select(episodeListSelector()) - return episodeElements.parallelMap { episodeFromElements(it, animeUrl) }.reversed() + val responseObject = json.decodeFromString(response.body.string()) + return responseObject.episodes.parallelMap { episodeFromElements(it, animeUrl) }.reversed() } override fun episodeFromElement(element: Element): SEpisode = throw Exception("not Used") - private fun episodeFromElements(element: Element, url: String): SEpisode { + private fun episodeFromElements(item: EpisodeResponse.Episode, url: String): SEpisode { val episode = SEpisode.create() - val epNum = element.attr("data-num") - val ids = element.attr("data-ids") - val sub = element.attr("data-sub").toInt().toBoolean() - val dub = element.attr("data-dub").toInt().toBoolean() - episode.url = "/ajax/server/list/$ids?vrf=&epurl=$url/ep-$epNum" + val epNum = item.epNum + val ids = item.subId + if (item.dubId.isNullOrBlank()) "" else ",${item.dubId}" + val sub = item.subId.isNotBlank() + val dub = !item.dubId.isNullOrBlank() + episode.url = "$ids&epurl=$url/ep-$epNum" episode.episode_number = epNum.toFloat() episode.scanlator = (if (sub) "Sub" else "") + if (dub) ", Dub" else "" - val name = element.parent()?.select("span.d-title")?.text().orEmpty() + val name = item.title val namePrefix = "Episode $epNum" episode.name = "Episode $epNum" + if (name.isNotEmpty() && name != namePrefix) ": $name" else "" @@ -206,36 +187,28 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // ============================ Video Links ============================= - override fun videoListRequest(episode: SEpisode): Request { - val ids = episode.url.substringAfter("list/").substringBefore("?vrf") - val vrf = vrfInterceptor.getVrf(ids) - val url = "/ajax/server/list/$ids?vrf=${java.net.URLEncoder.encode(vrf, "utf-8")}" + override fun fetchVideoList(episode: SEpisode): Observable> { + val ids = episode.url.substringBefore("&").split(",") val epurl = episode.url.substringAfter("epurl=") - return GET(baseUrl + url, headers = Headers.headersOf("url", epurl)) - } - - override fun videoListParse(response: Response): List