mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
f up kuramanime
This commit is contained in:
parent
e644456bc6
commit
3d6520cdef
4 changed files with 141 additions and 25 deletions
|
@ -1,5 +1,5 @@
|
||||||
// use an integer for version numbers
|
// use an integer for version numbers
|
||||||
version = 28
|
version = 29
|
||||||
|
|
||||||
|
|
||||||
cloudstream {
|
cloudstream {
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
package com.hexated
|
package com.hexated
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
import com.lagradost.cloudstream3.SubtitleFile
|
||||||
|
import com.lagradost.cloudstream3.app
|
||||||
import com.lagradost.cloudstream3.extractors.Filesim
|
import com.lagradost.cloudstream3.extractors.Filesim
|
||||||
import com.lagradost.cloudstream3.extractors.StreamSB
|
import com.lagradost.cloudstream3.extractors.StreamSB
|
||||||
|
import com.lagradost.cloudstream3.utils.ExtractorApi
|
||||||
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
|
import com.lagradost.cloudstream3.utils.Qualities
|
||||||
|
import com.lagradost.cloudstream3.utils.getQualityFromName
|
||||||
|
|
||||||
class Nyomo : StreamSB() {
|
class Nyomo : StreamSB() {
|
||||||
override var name: String = "Nyomo"
|
override var name: String = "Nyomo"
|
||||||
|
@ -12,3 +19,100 @@ class Streamhide : Filesim() {
|
||||||
override var name: String = "Streamhide"
|
override var name: String = "Streamhide"
|
||||||
override var mainUrl: String = "https://streamhide.to"
|
override var mainUrl: String = "https://streamhide.to"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open class Lbx : ExtractorApi() {
|
||||||
|
override val name = "Linkbox"
|
||||||
|
override val mainUrl = "https://lbx.to"
|
||||||
|
private val realUrl = "https://www.linkbox.to"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(
|
||||||
|
url: String,
|
||||||
|
referer: String?,
|
||||||
|
subtitleCallback: (SubtitleFile) -> Unit,
|
||||||
|
callback: (ExtractorLink) -> Unit
|
||||||
|
) {
|
||||||
|
val token = Regex("""(?:/f/|/file/|\?id=)(\w+)""").find(url)?.groupValues?.get(1)
|
||||||
|
val id = app.get("$realUrl/api/file/share_out_list/?sortField=utime&sortAsc=0&pageNo=1&pageSize=50&shareToken=$token").parsedSafe<Responses>()?.data?.itemId
|
||||||
|
app.get("$realUrl/api/file/detail?itemId=$id", referer = url)
|
||||||
|
.parsedSafe<Responses>()?.data?.itemInfo?.resolutionList?.map { link ->
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
name,
|
||||||
|
name,
|
||||||
|
link.url ?: return@map null,
|
||||||
|
"$realUrl/",
|
||||||
|
getQualityFromName(link.resolution)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class Resolutions(
|
||||||
|
@JsonProperty("url") val url: String? = null,
|
||||||
|
@JsonProperty("resolution") val resolution: String? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class ItemInfo(
|
||||||
|
@JsonProperty("resolutionList") val resolutionList: ArrayList<Resolutions>? = arrayListOf(),
|
||||||
|
)
|
||||||
|
|
||||||
|
data class Data(
|
||||||
|
@JsonProperty("itemInfo") val itemInfo: ItemInfo? = null,
|
||||||
|
@JsonProperty("itemId") val itemId: String? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class Responses(
|
||||||
|
@JsonProperty("data") val data: Data? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
open class Kuramadrive : ExtractorApi() {
|
||||||
|
override val name = "DriveKurama"
|
||||||
|
override val mainUrl = "https://kuramadrive.com"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(
|
||||||
|
url: String,
|
||||||
|
referer: String?,
|
||||||
|
subtitleCallback: (SubtitleFile) -> Unit,
|
||||||
|
callback: (ExtractorLink) -> Unit
|
||||||
|
) {
|
||||||
|
val req = app.get(url, referer = referer)
|
||||||
|
val doc = req.document
|
||||||
|
|
||||||
|
val title = doc.select("title").text()
|
||||||
|
val token = doc.select("meta[name=csrf-token]").attr("content")
|
||||||
|
val routeCheckAvl = doc.select("input#routeCheckAvl").attr("value")
|
||||||
|
|
||||||
|
val json = app.post(
|
||||||
|
routeCheckAvl, headers = mapOf(
|
||||||
|
"X-Requested-With" to "XMLHttpRequest",
|
||||||
|
"X-CSRF-TOKEN" to token
|
||||||
|
),
|
||||||
|
referer = url,
|
||||||
|
cookies = req.cookies
|
||||||
|
).parsedSafe<Source>()
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
name,
|
||||||
|
name,
|
||||||
|
json?.url ?: return,
|
||||||
|
"$mainUrl/",
|
||||||
|
getIndexQuality(title),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getIndexQuality(str: String?): Int {
|
||||||
|
return Regex("(\\d{3,4})[pP]").find(str ?: "")?.groupValues?.getOrNull(1)?.toIntOrNull()
|
||||||
|
?: Qualities.Unknown.value
|
||||||
|
}
|
||||||
|
|
||||||
|
private data class Source(
|
||||||
|
@JsonProperty("url") val url: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
|
@ -200,32 +200,42 @@ class KuramanimeProvider : MainAPI() {
|
||||||
|
|
||||||
val req = app.get(data)
|
val req = app.get(data)
|
||||||
val res = req.document
|
val res = req.document
|
||||||
val token = res.select("meta[name=csrf-token]").attr("content")
|
|
||||||
val auth = getAuth(data)
|
argamap(
|
||||||
headers = mapOf(
|
{
|
||||||
"Accept" to "application/json, text/javascript, */*; q=0.01",
|
val token = res.select("meta[name=csrf-token]").attr("content")
|
||||||
"Authorization" to "${auth.authHeader}",
|
val auth = getAuth(data)
|
||||||
"X-Requested-With" to "XMLHttpRequest",
|
headers = mapOf(
|
||||||
"X-CSRF-TOKEN" to token
|
"Accept" to "application/json, text/javascript, */*; q=0.01",
|
||||||
)
|
"Authorization" to "${auth.authHeader}",
|
||||||
cookies = req.cookies
|
"X-Requested-With" to "XMLHttpRequest",
|
||||||
res.select("select#changeServer option").apmap { source ->
|
"X-CSRF-TOKEN" to token
|
||||||
val server = source.attr("value")
|
)
|
||||||
val query = auth.serverUrl?.queryParameterNames
|
cookies = req.cookies
|
||||||
val link = "$data?${query?.first()}=${getMisc(auth.authUrl)}&${query?.last()}=$server"
|
res.select("select#changeServer option").apmap { source ->
|
||||||
if (server.contains(Regex("(?i)kuramadrive|archive"))) {
|
val server = source.attr("value")
|
||||||
invokeLocalSource(link, server, data, callback)
|
val query = auth.serverUrl?.queryParameterNames
|
||||||
} else {
|
val link = "$data?${query?.first()}=${getMisc(auth.authUrl)}&${query?.last()}=$server"
|
||||||
app.get(
|
if (server.contains(Regex("(?i)kuramadrive|archive"))) {
|
||||||
link,
|
invokeLocalSource(link, server, data, callback)
|
||||||
referer = data,
|
} else {
|
||||||
headers = headers,
|
app.get(
|
||||||
cookies = cookies
|
link,
|
||||||
).document.select("div.iframe-container iframe").attr("src").let { videoUrl ->
|
referer = data,
|
||||||
loadExtractor(fixUrl(videoUrl), "$mainUrl/", subtitleCallback, callback)
|
headers = headers,
|
||||||
|
cookies = cookies
|
||||||
|
).document.select("div.iframe-container iframe").attr("src").let { videoUrl ->
|
||||||
|
loadExtractor(fixUrl(videoUrl), "$mainUrl/", subtitleCallback, callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
res.select("div#animeDownloadLink a").apmap {
|
||||||
|
loadExtractor(it.attr("href"), "$mainUrl/", subtitleCallback, callback)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,5 +12,7 @@ class KuramanimeProviderPlugin: Plugin() {
|
||||||
registerMainAPI(KuramanimeProvider())
|
registerMainAPI(KuramanimeProvider())
|
||||||
registerExtractorAPI(Nyomo())
|
registerExtractorAPI(Nyomo())
|
||||||
registerExtractorAPI(Streamhide())
|
registerExtractorAPI(Streamhide())
|
||||||
|
registerExtractorAPI(Kuramadrive())
|
||||||
|
registerExtractorAPI(Lbx())
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue