forked from recloudstream/cloudstream
fixed tenshi searching
This commit is contained in:
parent
607c9e9af5
commit
e118938a41
3 changed files with 68 additions and 68 deletions
|
@ -12,7 +12,7 @@ import org.jsoup.nodes.Document
|
||||||
import java.net.URI
|
import java.net.URI
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.concurrent.thread
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
class TenshiProvider : MainAPI() {
|
class TenshiProvider : MainAPI() {
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -101,16 +101,12 @@ class TenshiProvider : MainAPI() {
|
||||||
return movies.contains(aniId)
|
return movies.contains(aniId)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun parseSearchPage(soup: Document): ArrayList<SearchResponse> {
|
private fun parseSearchPage(soup: Document): List<SearchResponse> {
|
||||||
val items = soup.select("ul.thumb > li > a")
|
val items = soup.select("ul.thumb > li > a")
|
||||||
if (items.isEmpty()) return ArrayList()
|
return items.map {
|
||||||
val returnValue = ArrayList<SearchResponse>()
|
val href = fixUrl(it.attr("href"))
|
||||||
for (i in items) {
|
val img = fixUrl(it.selectFirst("img").attr("src"))
|
||||||
val href = fixUrl(i.attr("href"))
|
val title = it.attr("title")
|
||||||
val img = fixUrl(i.selectFirst("img").attr("src"))
|
|
||||||
val title = i.attr("title")
|
|
||||||
|
|
||||||
returnValue.add(
|
|
||||||
if (getIsMovie(href, true)) {
|
if (getIsMovie(href, true)) {
|
||||||
MovieSearchResponse(
|
MovieSearchResponse(
|
||||||
title, href, this.name, TvType.Movie, img, null
|
title, href, this.name, TvType.Movie, img, null
|
||||||
|
@ -126,9 +122,7 @@ class TenshiProvider : MainAPI() {
|
||||||
EnumSet.of(DubStatus.Subbed),
|
EnumSet.of(DubStatus.Subbed),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
|
||||||
}
|
}
|
||||||
return returnValue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SimpleDateFormat")
|
@SuppressLint("SimpleDateFormat")
|
||||||
|
@ -207,7 +201,7 @@ class TenshiProvider : MainAPI() {
|
||||||
interceptor = ddosGuardKiller
|
interceptor = ddosGuardKiller
|
||||||
).document
|
).document
|
||||||
|
|
||||||
val returnValue = parseSearchPage(document)
|
val returnValue = parseSearchPage(document).toMutableList()
|
||||||
|
|
||||||
while (!document.select("""a.page-link[rel="next"]""").isEmpty()) {
|
while (!document.select("""a.page-link[rel="next"]""").isEmpty()) {
|
||||||
val link = document.select("""a.page-link[rel="next"]""")
|
val link = document.select("""a.page-link[rel="next"]""")
|
||||||
|
@ -223,7 +217,7 @@ class TenshiProvider : MainAPI() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnValue
|
return ArrayList(returnValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun load(url: String): LoadResponse {
|
override fun load(url: String): LoadResponse {
|
||||||
|
@ -233,12 +227,7 @@ class TenshiProvider : MainAPI() {
|
||||||
interceptor = ddosGuardKiller
|
interceptor = ddosGuardKiller
|
||||||
).document
|
).document
|
||||||
|
|
||||||
val englishTitle =
|
|
||||||
document.selectFirst("span.value > span[title=\"English\"]")?.parent()?.text()?.trim()
|
|
||||||
val japaneseTitle =
|
|
||||||
document.selectFirst("span.value > span[title=\"Japanese\"]")?.parent()?.text()?.trim()
|
|
||||||
val canonicalTitle = document.selectFirst("header.entry-header > h1.mb-3").text().trim()
|
val canonicalTitle = document.selectFirst("header.entry-header > h1.mb-3").text().trim()
|
||||||
|
|
||||||
val episodeNodes = document.select("li[class*=\"episode\"] > a").toMutableList()
|
val episodeNodes = document.select("li[class*=\"episode\"] > a").toMutableList()
|
||||||
val totalEpisodePages = if (document.select(".pagination").size > 0)
|
val totalEpisodePages = if (document.select(".pagination").size > 0)
|
||||||
document.select(".pagination .page-item a.page-link:not([rel])").last().text()
|
document.select(".pagination .page-item a.page-link:not([rel])").last().text()
|
||||||
|
@ -266,38 +255,39 @@ class TenshiProvider : MainAPI() {
|
||||||
it.attr("data-content").trim(),
|
it.attr("data-content").trim(),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
val status = when (document.selectFirst("li.status > .value")?.text()?.trim()) {
|
|
||||||
|
|
||||||
|
val type = document.selectFirst("a[href*=\"$mainUrl/type/\"]")?.text()?.trim()
|
||||||
|
|
||||||
|
return newAnimeLoadResponse(canonicalTitle, url, getType(type ?: "")) {
|
||||||
|
posterUrl = document.selectFirst("img.cover-image")?.attr("src")
|
||||||
|
plot = document.selectFirst(".entry-description > .card-body")?.text()?.trim()
|
||||||
|
tags =
|
||||||
|
document.select("li.genre.meta-data > span.value")
|
||||||
|
.map { it?.text()?.trim().toString() }
|
||||||
|
|
||||||
|
synonyms =
|
||||||
|
document.select("li.synonym.meta-data > div.info-box > span.value")
|
||||||
|
.map { it?.text()?.trim().toString() }
|
||||||
|
|
||||||
|
engName =
|
||||||
|
document.selectFirst("span.value > span[title=\"English\"]")?.parent()?.text()
|
||||||
|
?.trim()
|
||||||
|
japName =
|
||||||
|
document.selectFirst("span.value > span[title=\"Japanese\"]")?.parent()?.text()
|
||||||
|
?.trim()
|
||||||
|
|
||||||
|
val pattern = "(\\d{4})".toRegex()
|
||||||
|
val yearText = document.selectFirst("li.release-date .value").text()
|
||||||
|
year = pattern.find(yearText)?.groupValues?.get(1)?.toIntOrNull()
|
||||||
|
|
||||||
|
addEpisodes(DubStatus.Subbed, episodes)
|
||||||
|
|
||||||
|
showStatus = when (document.selectFirst("li.status > .value")?.text()?.trim()) {
|
||||||
"Ongoing" -> ShowStatus.Ongoing
|
"Ongoing" -> ShowStatus.Ongoing
|
||||||
"Completed" -> ShowStatus.Completed
|
"Completed" -> ShowStatus.Completed
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
val yearText = document.selectFirst("li.release-date .value").text()
|
|
||||||
val pattern = "(\\d{4})".toRegex()
|
|
||||||
val (year) = pattern.find(yearText)!!.destructured
|
|
||||||
|
|
||||||
val poster = document.selectFirst("img.cover-image")?.attr("src")
|
|
||||||
val type = document.selectFirst("a[href*=\"$mainUrl/type/\"]")?.text()?.trim()
|
|
||||||
|
|
||||||
val synopsis = document.selectFirst(".entry-description > .card-body")?.text()?.trim()
|
|
||||||
val genre =
|
|
||||||
document.select("li.genre.meta-data > span.value").map { it?.text()?.trim().toString() }
|
|
||||||
|
|
||||||
val synonyms =
|
|
||||||
document.select("li.synonym.meta-data > div.info-box > span.value")
|
|
||||||
.map { it?.text()?.trim().toString() }
|
|
||||||
|
|
||||||
return newAnimeLoadResponse(canonicalTitle, url, getType(type ?: "")) {
|
|
||||||
engName = englishTitle
|
|
||||||
japName = japaneseTitle
|
|
||||||
|
|
||||||
posterUrl = poster
|
|
||||||
this.year = year.toIntOrNull()
|
|
||||||
|
|
||||||
addEpisodes(DubStatus.Subbed, episodes)
|
|
||||||
showStatus = status
|
|
||||||
tags = genre
|
|
||||||
this.synonyms = synonyms
|
|
||||||
plot = synopsis
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ class DdosGuardKiller(private val alwaysBypass: Boolean) : Interceptor {
|
||||||
app.get(it, cacheTime = 0).cookies.also { cookies ->
|
app.get(it, cacheTime = 0).cookies.also { cookies ->
|
||||||
savedCookiesMap[request.url.host] = cookies
|
savedCookiesMap[request.url.host] = cookies
|
||||||
}
|
}
|
||||||
}
|
} + request.cookies
|
||||||
|
|
||||||
val headers = getHeaders(request.headers.toMap(), null, cookies)
|
val headers = getHeaders(request.headers.toMap(), null, cookies)
|
||||||
return app.baseClient.newCall(
|
return app.baseClient.newCall(
|
||||||
|
|
|
@ -59,10 +59,10 @@ val Response.url: String
|
||||||
return this.request.url.toString()
|
return this.request.url.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
val Response.cookies: Map<String, String>
|
|
||||||
get() {
|
fun Headers.getCookies(cookieKey: String): Map<String, String> {
|
||||||
val cookieList =
|
val cookieList =
|
||||||
this.headers.filter { it.first.lowercase(Locale.ROOT) == "set-cookie" }
|
this.filter { it.first.equals(cookieKey, ignoreCase = true) }
|
||||||
.getOrNull(0)?.second?.split(";")
|
.getOrNull(0)?.second?.split(";")
|
||||||
return cookieList?.associate {
|
return cookieList?.associate {
|
||||||
val split = it.split("=")
|
val split = it.split("=")
|
||||||
|
@ -70,6 +70,16 @@ val Response.cookies: Map<String, String>
|
||||||
}?.filter { it.key.isNotBlank() && it.value.isNotBlank() } ?: mapOf()
|
}?.filter { it.key.isNotBlank() && it.value.isNotBlank() } ?: mapOf()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val Response.cookies: Map<String, String>
|
||||||
|
get() {
|
||||||
|
return this.headers.getCookies("set-cookie")
|
||||||
|
}
|
||||||
|
|
||||||
|
val Request.cookies: Map<String, String>
|
||||||
|
get() {
|
||||||
|
return this.headers.getCookies("Cookie")
|
||||||
|
}
|
||||||
|
|
||||||
class AppResponse(
|
class AppResponse(
|
||||||
val response: Response
|
val response: Response
|
||||||
) {
|
) {
|
||||||
|
@ -137,7 +147,7 @@ fun getHeaders(
|
||||||
val cookieHeaders = (DEFAULT_COOKIES + cookie)
|
val cookieHeaders = (DEFAULT_COOKIES + cookie)
|
||||||
val cookieMap =
|
val cookieMap =
|
||||||
if (cookieHeaders.isNotEmpty()) mapOf(
|
if (cookieHeaders.isNotEmpty()) mapOf(
|
||||||
"Cookie" to cookieHeaders.entries.joinToString() {
|
"Cookie" to cookieHeaders.entries.joinToString("") {
|
||||||
"${it.key}=${it.value};"
|
"${it.key}=${it.value};"
|
||||||
}) else mapOf()
|
}) else mapOf()
|
||||||
val tempHeaders = (DEFAULT_HEADERS + headers + cookieMap + refererMap)
|
val tempHeaders = (DEFAULT_HEADERS + headers + cookieMap + refererMap)
|
||||||
|
|
Loading…
Reference in a new issue