forked from recloudstream/cloudstream
Added home to Aniflix and new provider (#1229)
* Added home to Aniflix and new provider * changes * changes
This commit is contained in:
parent
d65291cac5
commit
2103d29052
4 changed files with 167 additions and 2 deletions
|
@ -97,6 +97,7 @@ object APIHolder {
|
||||||
RebahinProvider(),
|
RebahinProvider(),
|
||||||
LayarKacaProvider(),
|
LayarKacaProvider(),
|
||||||
HDTodayProvider(),
|
HDTodayProvider(),
|
||||||
|
OpenVidsProvider(),
|
||||||
|
|
||||||
// Metadata providers
|
// Metadata providers
|
||||||
//TmdbProvider(),
|
//TmdbProvider(),
|
||||||
|
|
|
@ -3,13 +3,15 @@ package com.lagradost.cloudstream3.animeproviders
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
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.utils.AppUtils.parseJson
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.getQualityFromName
|
import com.lagradost.cloudstream3.utils.getQualityFromName
|
||||||
|
import java.net.URLDecoder
|
||||||
|
|
||||||
class AniflixProvider : MainAPI() {
|
class AniflixProvider : MainAPI() {
|
||||||
override var mainUrl = "https://aniflix.pro"
|
override var mainUrl = "https://aniflix.pro"
|
||||||
override var name = "Aniflix"
|
override var name = "Aniflix"
|
||||||
override val hasMainPage = false
|
override val hasMainPage = true
|
||||||
|
|
||||||
override val supportedTypes = setOf(
|
override val supportedTypes = setOf(
|
||||||
TvType.AnimeMovie,
|
TvType.AnimeMovie,
|
||||||
|
@ -42,6 +44,33 @@ class AniflixProvider : MainAPI() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override suspend fun getMainPage(): HomePageResponse {
|
||||||
|
val items = ArrayList<HomePageList>()
|
||||||
|
val soup = app.get(mainUrl).document
|
||||||
|
val elements = listOf(
|
||||||
|
Pair("Trending Now", "div:nth-child(3) > div a"),
|
||||||
|
Pair("Popular", "div:nth-child(4) > div a"),
|
||||||
|
Pair("Top Rated", "div:nth-child(5) > div a"),
|
||||||
|
)
|
||||||
|
|
||||||
|
elements.map { (name, element) ->
|
||||||
|
val home = soup.select(element).map {
|
||||||
|
val href = it.attr("href")
|
||||||
|
val title = it.selectFirst("p.mt-2")!!.text()
|
||||||
|
val image = it.selectFirst("img.rounded-md[sizes]")!!.attr("src").replace("/_next/image?url=","")
|
||||||
|
.replace(Regex("\\&.*\$"),"")
|
||||||
|
val realposter = URLDecoder.decode(image, "UTF-8")
|
||||||
|
newAnimeSearchResponse(title, fixUrl(href)) {
|
||||||
|
this.posterUrl = realposter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
items.add(HomePageList(name, home))
|
||||||
|
}
|
||||||
|
|
||||||
|
return HomePageResponse(items)
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun search(query: String): List<SearchResponse>? {
|
override suspend fun search(query: String): List<SearchResponse>? {
|
||||||
val token = getToken()
|
val token = getToken()
|
||||||
val url = "$mainUrl/_next/data/$token/search.json?keyword=$query"
|
val url = "$mainUrl/_next/data/$token/search.json?keyword=$query"
|
||||||
|
@ -57,6 +86,7 @@ class AniflixProvider : MainAPI() {
|
||||||
|
|
||||||
override suspend fun load(url: String): LoadResponse {
|
override suspend fun load(url: String): LoadResponse {
|
||||||
val token = getToken()
|
val token = getToken()
|
||||||
|
|
||||||
val id = Regex("$mainUrl/anime/([0-9]*)").find(url)?.groupValues?.getOrNull(1)
|
val id = Regex("$mainUrl/anime/([0-9]*)").find(url)?.groupValues?.getOrNull(1)
|
||||||
?: throw ErrorLoadingException("Error parsing link for id")
|
?: throw ErrorLoadingException("Error parsing link for id")
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,134 @@
|
||||||
|
package com.lagradost.cloudstream3.movieproviders
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.animeproviders.GogoanimeProvider
|
||||||
|
import com.lagradost.cloudstream3.animeproviders.GogoanimeProvider.Companion.extractVidstream
|
||||||
|
import com.lagradost.cloudstream3.metaproviders.TmdbLink
|
||||||
|
import com.lagradost.cloudstream3.metaproviders.TmdbProvider
|
||||||
|
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
||||||
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
|
import com.lagradost.cloudstream3.utils.loadExtractor
|
||||||
|
import java.time.ZonedDateTime
|
||||||
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
|
class OpenVidsProvider:TmdbProvider() {
|
||||||
|
override val apiName = "OpenVids"
|
||||||
|
override var name = "OpenVids"
|
||||||
|
override var mainUrl = "https://openvids.io"
|
||||||
|
override val useMetaLoadResponse = true
|
||||||
|
override val instantLinkLoading = false
|
||||||
|
override val supportedTypes = setOf(
|
||||||
|
TvType.Movie,
|
||||||
|
TvType.TvSeries,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class OpenvidsMain(
|
||||||
|
@JsonProperty("ok" ) val ok : Boolean? = null,
|
||||||
|
@JsonProperty("servers" ) val servers : OpenvidServers? = OpenvidServers()
|
||||||
|
)
|
||||||
|
|
||||||
|
data class OpenvidServers (
|
||||||
|
@JsonProperty("streamsb" ) val streamsb : OpenvidServersData? = OpenvidServersData(),
|
||||||
|
@JsonProperty("voxzer" ) val voxzer : OpenvidServersData? = OpenvidServersData(),
|
||||||
|
@JsonProperty("mixdrop" ) val mixdrop : OpenvidServersData? = OpenvidServersData(),
|
||||||
|
@JsonProperty("doodstream" ) val doodstream : OpenvidServersData? = OpenvidServersData(),
|
||||||
|
@JsonProperty("voe" ) val voe : OpenvidServersData? = OpenvidServersData(),
|
||||||
|
@JsonProperty("vidcloud" ) val vidcloud : OpenvidServersData? = OpenvidServersData()
|
||||||
|
)
|
||||||
|
data class OpenvidServersData (
|
||||||
|
@JsonProperty("code" ) val code : String? = null,
|
||||||
|
@JsonProperty("updatedAt" ) val updatedAt : String? = null,
|
||||||
|
@JsonProperty("encoded" ) val encoded : Boolean? = null
|
||||||
|
)
|
||||||
|
|
||||||
|
override suspend fun loadLinks(
|
||||||
|
data: String,
|
||||||
|
isCasting: Boolean,
|
||||||
|
subtitleCallback: (SubtitleFile) -> Unit,
|
||||||
|
callback: (ExtractorLink) -> Unit
|
||||||
|
): Boolean {
|
||||||
|
val mappedData = parseJson<TmdbLink>(data)
|
||||||
|
val (id, site) = if (mappedData.imdbID != null) listOf(
|
||||||
|
mappedData.imdbID,
|
||||||
|
"imdb"
|
||||||
|
) else listOf(mappedData.tmdbID.toString(), "tmdb")
|
||||||
|
val isMovie = mappedData.episode == null && mappedData.season == null
|
||||||
|
val embedUrl = if (isMovie) {
|
||||||
|
if(site == "imdb") "$mainUrl/movie/$id" else
|
||||||
|
"$mainUrl/tmdb/movie/$id"
|
||||||
|
} else {
|
||||||
|
val suffix = "$id-${mappedData.season ?: 1}-${mappedData.episode ?: 1}"
|
||||||
|
if (site == "imdb") "$mainUrl/episode/$suffix" else
|
||||||
|
"$mainUrl/tmdb/episode/$suffix"
|
||||||
|
}
|
||||||
|
val zonedatetime = ZonedDateTime.now()
|
||||||
|
val timeformated = DateTimeFormatter.ISO_INSTANT.format(zonedatetime)
|
||||||
|
val headers = if (isMovie) {
|
||||||
|
mapOf(
|
||||||
|
"Host" to "openvids.io",
|
||||||
|
"User-Agent" to USER_AGENT,
|
||||||
|
"Accept" to "*/*",
|
||||||
|
"Accept-Language" to "en-US,en;q=0.5",
|
||||||
|
"Referer" to embedUrl,
|
||||||
|
"updatedAt" to timeformated,
|
||||||
|
"title" to "${mappedData.movieName}",
|
||||||
|
"year" to "2016",
|
||||||
|
"DNT" to "1",
|
||||||
|
"Alt-Used" to "openvids.io",
|
||||||
|
"Connection" to "keep-alive",
|
||||||
|
"Sec-Fetch-Dest" to "empty",
|
||||||
|
"Sec-Fetch-Mode" to "cors",
|
||||||
|
"Sec-Fetch-Site" to "same-origin",
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
mapOf(
|
||||||
|
"Host" to "openvids.io",
|
||||||
|
"User-Agent" to USER_AGENT,
|
||||||
|
"Accept" to "*/*",
|
||||||
|
"Accept-Language" to "en-US,en;q=0.5",
|
||||||
|
"Referer" to embedUrl,
|
||||||
|
"updatedAt" to timeformated,
|
||||||
|
"title" to "${mappedData.movieName} - season 1",
|
||||||
|
"year" to "2021",
|
||||||
|
"e" to "${mappedData.episode}",
|
||||||
|
"s" to "${mappedData.season}",
|
||||||
|
"DNT" to "1",
|
||||||
|
"Alt-Used" to "openvids.io",
|
||||||
|
"Connection" to "keep-alive",
|
||||||
|
"Sec-Fetch-Dest" to "empty",
|
||||||
|
"Sec-Fetch-Mode" to "cors",
|
||||||
|
"Sec-Fetch-Site" to "same-origin",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
val json = app.get("$mainUrl/api/servers.json?imdb=${mappedData.imdbID}", headers = headers).parsedSafe<OpenvidsMain>()
|
||||||
|
|
||||||
|
val listservers = listOf(
|
||||||
|
"https://streamsb.net/e/" to json?.servers?.streamsb?.code,
|
||||||
|
"https://player.voxzer.org/view/" to json?.servers?.voxzer?.code,
|
||||||
|
"https://mixdrop.co/e/" to json?.servers?.mixdrop?.code,
|
||||||
|
"https://dood.pm/e/" to json?.servers?.doodstream?.code,
|
||||||
|
"https://voe.sx/e/" to json?.servers?.voe?.code,
|
||||||
|
"https://membed.net/streaming.php?id=" to json?.servers?.vidcloud?.code
|
||||||
|
).mapNotNull { (url, id) -> if(id==null) return@mapNotNull null else "$url$id" }
|
||||||
|
|
||||||
|
if (json?.ok != true) return false
|
||||||
|
listservers.apmap { links ->
|
||||||
|
if (links.contains("membed")) {
|
||||||
|
val membed = VidEmbedProvider()
|
||||||
|
extractVidstream(
|
||||||
|
links,
|
||||||
|
this.name,
|
||||||
|
callback,
|
||||||
|
membed.iv,
|
||||||
|
membed.secretKey,
|
||||||
|
membed.secretDecryptKey,
|
||||||
|
membed.isUsingAdaptiveKeys,
|
||||||
|
membed.isUsingAdaptiveData)
|
||||||
|
} else
|
||||||
|
loadExtractor(links, data, callback)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -74,7 +74,7 @@
|
||||||
"ApiMDBProvider": {
|
"ApiMDBProvider": {
|
||||||
"language": "en",
|
"language": "en",
|
||||||
"name": "ApiMDB",
|
"name": "ApiMDB",
|
||||||
"status": 1,
|
"status": 0,
|
||||||
"url": "https://v2.apimdb.net"
|
"url": "https://v2.apimdb.net"
|
||||||
},
|
},
|
||||||
"AsiaFlixProvider": {
|
"AsiaFlixProvider": {
|
||||||
|
|
Loading…
Reference in a new issue