diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/ContentXExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/ContentXExtractor.kt new file mode 100644 index 00000000..61943b70 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/ContentXExtractor.kt @@ -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 + ) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/HDMomPlayerExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/HDMomPlayerExtractor.kt new file mode 100644 index 00000000..03586386 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/HDMomPlayerExtractor.kt @@ -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 = 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? + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/HDPlayerSystemExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/HDPlayerSystemExtractor.kt new file mode 100644 index 00000000..14333d35 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/HDPlayerSystemExtractor.kt @@ -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() ?: 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 + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/HDStreamAbleExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/HDStreamAbleExtractor.kt new file mode 100644 index 00000000..214cd2d4 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/HDStreamAbleExtractor.kt @@ -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" +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/HotlingerExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/HotlingerExtractor.kt new file mode 100644 index 00000000..4a77cbf3 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/HotlingerExtractor.kt @@ -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" +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/MailRuExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/MailRuExtractor.kt new file mode 100644 index 00000000..766c7762 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/MailRuExtractor.kt @@ -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(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 + ) + + data class MailRuVideoData( + @JsonProperty("url") val url: String, + @JsonProperty("key") val key: String + ) +} diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/OdnoklassnikiExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/OdnoklassnikiExtractor.kt new file mode 100644 index 00000000..46f6ad0f --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/OdnoklassnikiExtractor.kt @@ -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>(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, + ) +} diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/OkRuExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/OkRuExtractor.kt index 70e87fbf..824481eb 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/OkRuExtractor.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/OkRuExtractor.kt @@ -1,67 +1,13 @@ +// ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. + package com.lagradost.cloudstream3.extractors -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.utils.* -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 = 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(){ +class OkRuSSL : Odnoklassniki() { + override var name = "OkRuSSL" override var mainUrl = "https://ok.ru" } -open class OkRu : ExtractorApi() { - override var name = "Okru" +class OkRuHTTP : Odnoklassniki() { + override var name = "OkRuHTTP" override var mainUrl = "http://ok.ru" - override val requiresReferer = false - - override suspend fun getUrl(url: String, referer: String?): List? { - val doc = app.get(url).document - val sources = ArrayList() - val datajson = doc.select("div[data-options]").attr("data-options") - if (datajson.isNotBlank()) { - val main = parseJson(datajson) - val metadatajson = parseJson(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 - } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/PeaceMakerstExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/PeaceMakerstExtractor.kt new file mode 100644 index 00000000..b57449bf --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/PeaceMakerstExtractor.kt @@ -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() ?: throw ErrorLoadingException("teve2 response is null") + + m3u_link = teve2_response.media.link.serviceUrl + "//" + teve2_response.media.link.securePath + } else { + val video_response = response.parsedSafe() ?: 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, + @JsonProperty("sIndex") val sIndex: String, + @JsonProperty("sourceList") val sourceList: Map + ) + + 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 + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/PixelDrainExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/PixelDrainExtractor.kt new file mode 100644 index 00000000..1c70cb54 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/PixelDrainExtractor.kt @@ -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 + ) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Pixeldrain.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Pixeldrain.kt deleted file mode 100644 index 9b481240..00000000 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Pixeldrain.kt +++ /dev/null @@ -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, - ) - ) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/RapidVidExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/RapidVidExtractor.kt new file mode 100644 index 00000000..a0d830cf --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/RapidVidExtractor.kt @@ -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() + 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 + ) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/SibNetExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/SibNetExtractor.kt new file mode 100644 index 00000000..a8bcee31 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/SibNetExtractor.kt @@ -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 + ) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/TRsTXExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/TRsTXExtractor.kt new file mode 100644 index 00000000..645d7c0e --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/TRsTXExtractor.kt @@ -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>() ?: throw ErrorLoadingException("Post link not found") + + val postJson: List = 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() + val vid_map = mutableListOf>() + 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 + ) +} diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/TauVideoExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/TauVideoExtractor.kt new file mode 100644 index 00000000..2478edc1 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/TauVideoExtractor.kt @@ -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() ?: 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 + ) + + data class TauVideoData( + @JsonProperty("url") val url: String, + @JsonProperty("label") val label: String, + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidMoxyExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidMoxyExtractor.kt new file mode 100644 index 00000000..b963fe56 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidMoxyExtractor.kt @@ -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() + 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 + ) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VideoSeyredExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VideoSeyredExtractor.kt new file mode 100644 index 00000000..3060bb92 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VideoSeyredExtractor.kt @@ -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 = 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, + @JsonProperty("tracks") val tracks: List + ) + + 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 + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt index 2e9dd691..588ebe0a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -98,10 +98,24 @@ import com.lagradost.cloudstream3.extractors.Mvidoo import com.lagradost.cloudstream3.extractors.MwvnVizcloudInfo import com.lagradost.cloudstream3.extractors.Neonime7n import com.lagradost.cloudstream3.extractors.Neonime8n -import com.lagradost.cloudstream3.extractors.OkRu -import com.lagradost.cloudstream3.extractors.OkRuHttps +import com.lagradost.cloudstream3.extractors.Odnoklassniki +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.Pixeldrain import com.lagradost.cloudstream3.extractors.PlayLtXyz import com.lagradost.cloudstream3.extractors.PlayerVoxzer import com.lagradost.cloudstream3.extractors.Rabbitstream @@ -662,11 +676,27 @@ val extractorApis: MutableList = arrayListOf( Evoload1(), UpstreamExtractor(), + Odnoklassniki(), + TauVideo(), + SibNet(), + ContentX(), + Hotlinger(), + HDMomPlayer(), + HDPlayerSystem(), + VideoSeyred(), + PeaceMakerst(), + HDStreamAble(), + RapidVid(), + TRsTX(), + VidMoxy(), + PixelDrain(), + MailRu(), + Tomatomatela(), TomatomatelalClub(), Cinestart(), - OkRu(), - OkRuHttps(), + OkRuSSL(), + OkRuHTTP(), Okrulink(), Sendvid(), @@ -746,7 +776,6 @@ val extractorApis: MutableList = arrayListOf( Movhide(), StreamhideCom(), StreamhideTo(), - Pixeldrain(), Wibufile(), FileMoonIn(), Moviesm4u(),