forked from recloudstream/cloudstream
ApiMDB and extractor (#783)
This commit is contained in:
parent
9eec4df8ba
commit
36700b90f7
4 changed files with 100 additions and 0 deletions
|
@ -57,6 +57,7 @@ object APIHolder {
|
||||||
VMoveeProvider(),
|
VMoveeProvider(),
|
||||||
WatchCartoonOnlineProvider(),
|
WatchCartoonOnlineProvider(),
|
||||||
AllMoviesForYouProvider(),
|
AllMoviesForYouProvider(),
|
||||||
|
ApiMDBProvider(),
|
||||||
|
|
||||||
MonoschinosProvider(),
|
MonoschinosProvider(),
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import com.lagradost.cloudstream3.apmap
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.lagradost.cloudstream3.app
|
||||||
|
|
||||||
|
|
||||||
|
open class PlayerVoxzer : ExtractorApi() {
|
||||||
|
override val name = "Voxzer"
|
||||||
|
override val mainUrl = "https://player.voxzer.org"
|
||||||
|
override val requiresReferer = false
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
|
||||||
|
val listurl = url.replace("/view/","/list/")
|
||||||
|
val urltext = app.get(listurl, referer = url).text
|
||||||
|
val m3u8regex = Regex("((https:|http:)\\/\\/.*\\.m3u8)")
|
||||||
|
val sources = mutableListOf<ExtractorLink>()
|
||||||
|
val listm3 = m3u8regex.find(urltext)?.value
|
||||||
|
if (listm3?.contains("m3u8") == true) M3u8Helper().m3u8Generation(
|
||||||
|
M3u8Helper.M3u8Stream(
|
||||||
|
listm3,
|
||||||
|
headers = app.get(url).headers.toMap()
|
||||||
|
), true
|
||||||
|
)
|
||||||
|
.map { stream ->
|
||||||
|
val qualityString = if ((stream.quality ?: 0) == 0) "" else "${stream.quality}p"
|
||||||
|
sources.add( ExtractorLink(
|
||||||
|
name,
|
||||||
|
"$name $qualityString",
|
||||||
|
stream.streamUrl,
|
||||||
|
url,
|
||||||
|
getQualityFromName(stream.quality.toString()),
|
||||||
|
true
|
||||||
|
))
|
||||||
|
}
|
||||||
|
return sources
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package com.lagradost.cloudstream3.movieproviders
|
||||||
|
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.extractors.Vidstream
|
||||||
|
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
|
||||||
|
|
||||||
|
class ApiMDBProvider : TmdbProvider() {
|
||||||
|
override val apiName = "ApiMDB"
|
||||||
|
override val name = "ApiMDB"
|
||||||
|
override val mainUrl = "https://v2.apimdb.net"
|
||||||
|
override val useMetaLoadResponse = true
|
||||||
|
override val instantLinkLoading = false
|
||||||
|
override val supportedTypes = setOf(
|
||||||
|
TvType.Movie,
|
||||||
|
TvType.TvSeries,
|
||||||
|
)
|
||||||
|
|
||||||
|
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/e/movie/$id" else
|
||||||
|
"$mainUrl/e/tmdb/movie/$id"
|
||||||
|
} else {
|
||||||
|
val suffix = "$id/${mappedData.season ?: 1}/${mappedData.episode ?: 1}"
|
||||||
|
if (site == "imdb") "$mainUrl/e/tv/$suffix" else
|
||||||
|
"$mainUrl/e/tmdb/tv/$suffix"
|
||||||
|
}
|
||||||
|
val document = app.get(embedUrl, referer = mainUrl).document
|
||||||
|
val servers = document.select(".servers-list div.server").map { it.attr("data-src") }
|
||||||
|
servers.apmap { serverID ->
|
||||||
|
val serverdoc = app.get("$mainUrl$serverID", referer = embedUrl).document
|
||||||
|
serverdoc.select("html body iframe").map {
|
||||||
|
val link = it.attr("src")
|
||||||
|
.replace("https://vidembed.cc/load.php","https://vidembed.io/streaming.php")
|
||||||
|
.replace(Regex("(https://cloudemb\\.com/play/.*\\?auto=1&referer=)"),"")
|
||||||
|
if (link.contains("vidembed", ignoreCase = true)) {
|
||||||
|
val vidstreamid = link.substringAfter("https://vidembed.io/streaming.php?id=")
|
||||||
|
val vidstreamObject = Vidstream("https://vidembed.io")
|
||||||
|
vidstreamObject.getUrl(vidstreamid, isCasting, callback)
|
||||||
|
} else
|
||||||
|
loadExtractor(link, embedUrl, callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
|
@ -150,6 +150,7 @@ val extractorApis: Array<ExtractorApi> = arrayOf(
|
||||||
// SBPlay1(),
|
// SBPlay1(),
|
||||||
// SBPlay2(),
|
// SBPlay2(),
|
||||||
|
|
||||||
|
PlayerVoxzer(),
|
||||||
)
|
)
|
||||||
|
|
||||||
fun getExtractorApiFromName(name: String): ExtractorApi {
|
fun getExtractorApiFromName(name: String): ExtractorApi {
|
||||||
|
|
Loading…
Reference in a new issue