mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
added KissasianMx & updated Oploverz domain
This commit is contained in:
parent
a0fa64bd7b
commit
a4bee8ffdf
7 changed files with 99 additions and 18 deletions
|
@ -1,5 +1,5 @@
|
||||||
// use an integer for version numbers
|
// use an integer for version numbers
|
||||||
version = 2
|
version = 3
|
||||||
|
|
||||||
|
|
||||||
cloudstream {
|
cloudstream {
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
package com.hexated
|
package com.hexated
|
||||||
|
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.extractors.Filesim
|
||||||
import com.lagradost.cloudstream3.extractors.helper.GogoHelper
|
import com.lagradost.cloudstream3.extractors.helper.GogoHelper
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.httpsify
|
import com.lagradost.cloudstream3.utils.httpsify
|
||||||
import com.lagradost.cloudstream3.utils.loadExtractor
|
import com.lagradost.cloudstream3.utils.loadExtractor
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
|
|
||||||
class Kissasian : MainAPI() {
|
open class Kissasian : MainAPI() {
|
||||||
override var mainUrl = "https://kissasian.pe"
|
override var mainUrl = "https://kissasian.pe"
|
||||||
override var name = "Kissasian"
|
override var name = "Kissasian"
|
||||||
override val hasMainPage = true
|
override val hasMainPage = true
|
||||||
|
@ -44,8 +45,7 @@ class Kissasian : MainAPI() {
|
||||||
private fun Element.toSearchResult(): SearchResponse? {
|
private fun Element.toSearchResult(): SearchResponse? {
|
||||||
val href = fixUrl(this.selectFirst("a")?.attr("href") ?: return null)
|
val href = fixUrl(this.selectFirst("a")?.attr("href") ?: return null)
|
||||||
val title = this.selectFirst("span.title")?.text()?.trim() ?: return null
|
val title = this.selectFirst("span.title")?.text()?.trim() ?: return null
|
||||||
val posterUrl = fixUrlNull(this.selectFirst("div.pic img")?.attr("src"))
|
val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src"))
|
||||||
|
|
||||||
return newTvSeriesSearchResponse(title, href, TvType.AsianDrama) {
|
return newTvSeriesSearchResponse(title, href, TvType.AsianDrama) {
|
||||||
this.posterUrl = posterUrl
|
this.posterUrl = posterUrl
|
||||||
}
|
}
|
||||||
|
@ -58,18 +58,19 @@ class Kissasian : MainAPI() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open val contentInfoClass = "barContentInfo"
|
||||||
override suspend fun load(url: String): LoadResponse? {
|
override suspend fun load(url: String): LoadResponse? {
|
||||||
val document = app.get(url).document
|
val document = app.get(url).document
|
||||||
|
|
||||||
val title = document.selectFirst("div.barContentInfo a")?.text()?.trim() ?: return null
|
val title = document.selectFirst("div.$contentInfoClass a")?.text()?.trim() ?: return null
|
||||||
val poster = fixUrlNull(document.selectFirst("div.barContentInfo img")?.attr("src"))
|
val poster = fixUrlNull(document.select("div.$contentInfoClass img").last()?.attr("src"))
|
||||||
val tags = document.select("div.barContentInfo p:contains(Genres:) a").map { it.text().removePrefix(",").trim() }
|
val tags = document.select("div.$contentInfoClass p:contains(Genres:) a").map { it.text().removePrefix(",").trim() }
|
||||||
|
|
||||||
val year = document.selectFirst("div.barContentInfo p.type.Releasea")?.text()?.trim()?.toIntOrNull()
|
val year = document.selectFirst("div.$contentInfoClass p.type.Releasea")?.text()?.trim()?.toIntOrNull()
|
||||||
val status = getStatus(document.selectFirst("div.barContentInfo p:contains(Status:)")?.ownText()?.trim())
|
val status = getStatus(document.selectFirst("div.$contentInfoClass p:contains(Status:)")?.ownText()?.trim())
|
||||||
val description = document.selectFirst("div.barContentInfo p.des")?.nextElementSiblings()?.select("p")?.text()
|
val description = document.selectFirst("div.$contentInfoClass p.des, div.$contentInfoClass p:last-child")?.nextElementSiblings()?.select("p")?.text()
|
||||||
|
|
||||||
val episodes = document.select("ul.listing li").map {
|
val episodes = document.select("ul.listing li, table.listing td.episodeSub").map {
|
||||||
val name = it.selectFirst("a")?.attr("title")
|
val name = it.selectFirst("a")?.attr("title")
|
||||||
val link = fixUrlNull(it.selectFirst("a")?.attr("href"))
|
val link = fixUrlNull(it.selectFirst("a")?.attr("href"))
|
||||||
val epNum = Regex("Episode\\s(\\d+)").find("$name")?.groupValues?.getOrNull(1)?.toIntOrNull()
|
val epNum = Regex("Episode\\s(\\d+)").find("$name")?.groupValues?.getOrNull(1)?.toIntOrNull()
|
||||||
|
@ -138,3 +139,8 @@ class Kissasian : MainAPI() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Kswplayer : Filesim() {
|
||||||
|
override val name = "Kswplayer"
|
||||||
|
override var mainUrl = "https://kswplayer.info"
|
||||||
|
}
|
||||||
|
|
58
Kissasian/src/main/kotlin/com/hexated/KissasianMx.kt
Normal file
58
Kissasian/src/main/kotlin/com/hexated/KissasianMx.kt
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
package com.hexated
|
||||||
|
|
||||||
|
import com.lagradost.cloudstream3.SearchResponse
|
||||||
|
import com.lagradost.cloudstream3.SubtitleFile
|
||||||
|
import com.lagradost.cloudstream3.TvType
|
||||||
|
import com.lagradost.cloudstream3.apmap
|
||||||
|
import com.lagradost.cloudstream3.app
|
||||||
|
import com.lagradost.cloudstream3.fixUrl
|
||||||
|
import com.lagradost.cloudstream3.mainPageOf
|
||||||
|
import com.lagradost.cloudstream3.newTvSeriesSearchResponse
|
||||||
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
|
import com.lagradost.cloudstream3.utils.loadExtractor
|
||||||
|
|
||||||
|
class KissasianMx : Kissasian() {
|
||||||
|
override var mainUrl = "https://kissasian.mx"
|
||||||
|
override var name = "KissasianMx"
|
||||||
|
override val contentInfoClass = "barContent"
|
||||||
|
override val mainPage = mainPageOf(
|
||||||
|
"Status/Ongoing?page=" to "Drama Ongoing",
|
||||||
|
"Status/Completed?page=" to "Drama Completed",
|
||||||
|
"Status/Completed?page=" to "Drama Completed",
|
||||||
|
"Genre/Romance?page=" to "Drama Romance",
|
||||||
|
"Genre/Reality-TV?page=" to "Reality-TV",
|
||||||
|
"Genre/Mystery?page=" to "Drama Mystery",
|
||||||
|
"Genre/Movie?page=" to "Movie",
|
||||||
|
)
|
||||||
|
|
||||||
|
override suspend fun search(query: String): List<SearchResponse> {
|
||||||
|
val document = app.post(
|
||||||
|
"$mainUrl/Search/SearchSuggest", data = mapOf(
|
||||||
|
"type" to "Drama",
|
||||||
|
"keyword" to query,
|
||||||
|
), headers = mapOf("X-Requested-With" to "XMLHttpRequest")
|
||||||
|
).document
|
||||||
|
return document.select("a").mapNotNull {
|
||||||
|
val href = fixUrl(it.attr("href"))
|
||||||
|
val title = it.text()
|
||||||
|
newTvSeriesSearchResponse(title, href, TvType.AsianDrama)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun loadLinks(
|
||||||
|
data: String,
|
||||||
|
isCasting: Boolean,
|
||||||
|
subtitleCallback: (SubtitleFile) -> Unit,
|
||||||
|
callback: (ExtractorLink) -> Unit
|
||||||
|
): Boolean {
|
||||||
|
|
||||||
|
val document = app.get(data).document
|
||||||
|
document.select("select#selectServer option").apmap {
|
||||||
|
val server = it.attr("value")
|
||||||
|
val iframe = app.get(fixUrl(server ?: return@apmap)).document.selectFirst("div#centerDivVideo iframe")?.attr("src")
|
||||||
|
loadExtractor(iframe ?: return@apmap, "$mainUrl/", subtitleCallback, callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,5 +10,7 @@ class KissasianPlugin: Plugin() {
|
||||||
override fun load(context: Context) {
|
override fun load(context: Context) {
|
||||||
// All providers should be added in this manner. Please don't edit the providers list directly.
|
// All providers should be added in this manner. Please don't edit the providers list directly.
|
||||||
registerMainAPI(Kissasian())
|
registerMainAPI(Kissasian())
|
||||||
|
registerMainAPI(KissasianMx())
|
||||||
|
registerExtractorAPI(Kswplayer())
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,6 +2,7 @@ package com.hexated
|
||||||
|
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.lagradost.nicehttp.NiceResponse
|
||||||
import com.lagradost.nicehttp.Requests
|
import com.lagradost.nicehttp.Requests
|
||||||
import com.lagradost.nicehttp.Session
|
import com.lagradost.nicehttp.Session
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
@ -169,7 +170,7 @@ class Nekopoi : MainAPI() {
|
||||||
link.name,
|
link.name,
|
||||||
link.url,
|
link.url,
|
||||||
link.referer,
|
link.referer,
|
||||||
if(link.isM3u8) link.quality else it.first,
|
if (link.isM3u8) link.quality else it.first,
|
||||||
link.isM3u8,
|
link.isM3u8,
|
||||||
link.headers,
|
link.headers,
|
||||||
link.extractorData
|
link.extractorData
|
||||||
|
@ -226,11 +227,24 @@ class Nekopoi : MainAPI() {
|
||||||
return res.headers["location"]
|
return res.headers["location"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun NiceResponse.selectMirror(): String? {
|
||||||
|
return this.document.selectFirst("script:containsData(#passcheck)")?.data()
|
||||||
|
?.substringAfter("\"GET\", \"")?.substringBefore("\"")
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun bypassMirrored(url: String?): List<String?> {
|
private suspend fun bypassMirrored(url: String?): List<String?> {
|
||||||
val request = session.get(url ?: return emptyList())
|
val request = session.get(url ?: return emptyList())
|
||||||
delay(2000)
|
delay(2000)
|
||||||
val nextUrl = request.text.substringAfter("\"GET\", \"").substringBefore("\"")
|
val mirrorUrl = request.selectMirror() ?: run {
|
||||||
return session.get(fixUrl(nextUrl, mirroredHost)).document.select("table.hoverable tbody tr")
|
val nextUrl = request.document.select("div.col-sm.centered.extra-top a").attr("href")
|
||||||
|
app.get(nextUrl).selectMirror()
|
||||||
|
}
|
||||||
|
return session.get(
|
||||||
|
fixUrl(
|
||||||
|
mirrorUrl ?: return emptyList(),
|
||||||
|
mirroredHost
|
||||||
|
)
|
||||||
|
).document.select("table.hoverable tbody tr")
|
||||||
.filter { mirror ->
|
.filter { mirror ->
|
||||||
!mirrorIsBlackList(mirror.selectFirst("img")?.attr("alt"))
|
!mirrorIsBlackList(mirror.selectFirst("img")?.attr("alt"))
|
||||||
}.apmap {
|
}.apmap {
|
||||||
|
@ -244,7 +258,7 @@ class Nekopoi : MainAPI() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun mirrorIsBlackList(host: String?) : Boolean {
|
private fun mirrorIsBlackList(host: String?): Boolean {
|
||||||
return mirrorBlackList.any { it.equals(host, true) }
|
return mirrorBlackList.any { it.equals(host, true) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,7 +282,8 @@ class Nekopoi : MainAPI() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getIndexQuality(str: String?): Int {
|
private fun getIndexQuality(str: String?): Int {
|
||||||
return when (val quality = Regex("""(?i)\[(\d+[pk])]""").find(str ?: "")?.groupValues?.getOrNull(1)?.lowercase()) {
|
return when (val quality =
|
||||||
|
Regex("""(?i)\[(\d+[pk])]""").find(str ?: "")?.groupValues?.getOrNull(1)?.lowercase()) {
|
||||||
"2k" -> Qualities.P1440.value
|
"2k" -> Qualities.P1440.value
|
||||||
else -> getQualityFromName(quality)
|
else -> getQualityFromName(quality)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// use an integer for version numbers
|
// use an integer for version numbers
|
||||||
version = 20
|
version = 21
|
||||||
|
|
||||||
|
|
||||||
cloudstream {
|
cloudstream {
|
||||||
|
|
|
@ -6,7 +6,7 @@ import com.lagradost.cloudstream3.utils.*
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
|
|
||||||
class OploverzProvider : MainAPI() {
|
class OploverzProvider : MainAPI() {
|
||||||
override var mainUrl = "https://oploverz.care"
|
override var mainUrl = "https://oploverz.team"
|
||||||
override var name = "Oploverz"
|
override var name = "Oploverz"
|
||||||
override val hasMainPage = true
|
override val hasMainPage = true
|
||||||
override var lang = "id"
|
override var lang = "id"
|
||||||
|
|
Loading…
Reference in a new issue