mirror of
https://github.com/recloudstream/cloudstream-extensions-multilingual.git
synced 2024-08-15 03:15:14 +00:00
Ported over all movie providers (some disabled)
This commit is contained in:
parent
c0509c5db9
commit
5c5a8d142f
283 changed files with 17532 additions and 76 deletions
22
EstrenosDoramasProvider/build.gradle.kts
Normal file
22
EstrenosDoramasProvider/build.gradle.kts
Normal file
|
@ -0,0 +1,22 @@
|
|||
// use an integer for version numbers
|
||||
version = 1
|
||||
|
||||
|
||||
cloudstream {
|
||||
// All of these properties are optional, you can safely remove them
|
||||
|
||||
// description = "Lorem Ipsum"
|
||||
// authors = listOf("Cloudburst")
|
||||
|
||||
/**
|
||||
* Status int as the following:
|
||||
* 0: Down
|
||||
* 1: Ok
|
||||
* 2: Slow
|
||||
* 3: Beta only
|
||||
* */
|
||||
status = 1 // will be 3 if unspecified
|
||||
|
||||
// Set to true to get an 18+ symbol next to the plugin
|
||||
adult = false // will be false if unspecified
|
||||
}
|
2
EstrenosDoramasProvider/src/main/AndroidManifest.xml
Normal file
2
EstrenosDoramasProvider/src/main/AndroidManifest.xml
Normal file
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest package="com.lagradost"/>
|
|
@ -0,0 +1,286 @@
|
|||
package com.lagradost
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.network.WebViewResolver
|
||||
import com.lagradost.cloudstream3.utils.*
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
|
||||
class EstrenosDoramasProvider : MainAPI() {
|
||||
companion object {
|
||||
fun getType(t: String): TvType {
|
||||
return if (t.contains("OVA") || t.contains("Especial")) TvType.OVA
|
||||
else if (t.contains("Pelicula")) TvType.Movie
|
||||
else TvType.TvSeries
|
||||
}
|
||||
}
|
||||
|
||||
override var mainUrl = "https://www23.estrenosdoramas.net"
|
||||
override var name = "EstrenosDoramas"
|
||||
override var lang = "es"
|
||||
override val hasMainPage = true
|
||||
override val hasChromecastSupport = true
|
||||
override val hasDownloadSupport = true
|
||||
override val supportedTypes = setOf(
|
||||
TvType.AsianDrama,
|
||||
)
|
||||
|
||||
override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse {
|
||||
val urls = listOf(
|
||||
Pair(mainUrl, "Últimas series"),
|
||||
Pair("$mainUrl/category/peliculas", "Películas"),
|
||||
)
|
||||
|
||||
val items = ArrayList<HomePageList>()
|
||||
|
||||
urls.apmap { (url, name) ->
|
||||
val home = app.get(url, timeout = 120).document.select("div.clearfix").map {
|
||||
val title = cleanTitle(it.selectFirst("h3 a")?.text()!!)
|
||||
val poster = it.selectFirst("img.cate_thumb")?.attr("src")
|
||||
AnimeSearchResponse(
|
||||
title,
|
||||
it.selectFirst("a")?.attr("href")!!,
|
||||
this.name,
|
||||
TvType.AsianDrama,
|
||||
poster,
|
||||
null,
|
||||
if (title.contains("Latino") || title.contains("Castellano")) EnumSet.of(
|
||||
DubStatus.Dubbed
|
||||
) else EnumSet.of(DubStatus.Subbed),
|
||||
)
|
||||
}
|
||||
items.add(HomePageList(name, home))
|
||||
}
|
||||
|
||||
if (items.size <= 0) throw ErrorLoadingException()
|
||||
return HomePageResponse(items)
|
||||
}
|
||||
|
||||
override suspend fun search(query: String): List<SearchResponse> {
|
||||
val searchob = ArrayList<AnimeSearchResponse>()
|
||||
val search =
|
||||
app.get("$mainUrl/?s=$query", timeout = 120).document.select("div.clearfix").map {
|
||||
val title = cleanTitle(it.selectFirst("h3 a")?.text()!!)
|
||||
val href = it.selectFirst("a")?.attr("href")
|
||||
val image = it.selectFirst("img.cate_thumb")?.attr("src")
|
||||
val lists =
|
||||
AnimeSearchResponse(
|
||||
title,
|
||||
href!!,
|
||||
this.name,
|
||||
TvType.AsianDrama,
|
||||
image,
|
||||
null,
|
||||
if (title.contains("Latino") || title.contains("Castellano")) EnumSet.of(
|
||||
DubStatus.Dubbed
|
||||
) else EnumSet.of(DubStatus.Subbed),
|
||||
)
|
||||
if (href.contains("capitulo")) {
|
||||
//nothing
|
||||
}
|
||||
else {
|
||||
searchob.add(lists)
|
||||
}
|
||||
}
|
||||
return searchob
|
||||
}
|
||||
|
||||
override suspend fun load(url: String): LoadResponse? {
|
||||
val doc = app.get(url, timeout = 120).document
|
||||
val poster = doc.selectFirst("head meta[property]")?.attr("content")
|
||||
val title = doc.selectFirst("h1.titulo")?.text()
|
||||
val description = try {
|
||||
doc.selectFirst("div.post div.highlight div.font")?.text()
|
||||
} catch (e:Exception){
|
||||
null
|
||||
}
|
||||
val finaldesc = description?.substringAfter("Sinopsis")?.replace(": ", "")?.trim()
|
||||
val epi = ArrayList<Episode>()
|
||||
val episodes = doc.select("div.post .lcp_catlist a").map {
|
||||
val name = it.selectFirst("a")?.text()
|
||||
val link = it.selectFirst("a")?.attr("href")
|
||||
val test = Episode(link!!, name)
|
||||
if (!link.equals(url)) {
|
||||
epi.add(test)
|
||||
}
|
||||
}.reversed()
|
||||
return when (val type = if (episodes.isEmpty()) TvType.Movie else TvType.AsianDrama) {
|
||||
TvType.AsianDrama -> {
|
||||
return newAnimeLoadResponse(title!!, url, type) {
|
||||
japName = null
|
||||
engName = title.replace(Regex("[Pp]elicula |[Pp]elicula"),"")
|
||||
posterUrl = poster
|
||||
addEpisodes(DubStatus.Subbed, epi.reversed())
|
||||
plot = finaldesc
|
||||
}
|
||||
}
|
||||
TvType.Movie -> {
|
||||
MovieLoadResponse(
|
||||
cleanTitle(title!!),
|
||||
url,
|
||||
this.name,
|
||||
TvType.Movie,
|
||||
url,
|
||||
poster,
|
||||
null,
|
||||
finaldesc,
|
||||
null,
|
||||
null,
|
||||
)
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
data class ReproDoramas (
|
||||
@JsonProperty("link") val link: String,
|
||||
@JsonProperty("time") val time: Int
|
||||
)
|
||||
|
||||
private fun cleanTitle(title: String): String = title.replace(Regex("[Pp]elicula |[Pp]elicula"),"")
|
||||
|
||||
private fun cleanExtractor(
|
||||
source: String,
|
||||
name: String,
|
||||
url: String,
|
||||
referer: String,
|
||||
m3u8: Boolean,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
): Boolean {
|
||||
callback(
|
||||
ExtractorLink(
|
||||
source,
|
||||
name,
|
||||
url,
|
||||
referer,
|
||||
Qualities.Unknown.value,
|
||||
m3u8
|
||||
)
|
||||
)
|
||||
return true
|
||||
}
|
||||
|
||||
override suspend fun loadLinks(
|
||||
data: String,
|
||||
isCasting: Boolean,
|
||||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
): Boolean {
|
||||
val headers = mapOf("Host" to "repro3.estrenosdoramas.us",
|
||||
"User-Agent" to USER_AGENT,
|
||||
"Accept" to "*/*",
|
||||
"Accept-Language" to "en-US,en;q=0.5",
|
||||
"Content-Type" to "application/x-www-form-urlencoded; charset=UTF-8",
|
||||
"X-Requested-With" to "XMLHttpRequest",
|
||||
"Origin" to "https://repro3.estrenosdoramas.us",
|
||||
"DNT" to "1",
|
||||
"Connection" to "keep-alive",
|
||||
"Sec-Fetch-Dest" to "empty",
|
||||
"Sec-Fetch-Mode" to "cors",
|
||||
"Sec-Fetch-Site" to "same-origin",
|
||||
"Cache-Control" to "max-age=0",)
|
||||
|
||||
val document = app.get(data).document
|
||||
document.select("div.tab_container iframe").apmap { container ->
|
||||
val directlink = fixUrl(container.attr("src"))
|
||||
loadExtractor(directlink, data, subtitleCallback, callback)
|
||||
|
||||
if (directlink.contains("/repro/amz/")) {
|
||||
val amzregex = Regex("https:\\/\\/repro3\\.estrenosdoramas\\.us\\/repro\\/amz\\/examples\\/.*\\.php\\?key=.*\$")
|
||||
amzregex.findAll(directlink).map {
|
||||
it.value.replace(Regex("https:\\/\\/repro3\\.estrenosdoramas\\.us\\/repro\\/amz\\/examples\\/.*\\.php\\?key="),"")
|
||||
}.toList().apmap { key ->
|
||||
val response = app.post("https://repro3.estrenosdoramas.us/repro/amz/examples/player/api/indexDCA.php",
|
||||
headers = headers,
|
||||
data = mapOf(
|
||||
Pair("key",key),
|
||||
Pair("token","MDAwMDAwMDAwMA=="),
|
||||
),
|
||||
allowRedirects = false
|
||||
).text
|
||||
val reprojson = parseJson<ReproDoramas>(response)
|
||||
val decodeurl = base64Decode(reprojson.link)
|
||||
if (decodeurl.contains("m3u8"))
|
||||
|
||||
cleanExtractor(
|
||||
name,
|
||||
name,
|
||||
decodeurl,
|
||||
"https://repro3.estrenosdoramas.us",
|
||||
decodeurl.contains(".m3u8"),
|
||||
callback
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (directlink.contains("reproducir14")) {
|
||||
val regex = Regex("(https:\\/\\/repro.\\.estrenosdoramas\\.us\\/repro\\/reproducir14\\.php\\?key=[a-zA-Z0-9]{0,8}[a-zA-Z0-9_-]+)")
|
||||
regex.findAll(directlink).map {
|
||||
it.value
|
||||
}.toList().apmap {
|
||||
val doc = app.get(it).text
|
||||
val videoid = doc.substringAfter("vid=\"").substringBefore("\" n")
|
||||
val token = doc.substringAfter("name=\"").substringBefore("\" s")
|
||||
val acctkn = doc.substringAfter("{ acc: \"").substringBefore("\", id:")
|
||||
val link = app.post("https://repro3.estrenosdoramas.us/repro/proto4.php",
|
||||
headers = headers,
|
||||
data = mapOf(
|
||||
Pair("acc",acctkn),
|
||||
Pair("id",videoid),
|
||||
Pair("tk",token)),
|
||||
allowRedirects = false
|
||||
).text
|
||||
val extracteklink = link.substringAfter("\"urlremoto\":\"").substringBefore("\"}")
|
||||
.replace("\\/", "/").replace("//ok.ru/","http://ok.ru/")
|
||||
loadExtractor(extracteklink, data, subtitleCallback, callback)
|
||||
}
|
||||
}
|
||||
|
||||
if (directlink.contains("reproducir120")) {
|
||||
val regex = Regex("(https:\\/\\/repro3.estrenosdoramas.us\\/repro\\/reproducir120\\.php\\?\\nkey=[a-zA-Z0-9]{0,8}[a-zA-Z0-9_-]+)")
|
||||
regex.findAll(directlink).map {
|
||||
it.value
|
||||
}.toList().apmap {
|
||||
val doc = app.get(it).text
|
||||
val videoid = doc.substringAfter("var videoid = '").substringBefore("';")
|
||||
val token = doc.substringAfter("var tokens = '").substringBefore("';")
|
||||
val acctkn = doc.substringAfter("{ acc: \"").substringBefore("\", id:")
|
||||
val link = app.post("https://repro3.estrenosdoramas.us/repro/api3.php",
|
||||
headers = headers,
|
||||
data = mapOf(
|
||||
Pair("acc",acctkn),
|
||||
Pair("id",videoid),
|
||||
Pair("tk",token)),
|
||||
allowRedirects = false
|
||||
).text
|
||||
val extractedlink = link.substringAfter("\"{file:'").substringBefore("',label:")
|
||||
.replace("\\/", "/")
|
||||
val quality = link.substringAfter(",label:'").substringBefore("',type:")
|
||||
val type = link.substringAfter("type: '").substringBefore("'}\"")
|
||||
if (extractedlink.isNotBlank())
|
||||
if (quality.contains("File not found", ignoreCase = true)) {
|
||||
//Nothing
|
||||
} else {
|
||||
cleanExtractor(
|
||||
"Movil",
|
||||
"Movil $quality",
|
||||
extractedlink,
|
||||
"",
|
||||
!type.contains("mp4"),
|
||||
callback
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
|
||||
package com.lagradost
|
||||
|
||||
import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
|
||||
import com.lagradost.cloudstream3.plugins.Plugin
|
||||
import android.content.Context
|
||||
|
||||
@CloudstreamPlugin
|
||||
class EstrenosDoramasProviderPlugin: Plugin() {
|
||||
override fun load(context: Context) {
|
||||
// All providers should be added in this manner. Please don't edit the providers list directly.
|
||||
registerMainAPI(EstrenosDoramasProvider())
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue