mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Extractor: added some extractors (#833)
* Extractor: added some extractors * Extractor: fix same import * Extractor: PeaceMakerst fix * Extractor: source fix
This commit is contained in:
parent
4c2ee28d5a
commit
2cfdab5498
18 changed files with 800 additions and 97 deletions
|
@ -0,0 +1,54 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
|
||||||
|
open class ContentX : ExtractorApi() {
|
||||||
|
override val name = "ContentX"
|
||||||
|
override val mainUrl = "https://contentx.me"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
Log.d("Kekik_${this.name}", "url » ${url}")
|
||||||
|
|
||||||
|
val i_source = app.get(url, referer=ext_ref).text
|
||||||
|
val i_extract = Regex("""window\.openPlayer\('([^']+)'""").find(i_source)!!.groups[1]?.value ?: throw ErrorLoadingException("i_extract is null")
|
||||||
|
|
||||||
|
val vid_source = app.get("https://contentx.me/source2.php?v=${i_extract}", referer=ext_ref).text
|
||||||
|
val vid_extract = Regex("""file\":\"([^\"]+)""").find(vid_source)!!.groups[1]?.value ?: throw ErrorLoadingException("vid_extract is null")
|
||||||
|
val m3u_link = vid_extract.replace("\\", "")
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = m3u_link,
|
||||||
|
referer = url,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
isM3u8 = true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val i_dublaj = Regex(""",\"([^']+)\",\"Türkçe""").find(i_source)!!.groups[1]?.value
|
||||||
|
if (i_dublaj != null) {
|
||||||
|
val dublaj_source = app.get("https://contentx.me/source2.php?v=${i_dublaj}", referer=ext_ref).text
|
||||||
|
val dublaj_extract = Regex("""file\":\"([^\"]+)""").find(dublaj_source)!!.groups[1]?.value ?: throw ErrorLoadingException("dublaj_extract is null")
|
||||||
|
val dublaj_link = dublaj_extract.replace("\\", "")
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = "${this.name} Türkçe Dublaj",
|
||||||
|
name = "${this.name} Türkçe Dublaj",
|
||||||
|
url = dublaj_link,
|
||||||
|
referer = url,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
isM3u8 = true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.lagradost.cloudstream3.extractors.helper.AesHelper
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||||
|
import com.fasterxml.jackson.module.kotlin.readValue
|
||||||
|
|
||||||
|
open class HDMomPlayer : ExtractorApi() {
|
||||||
|
override val name = "HDMomPlayer"
|
||||||
|
override val mainUrl = "https://hdmomplayer.com"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val m3u_link:String?
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
val i_source = app.get(url, referer=ext_ref).text
|
||||||
|
|
||||||
|
val bePlayer = Regex("""bePlayer\('([^']+)',\s*'(\{[^\}]+\})'\);""").find(i_source)?.groupValues
|
||||||
|
if (bePlayer != null) {
|
||||||
|
val bePlayerPass = bePlayer.get(1)
|
||||||
|
val bePlayerData = bePlayer.get(2)
|
||||||
|
val encrypted = AesHelper.cryptoAESHandler(bePlayerData, bePlayerPass.toByteArray(), false)?.replace("\\", "") ?: throw ErrorLoadingException("failed to decrypt")
|
||||||
|
Log.d("Kekik_${this.name}", "encrypted » ${encrypted}")
|
||||||
|
|
||||||
|
m3u_link = Regex("""video_location\":\"([^\"]+)""").find(encrypted)?.groupValues?.get(1)
|
||||||
|
} else {
|
||||||
|
m3u_link = Regex("""file:\"([^\"]+)""").find(i_source)?.groupValues?.get(1)
|
||||||
|
|
||||||
|
val track_str = Regex("""tracks:\[([^\]]+)""").find(i_source)?.groupValues?.get(1)
|
||||||
|
if (track_str != null) {
|
||||||
|
val tracks:List<Track> = jacksonObjectMapper().readValue("[${track_str}]")
|
||||||
|
|
||||||
|
for (track in tracks) {
|
||||||
|
if (track.file == null || track.label == null) continue
|
||||||
|
if (track.label.contains("Forced")) continue
|
||||||
|
|
||||||
|
subtitleCallback.invoke(
|
||||||
|
SubtitleFile(
|
||||||
|
lang = track.label,
|
||||||
|
url = fixUrl(mainUrl + track.file)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = m3u_link ?: throw ErrorLoadingException("m3u link not found"),
|
||||||
|
referer = url,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
isM3u8 = true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
data class Track(
|
||||||
|
@JsonProperty("file") val file: String?,
|
||||||
|
@JsonProperty("label") val label: String?,
|
||||||
|
@JsonProperty("kind") val kind: String?,
|
||||||
|
@JsonProperty("language") val language: String?,
|
||||||
|
@JsonProperty("default") val default: String?
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
|
||||||
|
open class HDPlayerSystem : ExtractorApi() {
|
||||||
|
override val name = "HDPlayerSystem"
|
||||||
|
override val mainUrl = "https://hdplayersystem.live"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
val vid_id = if (url.contains("video/")) {
|
||||||
|
url.substringAfter("video/")
|
||||||
|
} else {
|
||||||
|
url.substringAfter("?data=")
|
||||||
|
}
|
||||||
|
val post_url = "${mainUrl}/player/index.php?data=${vid_id}&do=getVideo"
|
||||||
|
Log.d("Kekik_${this.name}", "post_url » ${post_url}")
|
||||||
|
|
||||||
|
val response = app.post(
|
||||||
|
post_url,
|
||||||
|
data = mapOf(
|
||||||
|
"hash" to vid_id,
|
||||||
|
"r" to ext_ref
|
||||||
|
),
|
||||||
|
referer = ext_ref,
|
||||||
|
headers = mapOf(
|
||||||
|
"Content-Type" to "application/x-www-form-urlencoded; charset=UTF-8",
|
||||||
|
"X-Requested-With" to "XMLHttpRequest"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val video_response = response.parsedSafe<SystemResponse>() ?: throw ErrorLoadingException("failed to parse response")
|
||||||
|
val m3u_link = video_response.securedLink
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = m3u_link,
|
||||||
|
referer = ext_ref,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
type = INFER_TYPE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
data class SystemResponse(
|
||||||
|
@JsonProperty("hls") val hls: String,
|
||||||
|
@JsonProperty("videoImage") val videoImage: String? = null,
|
||||||
|
@JsonProperty("videoSource") val videoSource: String,
|
||||||
|
@JsonProperty("securedLink") val securedLink: String
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
class HDStreamAble : PeaceMakerst() {
|
||||||
|
override var name = "HDStreamAble"
|
||||||
|
override var mainUrl = "https://hdstreamable.com"
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
class Hotlinger : ContentX() {
|
||||||
|
override var name = "Hotlinger"
|
||||||
|
override var mainUrl = "https://hotlinger.com"
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
|
||||||
|
open class MailRu : ExtractorApi() {
|
||||||
|
override val name = "MailRu"
|
||||||
|
override val mainUrl = "https://my.mail.ru"
|
||||||
|
override val requiresReferer = false
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
Log.d("Kekik_${this.name}", "url » ${url}")
|
||||||
|
|
||||||
|
val vid_id = url.substringAfter("video/embed/").trim()
|
||||||
|
val video_req = app.get("${mainUrl}/+/video/meta/${vid_id}", referer=url)
|
||||||
|
val video_key = video_req.cookies["video_key"].toString()
|
||||||
|
Log.d("Kekik_${this.name}", "video_key » ${video_key}")
|
||||||
|
|
||||||
|
val video_data = AppUtils.tryParseJson<MailRuData>(video_req.text) ?: throw ErrorLoadingException("Video not found")
|
||||||
|
|
||||||
|
for (video in video_data.videos) {
|
||||||
|
Log.d("Kekik_${this.name}", "video » ${video}")
|
||||||
|
|
||||||
|
val video_url = if (video.url.startsWith("//")) "https:${video.url}" else video.url
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = video_url,
|
||||||
|
referer = url,
|
||||||
|
headers = mapOf("Cookie" to "video_key=${video_key}"),
|
||||||
|
quality = getQualityFromName(video.key),
|
||||||
|
isM3u8 = false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class MailRuData(
|
||||||
|
@JsonProperty("provider") val provider: String,
|
||||||
|
@JsonProperty("videos") val videos: List<MailRuVideoData>
|
||||||
|
)
|
||||||
|
|
||||||
|
data class MailRuVideoData(
|
||||||
|
@JsonProperty("url") val url: String,
|
||||||
|
@JsonProperty("key") val key: String
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
|
||||||
|
open class Odnoklassniki : ExtractorApi() {
|
||||||
|
override val name = "Odnoklassniki"
|
||||||
|
override val mainUrl = "https://odnoklassniki.ru"
|
||||||
|
override val requiresReferer = false
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
Log.d("Kekik_${this.name}", "url » ${url}")
|
||||||
|
|
||||||
|
val user_agent = mapOf("User-Agent" to "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36")
|
||||||
|
|
||||||
|
val video_req = app.get(url, headers=user_agent).text.replace("\\"", "\"").replace("\\\\", "\\")
|
||||||
|
.replace(Regex("\\\\u([0-9A-Fa-f]{4})")) { matchResult ->
|
||||||
|
Integer.parseInt(matchResult.groupValues[1], 16).toChar().toString()
|
||||||
|
}
|
||||||
|
val videos_str = Regex("""\"videos\":(\[[^\]]*\])""").find(video_req)?.groupValues?.get(1) ?: throw ErrorLoadingException("Video not found")
|
||||||
|
val videos = AppUtils.tryParseJson<List<OkRuVideo>>(videos_str) ?: throw ErrorLoadingException("Video not found")
|
||||||
|
|
||||||
|
for (video in videos) {
|
||||||
|
Log.d("Kekik_${this.name}", "video » ${video}")
|
||||||
|
|
||||||
|
val video_url = if (video.url.startsWith("//")) "https:${video.url}" else video.url
|
||||||
|
|
||||||
|
val quality = video.name.uppercase()
|
||||||
|
.replace("MOBILE", "144p")
|
||||||
|
.replace("LOWEST", "240p")
|
||||||
|
.replace("LOW", "360p")
|
||||||
|
.replace("SD", "480p")
|
||||||
|
.replace("HD", "720p")
|
||||||
|
.replace("FULL", "1080p")
|
||||||
|
.replace("QUAD", "1440p")
|
||||||
|
.replace("ULTRA", "4k")
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = video_url,
|
||||||
|
referer = url,
|
||||||
|
quality = getQualityFromName(quality),
|
||||||
|
headers = user_agent,
|
||||||
|
isM3u8 = false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class OkRuVideo(
|
||||||
|
@JsonProperty("name") val name: String,
|
||||||
|
@JsonProperty("url") val url: String,
|
||||||
|
)
|
||||||
|
}
|
|
@ -1,67 +1,13 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
package com.lagradost.cloudstream3.extractors
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
class OkRuSSL : Odnoklassniki() {
|
||||||
import com.lagradost.cloudstream3.utils.*
|
override var name = "OkRuSSL"
|
||||||
import com.lagradost.cloudstream3.app
|
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
|
||||||
|
|
||||||
data class DataOptionsJson (
|
|
||||||
@JsonProperty("flashvars") var flashvars : Flashvars? = Flashvars(),
|
|
||||||
)
|
|
||||||
data class Flashvars (
|
|
||||||
@JsonProperty("metadata") var metadata : String? = null,
|
|
||||||
@JsonProperty("hlsManifestUrl") var hlsManifestUrl : String? = null, //m3u8
|
|
||||||
)
|
|
||||||
|
|
||||||
data class MetadataOkru (
|
|
||||||
@JsonProperty("videos") var videos: ArrayList<Videos> = arrayListOf(),
|
|
||||||
)
|
|
||||||
|
|
||||||
data class Videos (
|
|
||||||
@JsonProperty("name") var name : String,
|
|
||||||
@JsonProperty("url") var url : String,
|
|
||||||
@JsonProperty("seekSchema") var seekSchema : Int? = null,
|
|
||||||
@JsonProperty("disallowed") var disallowed : Boolean? = null
|
|
||||||
)
|
|
||||||
|
|
||||||
class OkRuHttps: OkRu(){
|
|
||||||
override var mainUrl = "https://ok.ru"
|
override var mainUrl = "https://ok.ru"
|
||||||
}
|
}
|
||||||
|
|
||||||
open class OkRu : ExtractorApi() {
|
class OkRuHTTP : Odnoklassniki() {
|
||||||
override var name = "Okru"
|
override var name = "OkRuHTTP"
|
||||||
override var mainUrl = "http://ok.ru"
|
override var mainUrl = "http://ok.ru"
|
||||||
override val requiresReferer = false
|
|
||||||
|
|
||||||
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
|
|
||||||
val doc = app.get(url).document
|
|
||||||
val sources = ArrayList<ExtractorLink>()
|
|
||||||
val datajson = doc.select("div[data-options]").attr("data-options")
|
|
||||||
if (datajson.isNotBlank()) {
|
|
||||||
val main = parseJson<DataOptionsJson>(datajson)
|
|
||||||
val metadatajson = parseJson<MetadataOkru>(main.flashvars?.metadata!!)
|
|
||||||
val servers = metadatajson.videos
|
|
||||||
servers.forEach {
|
|
||||||
val quality = it.name.uppercase()
|
|
||||||
.replace("MOBILE","144p")
|
|
||||||
.replace("LOWEST","240p")
|
|
||||||
.replace("LOW","360p")
|
|
||||||
.replace("SD","480p")
|
|
||||||
.replace("HD","720p")
|
|
||||||
.replace("FULL","1080p")
|
|
||||||
.replace("QUAD","1440p")
|
|
||||||
.replace("ULTRA","4k")
|
|
||||||
val extractedurl = it.url.replace("\\\\u0026", "&")
|
|
||||||
sources.add(ExtractorLink(
|
|
||||||
name,
|
|
||||||
name = this.name,
|
|
||||||
extractedurl,
|
|
||||||
url,
|
|
||||||
getQualityFromName(quality),
|
|
||||||
isM3u8 = false
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sources
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
|
||||||
|
open class PeaceMakerst : ExtractorApi() {
|
||||||
|
override val name = "PeaceMakerst"
|
||||||
|
override val mainUrl = "https://peacemakerst.com"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val m3u_link:String?
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
val post_url = "${url}?do=getVideo"
|
||||||
|
Log.d("Kekik_${this.name}", "post_url » ${post_url}")
|
||||||
|
|
||||||
|
val response = app.post(
|
||||||
|
post_url,
|
||||||
|
data = mapOf(
|
||||||
|
"hash" to url.substringAfter("video/"),
|
||||||
|
"r" to ext_ref,
|
||||||
|
"s" to ""
|
||||||
|
),
|
||||||
|
referer = ext_ref,
|
||||||
|
headers = mapOf(
|
||||||
|
"Content-Type" to "application/x-www-form-urlencoded; charset=UTF-8",
|
||||||
|
"X-Requested-With" to "XMLHttpRequest"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if (response.text.contains("teve2.com.tr\\/embed\\/")) {
|
||||||
|
val teve2_id = response.text.substringAfter("teve2.com.tr\\/embed\\/").substringBefore("\"")
|
||||||
|
val teve2_response = app.get(
|
||||||
|
"https://www.teve2.com.tr/action/media/${teve2_id}",
|
||||||
|
referer = "https://www.teve2.com.tr/embed/${teve2_id}"
|
||||||
|
).parsedSafe<Teve2ApiResponse>() ?: throw ErrorLoadingException("teve2 response is null")
|
||||||
|
|
||||||
|
m3u_link = teve2_response.media.link.serviceUrl + "//" + teve2_response.media.link.securePath
|
||||||
|
} else {
|
||||||
|
val video_response = response.parsedSafe<PeaceResponse>() ?: throw ErrorLoadingException("peace response is null")
|
||||||
|
val video_sources = video_response.videoSources
|
||||||
|
if (video_sources.isNotEmpty()) {
|
||||||
|
m3u_link = video_sources.lastOrNull()?.file
|
||||||
|
} else {
|
||||||
|
m3u_link = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = m3u_link ?: throw ErrorLoadingException("m3u link not found"),
|
||||||
|
referer = ext_ref,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
type = INFER_TYPE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
data class PeaceResponse(
|
||||||
|
@JsonProperty("videoImage") val videoImage: String?,
|
||||||
|
@JsonProperty("videoSources") val videoSources: List<VideoSource>,
|
||||||
|
@JsonProperty("sIndex") val sIndex: String,
|
||||||
|
@JsonProperty("sourceList") val sourceList: Map<String, String>
|
||||||
|
)
|
||||||
|
|
||||||
|
data class VideoSource(
|
||||||
|
@JsonProperty("file") val file: String,
|
||||||
|
@JsonProperty("label") val label: String,
|
||||||
|
@JsonProperty("type") val type: String
|
||||||
|
)
|
||||||
|
|
||||||
|
data class Teve2ApiResponse(
|
||||||
|
@JsonProperty("Media") val media: Teve2Media
|
||||||
|
)
|
||||||
|
|
||||||
|
data class Teve2Media(
|
||||||
|
@JsonProperty("Link") val link: Teve2Link
|
||||||
|
)
|
||||||
|
|
||||||
|
data class Teve2Link(
|
||||||
|
@JsonProperty("ServiceUrl") val serviceUrl: String,
|
||||||
|
@JsonProperty("SecurePath") val securePath: String
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
|
||||||
|
open class PixelDrain : ExtractorApi() {
|
||||||
|
override val name = "PixelDrain"
|
||||||
|
override val mainUrl = "https://pixeldrain.com"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
val pixel_id = Regex("""([^\/]+)(?=\?download)""").find(url)?.groupValues?.get(1)
|
||||||
|
val downloadLink = "${mainUrl}/api/file/${pixel_id}?download"
|
||||||
|
Log.d("Kekik_${this.name}", "downloadLink » ${downloadLink}")
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = "pixeldrain - ${pixel_id}",
|
||||||
|
name = "pixeldrain - ${pixel_id}",
|
||||||
|
url = downloadLink,
|
||||||
|
referer = "${mainUrl}/u/${pixel_id}?download",
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
type = INFER_TYPE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,30 +0,0 @@
|
||||||
package com.lagradost.cloudstream3.extractors
|
|
||||||
|
|
||||||
import com.lagradost.cloudstream3.SubtitleFile
|
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorApi
|
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
|
||||||
import com.lagradost.cloudstream3.utils.Qualities
|
|
||||||
|
|
||||||
open class Pixeldrain : ExtractorApi() {
|
|
||||||
override val name = "Pixeldrain"
|
|
||||||
override val mainUrl = "https://pixeldrain.com"
|
|
||||||
override val requiresReferer = false
|
|
||||||
override suspend fun getUrl(
|
|
||||||
url: String,
|
|
||||||
referer: String?,
|
|
||||||
subtitleCallback: (SubtitleFile) -> Unit,
|
|
||||||
callback: (ExtractorLink) -> Unit
|
|
||||||
) {
|
|
||||||
val mId = Regex("/([ul]/[\\da-zA-Z\\-]+)").find(url)?.groupValues?.get(1)?.split("/")
|
|
||||||
callback.invoke(
|
|
||||||
ExtractorLink(
|
|
||||||
this.name,
|
|
||||||
this.name,
|
|
||||||
"$mainUrl/api/file/${mId?.last() ?: return}?download",
|
|
||||||
url,
|
|
||||||
Qualities.Unknown.value,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
|
||||||
|
open class RapidVid : ExtractorApi() {
|
||||||
|
override val name = "RapidVid"
|
||||||
|
override val mainUrl = "https://rapidvid.net"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
val video_req = app.get(url, referer=ext_ref).text
|
||||||
|
|
||||||
|
val sub_urls = mutableSetOf<String>()
|
||||||
|
Regex("""captions\",\"file\":\"([^\"]+)\",\"label\":\"([^\"]+)\"""").findAll(video_req).forEach {
|
||||||
|
val (sub_url, sub_lang) = it.destructured
|
||||||
|
|
||||||
|
if (sub_url in sub_urls) { return@forEach }
|
||||||
|
sub_urls.add(sub_url)
|
||||||
|
|
||||||
|
subtitleCallback.invoke(
|
||||||
|
SubtitleFile(
|
||||||
|
lang = sub_lang.replace("\\u0131", "ı").replace("\\u0130", "İ").replace("\\u00fc", "ü").replace("\\u00e7", "ç"),
|
||||||
|
url = fixUrl(sub_url.replace("\\", ""))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val extracted_value = Regex("""file": "(.*)",""").find(video_req)?.groupValues?.get(1) ?: throw ErrorLoadingException("File not found")
|
||||||
|
|
||||||
|
val bytes = extracted_value.split("\\x").filter { it.isNotEmpty() }.map { it.toInt(16).toByte() }.toByteArray()
|
||||||
|
val decoded = String(bytes, Charsets.UTF_8)
|
||||||
|
Log.d("Kekik_${this.name}", "decoded » ${decoded}")
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = decoded,
|
||||||
|
referer = ext_ref,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
isM3u8 = true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
|
||||||
|
open class SibNet : ExtractorApi() {
|
||||||
|
override val name = "SibNet"
|
||||||
|
override val mainUrl = "https://video.sibnet.ru"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
val i_source = app.get(url, referer=ext_ref).text
|
||||||
|
var m3u_link = Regex("""player.src\(\[\{src: \"([^\"]+)""").find(i_source)?.groupValues?.get(1) ?: throw ErrorLoadingException("m3u link not found")
|
||||||
|
|
||||||
|
m3u_link = "${mainUrl}${m3u_link}"
|
||||||
|
Log.d("Kekik_${this.name}", "m3u_link » ${m3u_link}")
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = m3u_link,
|
||||||
|
referer = url,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
type = INFER_TYPE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
|
||||||
|
open class TRsTX : ExtractorApi() {
|
||||||
|
override val name = "TRsTX"
|
||||||
|
override val mainUrl = "https://trstx.org"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
|
||||||
|
val video_req = app.get(url, referer=ext_ref).text
|
||||||
|
|
||||||
|
val file = Regex("""file\":\"([^\"]+)""").find(video_req)?.groupValues?.get(1) ?: throw ErrorLoadingException("File not found")
|
||||||
|
val postLink = "${mainUrl}/" + file.replace("\\", "")
|
||||||
|
val rawList = app.post(postLink, referer=ext_ref).parsedSafe<List<Any>>() ?: throw ErrorLoadingException("Post link not found")
|
||||||
|
|
||||||
|
val postJson: List<TrstxVideoData> = rawList.drop(1).map { item ->
|
||||||
|
val mapItem = item as Map<*, *>
|
||||||
|
TrstxVideoData(
|
||||||
|
title = mapItem["title"] as? String,
|
||||||
|
file = mapItem["file"] as? String
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Log.d("Kekik_${this.name}", "postJson » ${postJson}")
|
||||||
|
|
||||||
|
val vid_links = mutableSetOf<String>()
|
||||||
|
val vid_map = mutableListOf<Map<String, String>>()
|
||||||
|
for (item in postJson) {
|
||||||
|
if (item.file == null || item.title == null) continue
|
||||||
|
|
||||||
|
val fileUrl = "${mainUrl}/playlist/" + item.file.substring(1) + ".txt"
|
||||||
|
val videoData = app.post(fileUrl, referer=ext_ref).text
|
||||||
|
|
||||||
|
if (videoData in vid_links) { continue }
|
||||||
|
vid_links.add(videoData)
|
||||||
|
|
||||||
|
vid_map.add(mapOf(
|
||||||
|
"title" to item.title,
|
||||||
|
"videoData" to videoData
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (mapEntry in vid_map) {
|
||||||
|
Log.d("Kekik_${this.name}", "mapEntry » ${mapEntry}")
|
||||||
|
val title = mapEntry["title"] ?: continue
|
||||||
|
val m3u_link = mapEntry["videoData"] ?: continue
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = "${this.name} - ${title}",
|
||||||
|
url = m3u_link,
|
||||||
|
referer = ext_ref,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
type = INFER_TYPE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class TrstxVideoData(
|
||||||
|
@JsonProperty("title") val title: String? = null,
|
||||||
|
@JsonProperty("file") val file: String? = null
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
|
||||||
|
open class TauVideo : ExtractorApi() {
|
||||||
|
override val name = "TauVideo"
|
||||||
|
override val mainUrl = "https://tau-video.xyz"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
val video_key = url.split("/").last()
|
||||||
|
val video_url = "${mainUrl}/api/video/${video_key}"
|
||||||
|
Log.d("Kekik_${this.name}", "video_url » ${video_url}")
|
||||||
|
|
||||||
|
val api = app.get(video_url).parsedSafe<TauVideoUrls>() ?: throw ErrorLoadingException("TauVideo")
|
||||||
|
|
||||||
|
for (video in api.urls) {
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = video.url,
|
||||||
|
referer = ext_ref,
|
||||||
|
quality = getQualityFromName(video.label),
|
||||||
|
type = INFER_TYPE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class TauVideoUrls(
|
||||||
|
@JsonProperty("urls") val urls: List<TauVideoData>
|
||||||
|
)
|
||||||
|
|
||||||
|
data class TauVideoData(
|
||||||
|
@JsonProperty("url") val url: String,
|
||||||
|
@JsonProperty("label") val label: String,
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
|
||||||
|
open class VidMoxy : ExtractorApi() {
|
||||||
|
override val name = "VidMoxy"
|
||||||
|
override val mainUrl = "https://vidmoxy.com"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
val video_req = app.get(url, referer=ext_ref).text
|
||||||
|
|
||||||
|
val sub_urls = mutableSetOf<String>()
|
||||||
|
Regex("""captions\",\"file\":\"([^\"]+)\",\"label\":\"([^\"]+)\"""").findAll(video_req).forEach {
|
||||||
|
val (sub_url, sub_lang) = it.destructured
|
||||||
|
|
||||||
|
if (sub_url in sub_urls) { return@forEach }
|
||||||
|
sub_urls.add(sub_url)
|
||||||
|
|
||||||
|
subtitleCallback.invoke(
|
||||||
|
SubtitleFile(
|
||||||
|
lang = sub_lang.replace("\\u0131", "ı").replace("\\u0130", "İ").replace("\\u00fc", "ü").replace("\\u00e7", "ç"),
|
||||||
|
url = fixUrl(sub_url.replace("\\", ""))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val extracted_value = Regex("""file": "(.*)",""").find(video_req)?.groupValues?.get(1) ?: throw ErrorLoadingException("File not found")
|
||||||
|
|
||||||
|
val bytes = extracted_value.split("\\x").filter { it.isNotEmpty() }.map { it.toInt(16).toByte() }.toByteArray()
|
||||||
|
val decoded = String(bytes, Charsets.UTF_8)
|
||||||
|
Log.d("Kekik_${this.name}", "decoded » ${decoded}")
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = decoded,
|
||||||
|
referer = ext_ref,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
isM3u8 = true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
||||||
|
|
||||||
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||||
|
import com.fasterxml.jackson.module.kotlin.readValue
|
||||||
|
|
||||||
|
open class VideoSeyred : ExtractorApi() {
|
||||||
|
override val name = "VideoSeyred"
|
||||||
|
override val mainUrl = "https://videoseyred.in"
|
||||||
|
override val requiresReferer = true
|
||||||
|
|
||||||
|
override suspend fun getUrl(url: String, referer: String?, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) {
|
||||||
|
val ext_ref = referer ?: ""
|
||||||
|
val video_id = url.substringAfter("embed/").substringBefore("?")
|
||||||
|
val video_url = "${mainUrl}/playlist/${video_id}.json"
|
||||||
|
Log.d("Kekik_${this.name}", "video_url » ${video_url}")
|
||||||
|
|
||||||
|
val response_raw = app.get(video_url)
|
||||||
|
val response_list:List<VideoSeyredSource> = jacksonObjectMapper().readValue(response_raw.text) ?: throw ErrorLoadingException("VideoSeyred")
|
||||||
|
val response = response_list[0] ?: throw ErrorLoadingException("VideoSeyred")
|
||||||
|
|
||||||
|
for (track in response.tracks) {
|
||||||
|
if (track.label != null && track.kind == "captions") {
|
||||||
|
subtitleCallback.invoke(
|
||||||
|
SubtitleFile(
|
||||||
|
lang = track.label,
|
||||||
|
url = fixUrl(track.file)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (source in response.sources) {
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
source = this.name,
|
||||||
|
name = this.name,
|
||||||
|
url = source.file,
|
||||||
|
referer = ext_ref,
|
||||||
|
quality = Qualities.Unknown.value,
|
||||||
|
type = INFER_TYPE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class VideoSeyredSource(
|
||||||
|
@JsonProperty("image") val image: String,
|
||||||
|
@JsonProperty("title") val title: String,
|
||||||
|
@JsonProperty("sources") val sources: List<VSSource>,
|
||||||
|
@JsonProperty("tracks") val tracks: List<VSTrack>
|
||||||
|
)
|
||||||
|
|
||||||
|
data class VSSource(
|
||||||
|
@JsonProperty("file") val file: String,
|
||||||
|
@JsonProperty("type") val type: String,
|
||||||
|
@JsonProperty("default") val default: String
|
||||||
|
)
|
||||||
|
|
||||||
|
data class VSTrack(
|
||||||
|
@JsonProperty("file") val file: String,
|
||||||
|
@JsonProperty("kind") val kind: String,
|
||||||
|
@JsonProperty("language") val language: String? = null,
|
||||||
|
@JsonProperty("label") val label: String? = null,
|
||||||
|
@JsonProperty("default") val default: String? = null
|
||||||
|
)
|
||||||
|
}
|
|
@ -98,10 +98,24 @@ import com.lagradost.cloudstream3.extractors.Mvidoo
|
||||||
import com.lagradost.cloudstream3.extractors.MwvnVizcloudInfo
|
import com.lagradost.cloudstream3.extractors.MwvnVizcloudInfo
|
||||||
import com.lagradost.cloudstream3.extractors.Neonime7n
|
import com.lagradost.cloudstream3.extractors.Neonime7n
|
||||||
import com.lagradost.cloudstream3.extractors.Neonime8n
|
import com.lagradost.cloudstream3.extractors.Neonime8n
|
||||||
import com.lagradost.cloudstream3.extractors.OkRu
|
import com.lagradost.cloudstream3.extractors.Odnoklassniki
|
||||||
import com.lagradost.cloudstream3.extractors.OkRuHttps
|
import com.lagradost.cloudstream3.extractors.TauVideo
|
||||||
|
import com.lagradost.cloudstream3.extractors.SibNet
|
||||||
|
import com.lagradost.cloudstream3.extractors.ContentX
|
||||||
|
import com.lagradost.cloudstream3.extractors.Hotlinger
|
||||||
|
import com.lagradost.cloudstream3.extractors.HDMomPlayer
|
||||||
|
import com.lagradost.cloudstream3.extractors.HDPlayerSystem
|
||||||
|
import com.lagradost.cloudstream3.extractors.VideoSeyred
|
||||||
|
import com.lagradost.cloudstream3.extractors.PeaceMakerst
|
||||||
|
import com.lagradost.cloudstream3.extractors.HDStreamAble
|
||||||
|
import com.lagradost.cloudstream3.extractors.RapidVid
|
||||||
|
import com.lagradost.cloudstream3.extractors.TRsTX
|
||||||
|
import com.lagradost.cloudstream3.extractors.VidMoxy
|
||||||
|
import com.lagradost.cloudstream3.extractors.PixelDrain
|
||||||
|
import com.lagradost.cloudstream3.extractors.MailRu
|
||||||
|
import com.lagradost.cloudstream3.extractors.OkRuSSL
|
||||||
|
import com.lagradost.cloudstream3.extractors.OkRuHTTP
|
||||||
import com.lagradost.cloudstream3.extractors.Okrulink
|
import com.lagradost.cloudstream3.extractors.Okrulink
|
||||||
import com.lagradost.cloudstream3.extractors.Pixeldrain
|
|
||||||
import com.lagradost.cloudstream3.extractors.PlayLtXyz
|
import com.lagradost.cloudstream3.extractors.PlayLtXyz
|
||||||
import com.lagradost.cloudstream3.extractors.PlayerVoxzer
|
import com.lagradost.cloudstream3.extractors.PlayerVoxzer
|
||||||
import com.lagradost.cloudstream3.extractors.Rabbitstream
|
import com.lagradost.cloudstream3.extractors.Rabbitstream
|
||||||
|
@ -662,11 +676,27 @@ val extractorApis: MutableList<ExtractorApi> = arrayListOf(
|
||||||
Evoload1(),
|
Evoload1(),
|
||||||
UpstreamExtractor(),
|
UpstreamExtractor(),
|
||||||
|
|
||||||
|
Odnoklassniki(),
|
||||||
|
TauVideo(),
|
||||||
|
SibNet(),
|
||||||
|
ContentX(),
|
||||||
|
Hotlinger(),
|
||||||
|
HDMomPlayer(),
|
||||||
|
HDPlayerSystem(),
|
||||||
|
VideoSeyred(),
|
||||||
|
PeaceMakerst(),
|
||||||
|
HDStreamAble(),
|
||||||
|
RapidVid(),
|
||||||
|
TRsTX(),
|
||||||
|
VidMoxy(),
|
||||||
|
PixelDrain(),
|
||||||
|
MailRu(),
|
||||||
|
|
||||||
Tomatomatela(),
|
Tomatomatela(),
|
||||||
TomatomatelalClub(),
|
TomatomatelalClub(),
|
||||||
Cinestart(),
|
Cinestart(),
|
||||||
OkRu(),
|
OkRuSSL(),
|
||||||
OkRuHttps(),
|
OkRuHTTP(),
|
||||||
Okrulink(),
|
Okrulink(),
|
||||||
Sendvid(),
|
Sendvid(),
|
||||||
|
|
||||||
|
@ -746,7 +776,6 @@ val extractorApis: MutableList<ExtractorApi> = arrayListOf(
|
||||||
Movhide(),
|
Movhide(),
|
||||||
StreamhideCom(),
|
StreamhideCom(),
|
||||||
StreamhideTo(),
|
StreamhideTo(),
|
||||||
Pixeldrain(),
|
|
||||||
Wibufile(),
|
Wibufile(),
|
||||||
FileMoonIn(),
|
FileMoonIn(),
|
||||||
Moviesm4u(),
|
Moviesm4u(),
|
||||||
|
|
Loading…
Reference in a new issue