From bf82113cf4594e441a480f9acf885b4f39ea5645 Mon Sep 17 00:00:00 2001 From: jmir1 Date: Mon, 25 Jul 2022 23:29:06 +0200 Subject: [PATCH] fix 9anime --- src/en/nineanime/build.gradle | 2 +- .../animeextension/en/nineanime/NineAnime.kt | 133 ++++++++---------- 2 files changed, 57 insertions(+), 78 deletions(-) diff --git a/src/en/nineanime/build.gradle b/src/en/nineanime/build.gradle index 89fc6e64e..fa02c4156 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 = 7 + extVersionCode = 8 libVersion = '12' } 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 bf6aa9d4b..3e0bad17a 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 @@ -2,16 +2,17 @@ package eu.kanade.tachiyomi.animeextension.en.nineanime import android.app.Application import android.content.SharedPreferences +import android.util.Log import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilterList -import eu.kanade.tachiyomi.animesource.model.AnimesPage import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode 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.ExperimentalSerializationApi import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json @@ -54,76 +55,60 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { return Headers.Builder().add("Referer", baseUrl) } - override fun popularAnimeSelector(): String = "li" + override fun popularAnimeSelector(): String = "div.ani.items > div" - override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/ajax/home/widget?name=trending&page=$page") - - override fun popularAnimeParse(response: Response): AnimesPage { - val responseObject = json.decodeFromString(response.body!!.string()) - val document = Jsoup.parse(JSONUtil.unescape(responseObject["html"]!!.jsonPrimitive.content)) - - val animes = document.select(popularAnimeSelector()).map { element -> - popularAnimeFromElement(element) - } - - val hasNextPage = popularAnimeNextPageSelector().let { selector -> - document.select(selector).first() - } != null - - return AnimesPage(animes, hasNextPage) - } + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/filter?sort=trending&page=$page") override fun popularAnimeFromElement(element: Element) = SAnime.create().apply { setUrlWithoutDomain(element.select("a.name").attr("href").substringBefore("?")) - thumbnail_url = element.select("a.poster img").attr("src") + thumbnail_url = element.select("div.poster img").attr("src") title = element.select("a.name").text() } override fun popularAnimeNextPageSelector(): String = "li" override fun episodeListRequest(anime: SAnime): Request { - val animeId = anime.url.substringAfterLast(".") - val vrf = encode(getVrf(animeId)) - return GET("$baseUrl/ajax/anime/servers?id=$animeId&vrf=$vrf") + val id = client.newCall(GET(baseUrl + anime.url)).execute().asJsoup().selectFirst("div[data-id]").attr("data-id") + val vrf = encodeVrf(id) + return GET("$baseUrl/ajax/episode/list/$id?vrf=$vrf") } override fun episodeListParse(response: Response): List { val responseObject = json.decodeFromString(response.body!!.string()) - val document = Jsoup.parse(JSONUtil.unescape(responseObject["html"]!!.jsonPrimitive.content)) - val animeId = response.request.url.queryParameter("id")!! - val vrf = encode(response.request.url.queryParameter("vrf")!!) - return document.select(episodeListSelector()).map { episodeFromElement(it, animeId, vrf) }.reversed() + val document = Jsoup.parse(JSONUtil.unescape(responseObject["result"]!!.jsonPrimitive.content)) + return document.select(episodeListSelector()).map(::episodeFromElement).reversed() } - override fun episodeListSelector() = "ul.episodes li a" + override fun episodeListSelector() = "div.episodes ul > li > a" - private fun episodeFromElement(element: Element, animeId: String, vrf: String): SEpisode { + override fun episodeFromElement(element: Element): SEpisode { val episode = SEpisode.create() - val epNum = element.attr("data-base") - episode.url = "/ajax/anime/servers?id=$animeId&vrf=$vrf&episode=$epNum" + val epNum = element.attr("data-num") + val ids = element.attr("data-ids") + val vrf = encodeVrf(ids) + episode.url = "/ajax/server/list/$ids?vrf=$vrf" episode.episode_number = epNum.toFloat() - episode.name = "Episode $epNum" + val name = element.parent()?.select("span.d-title")?.text().orEmpty() + val namePrefix = "Episode $epNum" + episode.name = if (name.isNotEmpty() && name != namePrefix) { + "Episode $epNum: $name" + } else { + "Episode $epNum" + } return episode } - override fun episodeFromElement(element: Element) = throw Exception("not used") - override fun videoListParse(response: Response): List