Update AnimeKai.kt

This commit is contained in:
Arkai1 2025-04-13 21:40:12 +05:30 committed by GitHub
parent ebe47dee24
commit 9358fe5315
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -10,10 +10,10 @@ import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asJsoup import eu.kanade.tachiyomi.network.asJsoup
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.json.JSONObject import org.json.JSONObject
import org.jsoup.Jsoup import org.jsoup.Jsoup
import android.util.Log
class AnimeKai : AnimeHttpSource() { class AnimeKai : AnimeHttpSource() {
@ -36,7 +36,7 @@ class AnimeKai : AnimeHttpSource() {
private val decoder = AnimekaiDecoder() private val decoder = AnimekaiDecoder()
override fun popularAnimeRequest(page: Int): Request = override fun popularAnimeRequest(page: Int): okhttp3.Request =
GET("$baseUrl/browser?sort=trending&page=$page", headers) GET("$baseUrl/browser?sort=trending&page=$page", headers)
override fun popularAnimeParse(response: Response): AnimesPage { override fun popularAnimeParse(response: Response): AnimesPage {
@ -51,12 +51,12 @@ class AnimeKai : AnimeHttpSource() {
return AnimesPage(animeList, true) return AnimesPage(animeList, true)
} }
override fun latestUpdatesRequest(page: Int): Request = override fun latestUpdatesRequest(page: Int): okhttp3.Request =
GET("$baseUrl/browser?sort=updated_date&status[]=releasing&page=$page", headers) GET("$baseUrl/browser?sort=updated_date&status[]=releasing&page=$page", headers)
override fun latestUpdatesParse(response: Response): AnimesPage = popularAnimeParse(response) override fun latestUpdatesParse(response: Response): AnimesPage = popularAnimeParse(response)
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request = override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): okhttp3.Request =
GET("$baseUrl/browser?keyword=$query&page=$page", headers) GET("$baseUrl/browser?keyword=$query&page=$page", headers)
override fun searchAnimeParse(response: Response): AnimesPage = popularAnimeParse(response) override fun searchAnimeParse(response: Response): AnimesPage = popularAnimeParse(response)
@ -69,7 +69,7 @@ class AnimeKai : AnimeHttpSource() {
?.substringAfter("url(")?.substringBefore(")")?.replace("\"", "") ?.substringAfter("url(")?.substringBefore(")")?.replace("\"", "")
genre = document.select("div.detail a[href*=genres]").joinToString { it.text() } genre = document.select("div.detail a[href*=genres]").joinToString { it.text() }
status = parseStatus(document.select("div.detail div:contains(Status) span").text()) status = parseStatus(document.select("div.detail div:contains(Status) span").text())
description = "No description available" description = document.selectFirst("div.desc p")?.text() ?: "No description available"
} }
} }
@ -84,21 +84,24 @@ class AnimeKai : AnimeHttpSource() {
.selectFirst("div.rate-box")?.attr("data-id") ?: return emptyList() .selectFirst("div.rate-box")?.attr("data-id") ?: return emptyList()
val token = decoder.generateToken(animeId) val token = decoder.generateToken(animeId)
val epHtml = client.newCall(GET("$baseUrl/ajax/episodes/list?ani_id=$animeId&_=$token")).execute().body?.string() val epHtml = runCatching {
?: return emptyList() client.newCall(GET("$baseUrl/ajax/episodes/list?ani_id=$animeId&_=$token")).execute().body?.string()
}.onFailure {
Log.e("AnimeKai", "Failed to fetch episode list: ${it.message}")
}.getOrNull() ?: return emptyList()
val epDocument = Jsoup.parse(epHtml) val epDocument = Jsoup.parse(epHtml)
return epDocument.select("div.eplist a").mapIndexed { index, ep -> return epDocument.select("div.eplist a").mapIndexed { index, ep ->
SEpisode.create().apply { SEpisode.create().apply {
name = ep.select("span").text().ifEmpty { "Episode ${index + 1}" } name = ep.select("span").text().ifEmpty { "Episode ${index + 1}" }
episode_number = ep.attr("num").toFloatOrNull() ?: (index + 1).toFloat() episode_number = ep.attr("num").toFloatOrNull() ?: (index + 1).toFloat()
url = ep.attr("token") url = "$baseUrl/watch?token=${ep.attr("token")}"
} }
} }
} }
override fun videoListParse(response: Response): List<Video> { override fun videoListParse(response: Response): List<Video> {
val token = response.request.url.toString().substringAfterLast("token=")
val doc = response.asJsoup() val doc = response.asJsoup()
val preferredServer = preferences.getString(prefServerKey, defaultServer)!! val preferredServer = preferences.getString(prefServerKey, defaultServer)!!
@ -122,10 +125,10 @@ class AnimeKai : AnimeHttpSource() {
return videos.sortedWith( return videos.sortedWith(
compareByDescending<Video> { compareByDescending<Video> {
it.quality.contains(preferredServer, ignoreCase = true) it.quality.equals(preferredServer, ignoreCase = true)
}.thenByDescending { }.thenByDescending {
it.quality.contains(preferredSubtype, ignoreCase = true) it.quality.equals(preferredSubtype, ignoreCase = true)
}, }
) )
} }
@ -163,16 +166,4 @@ class AnimeKai : AnimeHttpSource() {
} }
override fun videoUrlParse(response: Response): String = throw UnsupportedOperationException() override fun videoUrlParse(response: Response): String = throw UnsupportedOperationException()
override fun episodeFromElement(element: org.jsoup.nodes.Element): SEpisode = throw UnsupportedOperationException() }
override fun latestUpdatesFromElement(element: org.jsoup.nodes.Element): SAnime = throw UnsupportedOperationException()
override fun popularAnimeFromElement(element: org.jsoup.nodes.Element): SAnime = throw UnsupportedOperationException()
override fun searchAnimeFromElement(element: org.jsoup.nodes.Element): SAnime = throw UnsupportedOperationException()
override fun popularAnimeNextPageSelector(): String? = null
override fun latestUpdatesNextPageSelector(): String? = null
override fun searchAnimeNextPageSelector(): String? = null
override fun popularAnimeSelector(): String = "div.aitem"
override fun latestUpdatesSelector(): String = popularAnimeSelector()
override fun searchAnimeSelector(): String = popularAnimeSelector()
override fun episodeListSelector(): String = "div.eplist a"
}