Fixed AnimeWorld provider (#957)

Added site protection bypass
This commit is contained in:
Davide 2022-04-16 14:29:21 +02:00 committed by GitHub
parent 478b7a0066
commit d7a50a969a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,13 +1,15 @@
package com.lagradost.cloudstream3.animeproviders package com.lagradost.cloudstream3.animeproviders
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId
import com.lagradost.cloudstream3.LoadResponse.Companion.addRating import com.lagradost.cloudstream3.LoadResponse.Companion.addRating
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
import com.lagradost.cloudstream3.network.AppResponse
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
import org.json.JSONObject
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
class AnimeWorldProvider : MainAPI() { class AnimeWorldProvider : MainAPI() {
@ -23,6 +25,19 @@ class AnimeWorldProvider : MainAPI() {
) )
companion object { companion object {
private const val cookieName = "AWCookieVerify"
private val cookieRegex = Regex("$cookieName=(.+?)(\\s?);")
private val cookies = mutableMapOf(cookieName to "")
private suspend fun request(url: String): AppResponse {
val response = app.get(url, cookies = cookies)
return cookieRegex.find(response.text)?.let {
val verify = it.groups[1]?.value ?: throw ErrorLoadingException("Can't bypass protection")
cookies[cookieName] = verify
return app.get(url, cookies = cookies)
} ?: response
}
fun getType(t: String?): TvType { fun getType(t: String?): TvType {
return when (t?.lowercase()) { return when (t?.lowercase()) {
"movie" -> TvType.AnimeMovie "movie" -> TvType.AnimeMovie
@ -47,9 +62,11 @@ class AnimeWorldProvider : MainAPI() {
return h.joinToString(".") return h.joinToString(".")
} }
val title = this.select("a.name").text().removeSuffix(" (ITA)") val anchor = this.select("a.name").firstOrNull() ?: throw ErrorLoadingException("Error")
val otherTitle = this.select("a.name").attr("data-jtitle").removeSuffix(" (ITA)") val title = anchor.text().removeSuffix(" (ITA)")
val url = fixUrl(this.select("a.name").attr("href").parseHref()) val otherTitle = anchor.attr("data-jtitle").removeSuffix(" (ITA)")
val url = fixUrl(anchor.attr("href").parseHref())
val poster = this.select("a.poster img").attr("src") val poster = this.select("a.poster img").attr("src")
val statusElement = this.select("div.status") // .first() val statusElement = this.select("div.status") // .first()
@ -71,7 +88,7 @@ class AnimeWorldProvider : MainAPI() {
} }
override suspend fun getMainPage(): HomePageResponse { override suspend fun getMainPage(): HomePageResponse {
val document = app.get(mainUrl).document val document = request(mainUrl).document
val list = ArrayList<HomePageList>() val list = ArrayList<HomePageList>()
val widget = document.select(".widget.hotnew") val widget = document.select(".widget.hotnew")
@ -95,7 +112,7 @@ class AnimeWorldProvider : MainAPI() {
} }
override suspend fun search(query: String): List<SearchResponse> { override suspend fun search(query: String): List<SearchResponse> {
val document = app.get("$mainUrl/search?keyword=$query").document val document = request("$mainUrl/search?keyword=$query").document
return document.select(".film-list > .item").map { return document.select(".film-list > .item").map {
it.toSearchResult(showEpisode = false) it.toSearchResult(showEpisode = false)
} }
@ -112,7 +129,7 @@ class AnimeWorldProvider : MainAPI() {
} }
} }
val document = app.get(url).document val document = request(url).document
val widget = document.select("div.widget.info") val widget = document.select("div.widget.info")
val title = widget.select(".info .title").text().removeSuffix(" (ITA)") val title = widget.select(".info .title").text().removeSuffix(" (ITA)")
@ -153,7 +170,7 @@ class AnimeWorldProvider : MainAPI() {
val id = it.select("a").attr("data-id") val id = it.select("a").attr("data-id")
val number = it.select("a").attr("data-episode-num").toIntOrNull() val number = it.select("a").attr("data-episode-num").toIntOrNull()
Episode( Episode(
fixUrl("$mainUrl/api/episode/info?id=$id"), "$mainUrl/api/episode/info?id=$id",
episode = number episode = number
) )
} }
@ -182,15 +199,25 @@ class AnimeWorldProvider : MainAPI() {
} }
} }
data class Json (
@JsonProperty("grabber") val grabber: String,
@JsonProperty("name") val name: String,
@JsonProperty("target") val target: String,
)
override suspend fun loadLinks( override suspend fun loadLinks(
data: String, data: String,
isCasting: Boolean, isCasting: Boolean,
subtitleCallback: (SubtitleFile) -> Unit, subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
): Boolean { ): Boolean {
val url = JSONObject( val url = tryParseJson<Json>(
app.get(data).text request(data).text
).getString("grabber") )?.grabber
if (url.isNullOrEmpty())
return false
callback.invoke( callback.invoke(
ExtractorLink( ExtractorLink(
name, name,