diff --git a/5movierulzProvider/src/main/AndroidManifest.xml b/5movierulzProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/5movierulzProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/5movierulzProvider/src/main/kotlin/com/darkdemon/FivemovierulzPlugin.kt b/5movierulzProvider/src/main/kotlin/com/darkdemon/FivemovierulzPlugin.kt
deleted file mode 100644
index acd2eac..0000000
--- a/5movierulzProvider/src/main/kotlin/com/darkdemon/FivemovierulzPlugin.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class FivemovierulzPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerExtractorAPI(Sbanh())
- registerExtractorAPI(Sendcm())
- registerExtractorAPI(Ncdnstm())
- registerExtractorAPI(StreamTapeAdblockUser())
- registerMainAPI(FivemovierulzProvider())
- }
-}
diff --git a/5movierulzProvider/src/main/kotlin/com/darkdemon/FivemovierulzProvider.kt b/5movierulzProvider/src/main/kotlin/com/darkdemon/FivemovierulzProvider.kt
deleted file mode 100644
index de6323e..0000000
--- a/5movierulzProvider/src/main/kotlin/com/darkdemon/FivemovierulzProvider.kt
+++ /dev/null
@@ -1,135 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
-import com.lagradost.cloudstream3.extractors.StreamSB
-import com.lagradost.cloudstream3.extractors.StreamTape
-import com.lagradost.cloudstream3.extractors.XStreamCdn
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.loadExtractor
-import org.jsoup.nodes.Element
-
-class FivemovierulzProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://5movierulz.cm"
- override var name = "5movierulz"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/category/featured/page/" to "Popular Movies",
- "$mainUrl/category/hollywood-movie-2021/page/" to "English",
- "$mainUrl/bollywood-movie-free/page/" to "Hindi",
- "$mainUrl/tamil-movie-free/page/" to "Tamil",
- "$mainUrl/telugu-movie/page/" to "Telugu",
- "$mainUrl/malayalam-movie-online/page/" to "Malayalam",
- "$mainUrl/category/bengali-movie/page/" to "Bengali",
- "$mainUrl/category/punjabi-movie/page/" to "Punjabi",
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(request.data + page).document
- val home = document.select("#main .cont_display").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(request.name, home)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title =
- this.selectFirst("a")?.attr("title")?.trim()?.substringBefore("(") ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src"))
-
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query").document
-
- return document.select("#main .cont_display").mapNotNull {
- it.toSearchResult()
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
-
- val title = document.selectFirst("h2.entry-title")?.text()?.trim()?.substringBefore("(")
- ?: return null
- val poster = fixUrlNull(document.selectFirst(".entry-content img")?.attr("src"))
- val tags =
- document.select("div.entry-content > p:nth-child(5)").text().substringAfter("Genres:")
- .substringBefore("Country:").split(",").map { it }
- val yearRegex = Regex("""\d{4}""")
- val year = yearRegex.find(
- document.select("h2.entry-title").text()
- )?.groupValues?.getOrNull(0)?.toIntOrNull()
- val description = document.select("div.entry-content > p:nth-child(6)").text().trim()
- val actors =
- document.select("div.entry-content > p:nth-child(5)").text()
- .substringAfter("Starring by:")
- .substringBefore("Genres:").split(",").map { it }
-
- return newMovieLoadResponse(title, url, TvType.Movie, url) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- addActors(actors)
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
- val sources = ArrayList()
- app.get(data).document.select(".entry-content p a[target=_blank]")
- .mapNotNull {
- if (it.attr("href").startsWith("https://down")) {
- sources.add(
- app.get(it.attr("href")).document.select(".entry-content iframe")
- .attr("src")
- )
- } else {
- sources.add(it.attr("href"))
- }
- }
- sources.forEach { source ->
- val src = if (source.startsWith("https://stream")) source.replace(
- "/([a-z])/".toRegex(),
- "/e/"
- ) else source
- loadExtractor(
- src,
- "$mainUrl/",
- subtitleCallback,
- callback
- )
- }
- return true
- }
-}
-
-class Sbanh : StreamSB() {
- override var mainUrl = "https://sbanh.com"
-}
-
-class Ncdnstm : XStreamCdn() {
- override var mainUrl = "https://ncdnstm.xyz"
-}
-
-class StreamTapeAdblockUser : StreamTape() {
- override var mainUrl = "https://streamtapeadblockuser.homes"
-}
diff --git a/5movierulzProvider/src/main/kotlin/com/darkdemon/Sendcm.kt b/5movierulzProvider/src/main/kotlin/com/darkdemon/Sendcm.kt
deleted file mode 100644
index 07b56c9..0000000
--- a/5movierulzProvider/src/main/kotlin/com/darkdemon/Sendcm.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.app
-import com.lagradost.cloudstream3.utils.ExtractorApi
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.Qualities
-
-open class Sendcm: ExtractorApi() {
- override val name = "Sendcm"
- override val mainUrl = "https://send.cm"
- override val requiresReferer = false
-
- override suspend fun getUrl(url: String, referer: String?): List {
- val sources = mutableListOf()
- val url = app.get(url).document.select("source").attr("src")
- sources.add(
- ExtractorLink(
- name = name,
- source = name,
- url = url,
- isM3u8 = false,
- quality = Qualities.Unknown.value,
- referer = url
- )
- )
- return sources
- }
-}
\ No newline at end of file
diff --git a/AnimeWorldProvider/build.gradle.kts b/AnimeWorldProvider/build.gradle.kts
deleted file mode 100644
index a50fd65..0000000
--- a/AnimeWorldProvider/build.gradle.kts
+++ /dev/null
@@ -1,27 +0,0 @@
-version = 5
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- description = "Please wait for 10seconds to bypass the ads"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- "Anime",
- "Cartoon"
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=anime-world.in&sz=%size%"
-}
diff --git a/AnimeWorldProvider/src/main/AndroidManifest.xml b/AnimeWorldProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/AnimeWorldProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/AnimeWorldProvider/src/main/kotlin/com/darkdemon/AnimeWorldPlugin.kt b/AnimeWorldProvider/src/main/kotlin/com/darkdemon/AnimeWorldPlugin.kt
deleted file mode 100644
index f6fe5e8..0000000
--- a/AnimeWorldProvider/src/main/kotlin/com/darkdemon/AnimeWorldPlugin.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class AnimeWorldPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(AnimeWorldProvider())
- registerExtractorAPI(Vanfem())
- }
-}
diff --git a/AnimeWorldProvider/src/main/kotlin/com/darkdemon/AnimeWorldProvider.kt b/AnimeWorldProvider/src/main/kotlin/com/darkdemon/AnimeWorldProvider.kt
deleted file mode 100644
index a5b9274..0000000
--- a/AnimeWorldProvider/src/main/kotlin/com/darkdemon/AnimeWorldProvider.kt
+++ /dev/null
@@ -1,233 +0,0 @@
-package com.darkdemon
-
-import android.util.Log
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
-import com.lagradost.cloudstream3.extractors.XStreamCdn
-import com.lagradost.cloudstream3.utils.*
-import com.lagradost.nicehttp.Requests
-import com.lagradost.nicehttp.Session
-import kotlinx.coroutines.delay
-import org.jsoup.nodes.Element
-
-class AnimeWorldProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://anime-world.in"
- override var name = "AnimeWorld"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- TvType.TvSeries,
- TvType.Anime,
- TvType.Cartoon
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/series/page/" to "Series",
- "$mainUrl/movies/page/" to "Movies",
- "$mainUrl/category/cartoon/page/" to "Cartoon",
- "$mainUrl/category/anime/page/" to "Anime",
- "$mainUrl/category/cartoon-network/page/" to "Cartoon Network",
- "$mainUrl/category/disney/page/" to "Disney",
- "$mainUrl/category/marvel-hq/page/" to "Marvel",
- "$mainUrl/category/hungama-tv/page/" to "Hungama TV",
- "$mainUrl/category/nickelodeon/page/" to "Nickelodeon",
- "$mainUrl/category/sonic/page/" to "Sonic",
- "$mainUrl/category/amazon-prime/page/" to "Amazon Prime",
- "$mainUrl/category/netflix/page/" to "Netflix",
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(request.data + page).document
- val home = document.select("article").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(request.name, home)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = this.selectFirst(".entry-title")?.text()?.trim() ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src"))
- val year = this.select(".year").text().trim().toIntOrNull()
-
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- this.year = year
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query").document
-
- return document.select("article").mapNotNull {
- it.toSearchResult()
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
- if (document.select("h2.title").text().contains("Skip Ad")) {
- val link = document.selectFirst(".glass-button")!!.attr("onclick").substringAfter("'")
- .substringBefore("'")
- bypassRockLinks(link)
- }
- val title = document.selectFirst(".entry-title")?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.selectFirst(".post-thumbnail img")?.attr("src"))
- val tags = document.select(".genres a").map { it.text() }
- val year = document.select(".year").text().trim().toIntOrNull()
- val tvType = if (document.select(".episodes button > span").isNullOrEmpty()
- ) TvType.Movie else TvType.TvSeries
- val description = document.selectFirst(".description > p:nth-child(1)")?.text()?.trim()
- val trailer = fixUrlNull(document.select("iframe").attr("src"))
- val rating = document.select("span.num").text().toRatingInt()
- //val actors = document.select("#cast > div:nth-child(4)").map { it.text() }
- val recommendations = document.select("article").mapNotNull {
- it.toSearchResult()
- }
-
- return if (tvType == TvType.TvSeries) {
- val episodes: MutableList = mutableListOf()
- document.select(".choose-season ul.sub-menu a").mapNotNull { element ->
- val html = app.post(
- url = "$mainUrl/wp-admin/admin-ajax.php",
- data = mapOf(
- "action" to "action_select_season",
- "season" to element.attr("data-season"),
- "post" to element.attr("data-post")
- ),
- referer = url,
- headers = mapOf("X-Requested-With" to "XMLHttpRequest")
- ).document
-
- episodes += html.select("article").mapNotNull {
- val href = fixUrl(it.select("a").attr("href") ?: return null)
- val name = it.select("h2").text().trim()
- val thumbs = it.select("img").attr("src")
- val season = element.attr("data-season").toInt()
- val episode = it.select(".num-epi").text().split("x").last().toInt()
- Episode(
- href,
- name,
- season,
- episode,
- thumbs
- )
- }
- }
-
- newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- this.rating = rating
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- } else {
- newMovieLoadResponse(title, url, TvType.Movie, url) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- this.rating = rating
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
- Log.d("test", data)
-
- val document = app.get(data).document
- Log.d("test", document.select("h2.title").text())
- if (document.select("h2.title").text().contains("Skip Ad")) {
- val link = document.selectFirst(".glass-button")!!.attr("onclick").substringAfter("'")
- .substringBefore("'")
- bypassRockLinks(link)
- } else {
- val langPair = document.select(".aa-tbs li").associate {
- it.select("a").attr("href").replace("#", "") to it.select(".server").text()
- .split("-")
- .last().trim()
- }
- document.select(".aa-cn div").map { res ->
-
- loadExtractor(
- res.select("iframe").attr("data-src"),
- referer = data,
- subtitleCallback,
- ) { link ->
- callback.invoke(
- ExtractorLink(
- link.source,
- link.name + " " + langPair[res.attr("id")],
- link.url,
- link.referer,
- Qualities.Unknown.value,
- link.isM3u8,
- link.headers,
- link.extractorData
- )
- )
- }
- }
- }
- return true
- }
-
- private suspend fun bypassRockLinks(link: String) {
- val domain =
- if (link.contains("rocklinks")) "https://link.techyone.co" else "https://cac.teckypress.in"
- val baseUrl =
- if (link.contains("rocklinks")) "$domain/${link.substringAfterLast("/")}?quelle=" else "$domain/${
- link.substringAfterLast("/")
- }"
- val client = Requests().baseClient
- val session = Session(client)
- val html = session.get(url = baseUrl, referer = baseUrl)
- fun encode(input: String): String = java.net.URLEncoder.encode(input, "utf-8")
- val document = html.document
- val data = document.select("#go-link input")
- .mapNotNull { it.attr("name").toString() to encode(it.attr("value").toString()) }
- .toMap()
-
- delay(10000L)
- val response = session.post(
- url = "$domain/links/go",
- headers = mapOf(
- "Content-Type" to "application/x-www-form-urlencoded; charset=UTF-8",
- "X-Requested-With" to "XMLHttpRequest",
- "Accept" to "application/json, text/javascript, ; q=0.01",
- "Accept-Language" to "en-US,en;q=0.5",
- //"Accept-Encoding" to "gzip"
- ),
- data = data,
- referer = baseUrl
- ).text
- val bypassedLink = AppUtils.parseJson(response).url
- app.get(bypassedLink).document
- }
-
- data class Response(
- @JsonProperty("url") var url: String
- )
-}
-
-class Vanfem : XStreamCdn() {
- override val name: String = "Vanfem"
- override val mainUrl: String = "https://vanfem.com"
- override var domainUrl: String = "vanfem.com"
-}
\ No newline at end of file
diff --git a/Bolly2TollyProvider/build.gradle.kts b/Bolly2TollyProvider/build.gradle.kts
deleted file mode 100644
index 94c2c47..0000000
--- a/Bolly2TollyProvider/build.gradle.kts
+++ /dev/null
@@ -1,25 +0,0 @@
-version = 1
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- // description = "Lorem Ipsum"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=bolly2tolly.desi/&sz=%size%"
-}
diff --git a/Bolly2TollyProvider/src/main/AndroidManifest.xml b/Bolly2TollyProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 36bb4af..0000000
--- a/Bolly2TollyProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/Bolly2TollyProvider/src/main/kotlin/com/darkdemon/Bolly2TollyPlugin.kt b/Bolly2TollyProvider/src/main/kotlin/com/darkdemon/Bolly2TollyPlugin.kt
deleted file mode 100644
index 2e9d15b..0000000
--- a/Bolly2TollyProvider/src/main/kotlin/com/darkdemon/Bolly2TollyPlugin.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.darkdemon
-
-import android.content.Context
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-
-@CloudstreamPlugin
-class Bolly2TollyPlugin : Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(Bolly2TollyProvider())
- registerExtractorAPI(NeoHD())
- registerExtractorAPI(NinjaHD())
- }
-}
diff --git a/Bolly2TollyProvider/src/main/kotlin/com/darkdemon/Bolly2TollyProvider.kt b/Bolly2TollyProvider/src/main/kotlin/com/darkdemon/Bolly2TollyProvider.kt
deleted file mode 100644
index e9a6571..0000000
--- a/Bolly2TollyProvider/src/main/kotlin/com/darkdemon/Bolly2TollyProvider.kt
+++ /dev/null
@@ -1,154 +0,0 @@
-package com.darkdemon
-
-import android.util.Log
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.loadExtractor
-import org.jsoup.nodes.Element
-
-class Bolly2TollyProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://www.bolly2tolly.desi"
- override var name = "Bolly2Tolly"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- TvType.TvSeries
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/page/" to "Latest ",
- "$mainUrl/category/english-movies/page/" to "English",
- "$mainUrl/category/hindi-movies/page/" to "Hindi",
- "$mainUrl/category/telugu-movies/page/" to "Telugu",
- "$mainUrl/category/tamil-movies/page/" to "Tamil",
- "$mainUrl/category/kannada-movies/page/" to "Kannada",
- "$mainUrl/category/malayalam-movies/page/" to "Malayalam",
- "$mainUrl/category/bengali-movies/page/" to "Bengali"
-
-
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(request.data + page).document
- val home = document.select("ul.MovieList article").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(request.name, home)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = if (this.selectFirst("img")?.attr("alt").isNullOrEmpty())
- this.selectFirst("h3")?.text()?.substringBefore("(") else this.selectFirst("img")
- ?.attr("alt")?.trim()
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src"))
-
- return newMovieSearchResponse(title ?: return null, href, TvType.Movie) {
- this.posterUrl = posterUrl
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query").document
-
- return document.select(".result-item").mapNotNull {
- val title = it.select("SubTitle").text().trim()
- val href = fixUrl(it.selectFirst(".title a")?.attr("href").toString())
- val posterUrl = fixUrlNull(it.selectFirst(".thumbnail img")?.attr("src"))
- val quality = getQualityFromString(it.select("span.quality").text())
- val tvtype = if (href.contains("tvshows")) TvType.TvSeries else TvType.Movie
- newMovieSearchResponse(title, href, tvtype) {
- this.posterUrl = posterUrl
- this.quality = quality
- }
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
-
- val title = document.selectFirst(".SubTitle")?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.selectFirst(".Image img")?.attr("src"))
- val tags = document.select(".InfoList li:eq(2) a").map { it.text() }
- val year = document.select("span.Date").text().trim().toIntOrNull()
- val tvType =
- if (document.select(".AA-cont").isNullOrEmpty()) TvType.Movie else TvType.TvSeries
- val description = document.selectFirst(".Description p")?.text()?.trim()
- //val rating = document.select(".post-ratings strong").last()!!.text().toRatingInt()
- val actors = document.select(".ListCast a").map { it.text().trim() }
- val recommendations = document.select(".Wdgt ul.MovieList li").mapNotNull {
- it.toSearchResult()
- }
-
- return if (tvType == TvType.TvSeries) {
- val episodes = document.select("tbody tr").mapNotNull {
- val href = fixUrl(it.select(".MvTbTtl a").attr("href") ?: return null)
- Log.d("href", href)
- val name = it.select(".MvTbTtl a").text().trim()
- val thumbs = "https:" + it.select("img").attr("src")
- val season = document.select(".AA-Season").attr("data-tab").toInt()
- val episode = it.select("span.Num").text().toInt()
- Episode(
- href,
- name,
- season,
- episode,
- thumbs
- )
- }
-
- newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- //this.rating = rating
- addActors(actors)
- this.recommendations = recommendations
- }
- } else {
- newMovieLoadResponse(title, url, TvType.Movie, url) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- //this.rating = rating
- addActors(actors)
- this.recommendations = recommendations
- }
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
- println(data)
- val sources = mutableListOf()
- val document = app.get(data).document
- sources.add(document.select(".TPlayer iframe").attr("src"))
- val srcRegex = Regex("""(https.*?)"\s""")
- srcRegex.find(
- document.select(".TPlayer").text()
- )?.groupValues?.map { sources.add(it.replace("#038;", "")) }
- println(sources)
- sources.forEach {
- val source = app.get(it, referer = data).document.select("iframe").attr("src")
- println(source)
- loadExtractor(
- source,
- subtitleCallback,
- callback
- )
- }
- return true
- }
-}
diff --git a/Bolly2TollyProvider/src/main/kotlin/com/darkdemon/NeoHD.kt b/Bolly2TollyProvider/src/main/kotlin/com/darkdemon/NeoHD.kt
deleted file mode 100644
index 919b024..0000000
--- a/Bolly2TollyProvider/src/main/kotlin/com/darkdemon/NeoHD.kt
+++ /dev/null
@@ -1,145 +0,0 @@
-package com.darkdemon
-
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.lagradost.cloudstream3.app
-import com.lagradost.cloudstream3.base64DecodeArray
-import com.lagradost.cloudstream3.base64Encode
-import com.lagradost.cloudstream3.utils.*
-import com.lagradost.cloudstream3.utils.AppUtils.parseJson
-import java.security.DigestException
-import java.security.MessageDigest
-import javax.crypto.Cipher
-import javax.crypto.spec.IvParameterSpec
-import javax.crypto.spec.SecretKeySpec
-
-class NinjaHD : NeoHD() {
- override var name = "NinjaHD"
- override var mainUrl = "https://ninjahd.one"
-}
-
-open class NeoHD : ExtractorApi() {
- override val name = "NeoHD"
- override val mainUrl = "https://neohd.xyz"
- override val requiresReferer = false
-
- override suspend fun getUrl(url: String, referer: String?): List {
- val sources = mutableListOf()
- val document = app.get(url).text
- val cryptoRegex = Regex("""var\s*playerConfig\s*=\s*([^;]+)""")
- val json = cryptoRegex.find(document)?.groupValues?.getOrNull(1).toString()
- val password = "F1r3b4Ll_GDP~5H".toByteArray()
- val data1 = parseJson(json)
- val decryptedData =
- cryptoAESHandler(data1, password, false)?.replace("\\", "")?.substringAfter("\"")
- ?.substringBeforeLast("\"")
- val apiQuery = parseJson(decryptedData!!).apiQuery
- val doc = app.get(
- url = "https://ninjahd.one/api/?$apiQuery&_=${System.currentTimeMillis() * 1000}",
- headers = mapOf(
- "X-Requested-With" to "XMLHttpRequest",
- "Referer" to "https://ninjahd.one/embed/zilnv7x6da1s84"
- )
- ).text
- val source = parseJson(doc).sources[0].file
- sources.add(
- ExtractorLink(
- name,
- name,
- source,
- "$mainUrl/",
- Qualities.Unknown.value,
- headers = mapOf("range" to "bytes=0-")
- )
- )
- return sources
- }
-
- private fun GenerateKeyAndIv(
- password: ByteArray,
- salt: ByteArray,
- hashAlgorithm: String = "MD5",
- keyLength: Int = 32,
- ivLength: Int = 16,
- iterations: Int = 1
- ): List? {
-
- val md = MessageDigest.getInstance(hashAlgorithm)
- val digestLength = md.digestLength
- val targetKeySize = keyLength + ivLength
- val requiredLength = (targetKeySize + digestLength - 1) / digestLength * digestLength
- val generatedData = ByteArray(requiredLength)
- var generatedLength = 0
-
- try {
- md.reset()
-
- while (generatedLength < targetKeySize) {
- if (generatedLength > 0)
- md.update(
- generatedData,
- generatedLength - digestLength,
- digestLength
- )
-
- md.update(password)
- md.update(salt, 0, 8)
- md.digest(generatedData, generatedLength, digestLength)
-
- for (i in 1 until iterations) {
- md.update(generatedData, generatedLength, digestLength)
- md.digest(generatedData, generatedLength, digestLength)
- }
-
- generatedLength += digestLength
- }
- return listOf(
- generatedData.copyOfRange(0, keyLength),
- generatedData.copyOfRange(keyLength, targetKeySize)
- )
- } catch (e: DigestException) {
- return null
- }
- }
-
- private fun String.decodeHex(): ByteArray {
- check(length % 2 == 0) { "Must have an even length" }
- return chunked(2)
- .map { it.toInt(16).toByte() }
- .toByteArray()
- }
-
- private fun cryptoAESHandler(
- data: AesData,
- pass: ByteArray,
- encrypt: Boolean = true
- ): String? {
- val (key, iv) = GenerateKeyAndIv(pass, data.s.decodeHex()) ?: return null
- val cipher = Cipher.getInstance("AES/CBC/NoPadding")
- return if (!encrypt) {
- cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec(key, "AES"), IvParameterSpec(iv))
- String(cipher.doFinal(base64DecodeArray(data.ct)))
- } else {
- cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec(key, "AES"), IvParameterSpec(iv))
- base64Encode(cipher.doFinal(data.ct.toByteArray()))
-
- }
- }
-
- data class AesData(
- @JsonProperty("ct") var ct: String,
- @JsonProperty("iv") var iv: String,
- @JsonProperty("s") var s: String
- )
-
- data class CryptoResponse(
- @JsonProperty("apiQuery") var apiQuery: String
- )
-
- data class VideoUrl(
- @JsonProperty("sources") var sources: ArrayList = arrayListOf(),
- )
-
- data class Sources(
- @JsonProperty("file") var file: String
- )
-}
diff --git a/CinevezProvider/build.gradle.kts b/CinevezProvider/build.gradle.kts
deleted file mode 100644
index ac042fd..0000000
--- a/CinevezProvider/build.gradle.kts
+++ /dev/null
@@ -1,25 +0,0 @@
-version = 2
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- description = "This website support English/Hindi/Kannada/Malayalam/Tamil/Telugu"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=ww1.cinevez.mx&sz=%size%"
-}
diff --git a/CinevezProvider/src/main/AndroidManifest.xml b/CinevezProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/CinevezProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/CinevezProvider/src/main/kotlin/com/darkdemon/CinevezPlugin.kt b/CinevezProvider/src/main/kotlin/com/darkdemon/CinevezPlugin.kt
deleted file mode 100644
index d8de779..0000000
--- a/CinevezProvider/src/main/kotlin/com/darkdemon/CinevezPlugin.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class CinevezPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerExtractorAPI(StreamTapeTo())
- registerExtractorAPI(SlTube())
- registerMainAPI(CinevezProvider())
- }
-}
diff --git a/CinevezProvider/src/main/kotlin/com/darkdemon/CinevezProvider.kt b/CinevezProvider/src/main/kotlin/com/darkdemon/CinevezProvider.kt
deleted file mode 100644
index 2db3867..0000000
--- a/CinevezProvider/src/main/kotlin/com/darkdemon/CinevezProvider.kt
+++ /dev/null
@@ -1,132 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
-import com.lagradost.cloudstream3.extractors.StreamTape
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.Qualities
-import com.lagradost.cloudstream3.utils.loadExtractor
-import org.jsoup.nodes.Element
-
-class CinevezProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://ww1.cinevez.mx"
- override var name = "Cinevez"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- TvType.TvSeries
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/featured/page/" to "Popular Movies",
- "$mainUrl/latest-series/page/" to "Popular Series",
- "$mainUrl/language/english/page/" to "English",
- "$mainUrl/language/hindi/page/" to "Hindi",
- "$mainUrl/language/tamil/page/" to "Tamil",
- "$mainUrl/language/telugu/page/" to "Telugu",
- "$mainUrl/language/malayalam/page/" to "Malayalam",
- "$mainUrl/language/kannada/page/" to "Kannada"
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(request.data + page).document
- val home = document.select(".post-item").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(request.name, home)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = this.selectFirst("h2")?.text()?.trim() ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src"))
- val quality = getQualityFromString(this.select("span").text().substringBefore("-"))
-
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- this.quality = quality
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query").document
-
- return document.select(".post-item").mapNotNull {
- it.toSearchResult()
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
-
- val title = document.selectFirst(".box-title h1")?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.selectFirst(".post-image img")?.attr("src"))
- val tags = document.select("div:nth-child(3) > p.text-sm a").map { it.text() }
- val year = document.select("div:nth-child(2) > p.text-sm a").text().toIntOrNull()
- val description = document.selectFirst("div.text-left > div:nth-child(8)")?.text()
- ?.replace("Story Plot:", "")?.trim()
- val actors =
- document.select("div:nth-child(5) > p.text-sm a").map { it.text() }
- val recommendations = document.select(".box-content .post-item").mapNotNull {
- it.toSearchResult()
- }
- val sourceUrl =
- if (document.select("div:nth-child(3) > div.box-title.border-dark").text().trim()
- .contains("Seasons")
- ) document.select("div:nth-child(3) > div > div > div > a.rounded")
- .attr("href") else url
- return newMovieLoadResponse(title, url, TvType.Movie, sourceUrl) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- this.recommendations = recommendations
- addActors(actors)
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
-
- app.get(data).document.select(".list-episodes a.bg-button")
- .mapNotNull {
- if (it.attr("href").contains("send.cm")) {
- val url = app.get(it.attr("href")).document.select("source").attr("src")
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- url,
- mainUrl,
- quality = Qualities.Unknown.value,
- )
- )
- } else {
- loadExtractor(
- it.attr("href").replace("/([a-z])/".toRegex(),"/e/"),
- "$mainUrl/",
- subtitleCallback,
- callback
- )
- }
- }
- return true
- }
-}
-
-class StreamTapeTo : StreamTape() {
- override var mainUrl = "https://streamtape.to"
-}
-
-class SlTube : StreamTape() {
- override var mainUrl = "https://sltube.org"
-}
diff --git a/CricHDProvider/build.gradle.kts b/CricHDProvider/build.gradle.kts
deleted file mode 100644
index a2a0b15..0000000
--- a/CricHDProvider/build.gradle.kts
+++ /dev/null
@@ -1,24 +0,0 @@
-version = 1
-
-
-cloudstream {
- language = "en"
- // All of these properties are optional, you can safely remove them
-
- //description = "This website support English/Hindi/Kannada/Malayalam/Tamil/Telugu live channels and Hindi Old Movies/Malayalam Movies \n For language in Sports: Please check background image[country flag] of the episode"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "Live"
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=pc9.crichd.com&sz=%size%"
-}
diff --git a/CricHDProvider/src/main/AndroidManifest.xml b/CricHDProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 36bb4af..0000000
--- a/CricHDProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/CricHDProvider/src/main/kotlin/com/darkdemon/CricHDPlugin.kt b/CricHDProvider/src/main/kotlin/com/darkdemon/CricHDPlugin.kt
deleted file mode 100644
index f28de8b..0000000
--- a/CricHDProvider/src/main/kotlin/com/darkdemon/CricHDPlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class CricHDPlugin : Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(CricHDProvider())
- }
-}
diff --git a/CricHDProvider/src/main/kotlin/com/darkdemon/CricHDProvider.kt b/CricHDProvider/src/main/kotlin/com/darkdemon/CricHDProvider.kt
deleted file mode 100644
index 56767b9..0000000
--- a/CricHDProvider/src/main/kotlin/com/darkdemon/CricHDProvider.kt
+++ /dev/null
@@ -1,130 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.Qualities
-import org.jsoup.nodes.Element
-
-class CricHDProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://pc9.crichd.com"
- override var name = "CricHD"
- override val hasMainPage = true
- override var lang = "en"
- override val supportedTypes = setOf(
- TvType.Live
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(mainUrl).document
- val pageSelectors = listOf(
- Pair("Leagues", ".CSSTableGenerator table tbody tr"),
- Pair("Channels", "#sidebar-right li"),
- )
- val pages = pageSelectors.apmap { (title, selector) ->
- val list = document.select(selector).mapNotNull {
- it.toSearchResult()
- }
- HomePageList(title, list)
- }
- return HomePageResponse(pages)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- if (this.selectFirst(".mobile-hide")?.text().isNullOrEmpty()) {
- val title =
- this.selectFirst("a")?.attr("title")?.substringBefore("Live")?.trim() ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src"))
- return newMovieSearchResponse(title, href, TvType.Live) {
- this.posterUrl = posterUrl
- }
- } else {
- val title = this.selectFirst(".gametitle")?.text()?.trim() ?: return null
- val href = fixUrl(this.selectFirst("td:nth-child(3) > a")?.attr("href").toString())
- return newMovieSearchResponse(title, href, TvType.Live)
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query").document
-
- return document.select("article").mapNotNull {
- it.toSearchResult()
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
-
- val title = document.selectFirst("h1.heading-separator")?.text()?.trim() ?: return null
- val episodes = document.select("div > div:nth-child(2) > table > tbody tr")
- .mapIndexedNotNull { index, it ->
- val name = it.selectFirst("td")?.text()?.trim()
- val href = it.select("a").attr("href")
- Episode(
- href,
- name,
- season = 1,
- episode = index,
- )
- }
-
- return newTvSeriesLoadResponse(
- title,
- url,
- TvType.TvSeries,
- episodes.asSequence().filterNot { it.name == "Channel Name" }
- .filterNot { it.data == "https://www.crichd.com/link.php" }
- .filter { it.data.isNotEmpty() && it.name!!.isNotEmpty() }.toList()
- )
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
-
- val document = app.get(url = data, referer = "$mainUrl/").document
- val fidRegex = Regex("""fid="(.*)"; v_w""")
- document.select("table.mobile-hide > tbody:nth-child(1) a:not([target=_blank])")
- .mapNotNull {
- val html = app.get(it.attr("href"), referer = data)
- val fid = fidRegex.find(html.text)?.groupValues?.getOrNull(1).toString()
- val script = html.document.select("script").attr("src")
- val link =
- app.get(fixUrl(script)).text.substringAfter("src=\"").substringBefore("'+fid")
- val sourceDoc = app.get("$link$fid", referer = "$link$fid").text
- val srcRegex = Regex("""[(sourceUrl: ')|(source: ')](https?.*?.)',""")
- val source =
- srcRegex.find(sourceDoc)?.groupValues?.getOrNull(1).toString()
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- url = source,
- referer = link.substringBefore("embed.php"),
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
- return true
- }
-
- private fun fixUrl(url: String): String {
- if (url.isEmpty()) return ""
-
- if (url.startsWith("//")) {
- return "http:$url"
- }
- if (!url.startsWith("http")) {
- return "http://$url"
- }
- return url
- }
-}
diff --git a/GDJioTVProvider/build.gradle.kts b/GDJioTVProvider/build.gradle.kts
deleted file mode 100644
index c20c7aa..0000000
--- a/GDJioTVProvider/build.gradle.kts
+++ /dev/null
@@ -1,24 +0,0 @@
-version = 1
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- description = "JioTV channels"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 0 // will be 3 if unspecified
- tvTypes = listOf(
- "Live",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=tv.googledrivelinks.com&sz=%size%"
-}
diff --git a/GDJioTVProvider/src/main/AndroidManifest.xml b/GDJioTVProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/GDJioTVProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVPlugin.kt b/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVPlugin.kt
deleted file mode 100644
index 23c32e6..0000000
--- a/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVPlugin.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class GDJioTVPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(GDJioTVProvider())
-
- }
-}
diff --git a/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVProvider.kt b/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVProvider.kt
deleted file mode 100644
index 5f85819..0000000
--- a/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVProvider.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.Qualities
-import org.jsoup.nodes.Element
-
-class GDJioTVProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://tv.googledrivelinks.com"
- override var name = "GDJioTV"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = false
- override val supportedTypes = setOf(
- TvType.Live,
- )
-
- override suspend fun getMainPage(
- page: Int, request: MainPageRequest
- ): HomePageResponse {
-
- val document = app.get(mainUrl).document
- val home = document.select(".row .card").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(
- HomePageList(
- name = request.name,
- home,
- isHorizontalImages = true
- ))
- }
-
- private fun Element.toSearchResult(): SearchResponse {
- val title = this.selectFirst("p.card-text")?.text()?.trim().toString()
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("data-src"))
-
- return newMovieSearchResponse(title, title, TvType.Live) {
- this.posterUrl = posterUrl
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get(mainUrl).document
- return document.select(".row .card:contains($query)").map {
- it.toSearchResult()
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document =
- app.get(mainUrl).document.selectFirst(".card:contains(${url.substringAfterLast("/")})")
- val title = document?.selectFirst("p.card-text")?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.select("img").attr("data-src"))
- val href = fixUrl("$mainUrl/" + document.selectFirst("a")?.attr("href").toString())
- return newMovieLoadResponse(title, url, TvType.Live, href) {
- this.posterUrl = poster
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
- val document = app.get(data).document
- val link = "$mainUrl/${document.selectFirst("source")?.attr("src")}"
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- return true
- }
-}
\ No newline at end of file
diff --git a/IBommaProvider/build.gradle.kts b/IBommaProvider/build.gradle.kts
deleted file mode 100644
index 39300cd..0000000
--- a/IBommaProvider/build.gradle.kts
+++ /dev/null
@@ -1,25 +0,0 @@
-version = 3
-
-
-cloudstream {
- language = "te"
- // All of these properties are optional, you can safely remove them
-
- // description = "Lorem Ipsum"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=ww2.ibomma.cx&sz=%size%"
-}
diff --git a/IBommaProvider/src/main/AndroidManifest.xml b/IBommaProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/IBommaProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/IBommaProvider/src/main/kotlin/com/darkdemon/IBommaPlugin.kt b/IBommaProvider/src/main/kotlin/com/darkdemon/IBommaPlugin.kt
deleted file mode 100644
index b7a40c4..0000000
--- a/IBommaProvider/src/main/kotlin/com/darkdemon/IBommaPlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class IBommaPlugin : Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(IBommaProvider())
- }
-}
diff --git a/IBommaProvider/src/main/kotlin/com/darkdemon/IBommaProvider.kt b/IBommaProvider/src/main/kotlin/com/darkdemon/IBommaProvider.kt
deleted file mode 100644
index fe98eb1..0000000
--- a/IBommaProvider/src/main/kotlin/com/darkdemon/IBommaProvider.kt
+++ /dev/null
@@ -1,181 +0,0 @@
-package com.darkdemon
-
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
-import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
-import com.lagradost.cloudstream3.utils.*
-import com.lagradost.cloudstream3.utils.AppUtils.parseJson
-import org.jsoup.nodes.Element
-import java.net.URLEncoder
-
-class IBommaProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://ww2.ibomma.cx/telugu-movies"
- override var name = "IBomma"
- override val hasMainPage = true
- override var lang = "te"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie, TvType.TvSeries
- )
-
- //pages
- //"#content > div > article" //Latest
- //"#content > article:lt(6)" //web series
- //"#content > article:gt(5):lt(6)" //foreign dub
- //"#content > article:gt(11)" //addon
-
- override suspend fun getMainPage(
- page: Int, request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(mainUrl).document
- val pageSelectors = listOf(
- Pair("Latest", "#content > div > article"),
- Pair("Movies", "#content > article:nth-child(-n+13)"),
- )
- val pages = pageSelectors.apmap { (title, selector) ->
- val list = document.select(selector).mapNotNull {
- it.toSearchResult()
- }
- HomePageList(title, list)
- }
- return HomePageResponse(pages)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = this.selectFirst("a")?.text()?.trim() ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src"))
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- }
- }
-
- override suspend fun search(query: String): List? {
- val searchUrl = app.get(mainUrl).document.select(".mob-search form").attr("action")
- fun String.encodeUri() = URLEncoder.encode(this, "utf8")
- val document = app.get("$searchUrl?label=telugu&q=${query.encodeUri()}").document
- val scriptData = document.select("script").find { it.data().contains("data=") }?.data()
- ?.substringAfter("data= ")?.substringBefore("") ?: return null
- val response = parseJson(scriptData)
- return response.hits?.hitslist?.map {
- val title = it.source?.title?.substringBefore("Movie") ?: return null
- val posterUrl = it.source?.imageLink ?: return null
- val href = it.source?.location ?: return null
- newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- }
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
-
- val document = app.get(url).document
- val title = document.selectFirst(".entry-title-movie")?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.selectFirst(".single-poster img")?.attr("src"))
- val year = document.select(".entry-tags-movies span").text().trim().toIntOrNull()
- val tvType =
- if (document.select("#eplist").isNullOrEmpty()) TvType.Movie else TvType.TvSeries
- val description =
- document.selectFirst(".additional-info")?.text()?.trim()!!.replace("Synopsis: ", "")
- val trailer = fixUrlNull(document.select(".button-trailer a").attr("src"))
- //val rating = document.select("div.gmr-meta-rating > span:nth-child(3)").text().toRatingInt()
- val actors =
- document.select("div.clearfix.content-moviedata > div:nth-child(7) a").map { it.text() }
-
- return if (tvType == TvType.TvSeries) {
- val episodeUrls = getUrls(url) ?: return null
- val episodes = document.select("#eplist tr").mapNotNull { res ->
- val name = res.select("b").text().trim()
- //val season = name.substringAfter("S").substringBefore(' ').toInt()
- val episode = res.select("button").text().filter { it.isDigit() }.toInt()
- val href = episodeUrls[episode]
- Episode(
- data = href, name = name, episode = episode
- )
- }
-
- newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- rating
- addActors(actors)
- addTrailer(trailer)
- }
- } else {
- return newMovieLoadResponse(title, url, TvType.Movie, url) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- //this.tags = tags
- rating
- addActors(actors)
- addTrailer(trailer)
- }
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
-
- val urls: List = if (data.startsWith(mainUrl.substringBeforeLast("/"))) {
- app.get(data).document.selectFirst("#main > script:nth-child(6)")?.data()
- ?.substringAfter("const urls = [")?.substringBefore("]")?.trim()
- ?.replace(",'',", "")?.split(",")?.map { it -> it.trim() } ?: return false
- } else {
- listOf(data)
- }
- urls.forEach { url ->
- val domainUrl = url.substringAfter("'").substringBefore("/player")
- val document = app.get(
- url = url.replace("'", ""), referer = mainUrl.substringBeforeLast("/")
- ).document
- document.select("body script").mapNotNull {
- val srcRegex = Regex("""(file:")(https?.*?\.mp4)""")
- val source =
- srcRegex.find(it.select("script").toString())?.groupValues?.getOrNull(2)
- ?.toString()
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- source.toString(),
- referer = domainUrl,
- quality = Qualities.Unknown.value,
- )
- )
- }
- }
- return true
- }
-
- private suspend fun getUrls(url: String): List? {
-
- return app.get(url).document.selectFirst("#ib-4-f > script:nth-child(4)")?.data()
- ?.substringAfter("const urls = [")?.substringBefore("]")?.trim()?.replace(",'',", "")
- ?.split(",")?.toList()
- }
-
- data class Response(
- @JsonProperty("hits") var hits: Hits? = Hits()
- )
-
- data class Hits(
- @JsonProperty("hits") var hitslist: ArrayList = arrayListOf()
- )
-
- data class HitsList(
- @JsonProperty("_source") var source: Source? = Source()
- )
-
- data class Source(
- @JsonProperty("location") var location: String? = null,
- @JsonProperty("title") var title: String? = null,
- @JsonProperty("image_link") var imageLink: String? = null,
- )
-}
\ No newline at end of file
diff --git a/MHDTVProvider/src/main/kotlin/com/darkdemon/MHDTVProvider.kt b/MHDTVProvider/src/main/kotlin/com/darkdemon/MHDTVProvider.kt
index a5b7422..2629989 100644
--- a/MHDTVProvider/src/main/kotlin/com/darkdemon/MHDTVProvider.kt
+++ b/MHDTVProvider/src/main/kotlin/com/darkdemon/MHDTVProvider.kt
@@ -12,7 +12,7 @@ import org.jsoup.nodes.Element
import kotlin.math.floor
class MHDTVProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://mhdtvworld.xyz"
+ override var mainUrl = "https://mhdtvworld.me"
override var name = "MHDTVWorld"
override val hasMainPage = true
override var lang = "hi"
diff --git a/MovieModProvider/build.gradle.kts b/MovieModProvider/build.gradle.kts
deleted file mode 100644
index 182d937..0000000
--- a/MovieModProvider/build.gradle.kts
+++ /dev/null
@@ -1,26 +0,0 @@
-version = 1
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- //description = "This website support English/Hindi/Kannada/Malayalam/Tamil/Telugu"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- "Anime"
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=moviesmod.net&sz=%size%"
-}
diff --git a/MovieModProvider/src/main/AndroidManifest.xml b/MovieModProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 36bb4af..0000000
--- a/MovieModProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/MovieModProvider/src/main/kotlin/com/darkdemon/MoviesModPlugin.kt b/MovieModProvider/src/main/kotlin/com/darkdemon/MoviesModPlugin.kt
deleted file mode 100644
index 604da77..0000000
--- a/MovieModProvider/src/main/kotlin/com/darkdemon/MoviesModPlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.darkdemon
-
-import android.content.Context
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-
-@CloudstreamPlugin
-class MoviesModPlugin : Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(MoviesModProvider())
- }
-}
diff --git a/MovieModProvider/src/main/kotlin/com/darkdemon/MoviesModProvider.kt b/MovieModProvider/src/main/kotlin/com/darkdemon/MoviesModProvider.kt
deleted file mode 100644
index 0a0eebc..0000000
--- a/MovieModProvider/src/main/kotlin/com/darkdemon/MoviesModProvider.kt
+++ /dev/null
@@ -1,267 +0,0 @@
-package com.darkdemon
-
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.Qualities
-import org.jsoup.nodes.Element
-
-class MoviesModProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://moviesmod.net"
- override var name = "MoviesMod"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- TvType.TvSeries,
- TvType.Anime
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/latest-released/page/" to "Popular Movies",
- "$mainUrl/movies/adult-movies/page/" to "Adult Movies",
- "$mainUrl/tv-series/page/" to "Popular Series",
- "$mainUrl/k-drama/page/" to "K-Drama",
- "$mainUrl/tv-series/hindi-tv-show/" to "Hindi Series",
- "$mainUrl/tv-series/english-tv-shows/page/" to "English Series",
- "$mainUrl/french-web-series/page/" to "French Series",
- "$mainUrl/spanish-series/page/" to "Spanish",
- "$mainUrl/anime/page/" to "Anime"
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(request.data + page).document
- val home = document.select("article").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(request.name, home)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = this.selectFirst("h2")?.text()?.replace("""(\(.*${'$'})""".toRegex(), "")
- ?.replace("Download", "")?.trim() ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(getImageSrc(this.selectFirst("img")!!))
- val quality = getQualityFromString(title)
-
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- this.quality = quality
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query").document
-
- return document.select(".post-item").mapNotNull {
- it.toSearchResult()
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
- val title =
- document.selectFirst(".thecontent li")?.text()?.trim()?.replace("Full Name: ", "")
- ?: return null
- val year = """\((\d{4})""".toRegex()
- .find(document.select(".entry-title").text())?.groupValues?.get(1)
- ?.toIntOrNull()
- val description = document.selectFirst(".thecontent > p:nth-child(8)")?.text()?.trim()
- val tvType = if (url.contains("season")) TvType.TvSeries else TvType.Movie
- val href1 =
- if (tvType == TvType.Movie) document.select("h4:contains(1080p), h4:contains(720p)") else document.select(
- "h3:contains(1080p):contains(S0),h3:contains(1080p):contains(Season), h3:contains(720p):contains(S0),h3:contains(720p):contains(Season)"
- )
- val episodeslist = mutableMapOf>()
- var num = 0
- val episodeUrls = mutableMapOf>()
-
- val movieLinks = mutableListOf()
- if (tvType == TvType.TvSeries) {
- href1.associate {
- it.text() to it.nextElementSibling()?.firstChild()?.attr("href")
- }.filterValues { it != null }
- .filterValues { it!!.contains("https://episodes.modlinks.xyz") }.map { (k, v) ->
- val s = """S(\d+)|.eason\s(\d+)""".toRegex().find(k)?.groupValues?.get(0)
- ?.filter { it.isDigit() }?.toInt()!!
-
- if (num == s) episodeUrls[s]?.plusAssign(v!!)
- else {
- num = s
- episodeUrls[s] = mutableListOf(v!!)
- }
- }
- val episodes = mutableListOf()
- episodeUrls.forEach { (season, urls) ->
- var count = 0
- urls.forEach { url ->
- app.get(url).document.select("h3").mapNotNull { res ->
- val episode = res.select("strong").text().filter { it.isDigit() }.toInt()
- val href = res.select("a").attr("href")
- if (count == season) episodeslist[episode]?.plusAssign(href) else {
- episodeslist[episode] = mutableListOf(href)
- }
- }
- count = season
- }
- episodeslist.forEach { (e, u) ->
- episodes += Episode(
- data = u.toString(),
- episode = e,
- season = season
- )
- }
- }
- return newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) {
- this.year = year
- this.plot = description
- }
-
- } else {
- href1.associate {
- it.text() to it.nextElementSibling()?.firstChild()?.attr("href")
- }.filterValues { it != null }
- .filterValues { it!!.contains("modlinks.xyz") }.map { (k, v) ->
- val s =
- """(1080)""".toRegex().find(k)?.groupValues?.get(0)?.filter { it.isDigit() }
- ?.toInt()!!
- if (num == s) episodeUrls[s]?.plusAssign(v!!)
- else {
- num = s
- episodeUrls[s] = mutableListOf(v!!)
- }
- }
- episodeUrls[1080]?.map { u ->
- movieLinks += app.get(u).document.select("a:contains(Fast Server),a:contains(Google Drive)")
- .mapNotNull { it.attr("href") }
- }
- return newMovieLoadResponse(title, url, TvType.Movie, movieLinks) {
- //this.posterUrl = poster
- this.year = year
- this.plot = description
- }
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
-
- data.splitToSequence(",").toList().forEach {
- val url = it.replace("\"", "").replace("[", "").replace("]", "")
- val source =
- if (it.contains("https://href.li/?")) driveHub(bypassHrefli(url)!!) else driveHub(
- url
- )
- if (source.contains("404")) return@forEach else
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- source,
- "",
- quality = Qualities.P1080.value,
- )
- )
- }
- return true
- }
-
- private suspend fun bypassHrefli(url: String): String? {
- val direct = url.removePrefix("https://href.li/?")
-
- val res = app.get(direct).document
- val formLink = res.select("form#landing").attr("action")
- val wpHttp = res.select("input[name=_wp_http]").attr("value")
-
- val res2 = app.post(formLink, data = mapOf("_wp_http" to wpHttp)).document
- val formLink2 = res2.select("form#landing").attr("action")
- val wpHttp2 = res2.select("input[name=_wp_http2]").attr("value")
- val token = res2.select("input[name=token]").attr("value")
-
- val res3 = app.post(
- formLink2, data = mapOf(
- "_wp_http2" to wpHttp2, "token" to token
- )
- ).document
-
- val script = res3.selectFirst("script:containsData(verify_button)")?.data()
- val directLink = script?.substringAfter("\"href\",\"")?.substringBefore("\")")
- val matchCookies =
- Regex("sumitbot_\\('(\\S+?)',\n|.?'(\\S+?)',").findAll(script ?: return null).map {
- it.groupValues[1] to it.groupValues[2]
- }.toList()
-
- val cookeName = matchCookies.firstOrNull()?.second ?: return null
- val cookeValue = matchCookies.lastOrNull()?.second ?: return null
-
- val cookies = mapOf(
- cookeName to cookeValue
- )
- return app.get(
- directLink ?: return null,
- cookies = cookies
- ).document.selectFirst("meta[http-equiv=refresh]")?.attr("content")?.substringAfter("url=")
- }
-
- private suspend fun driveHub(url: String): String {
- val domain =
- if (url.startsWith("https://drivehub.in")) "https://drivehub.in" else "http://driveroot.in"
- val path =
- app.get(url, allowRedirects = true).text.substringAfter("/").substringBefore("\"")
- if (path.contains("404")) return path
- val html = app.get("$domain/$path")
- val cookies = html.cookies
- val key = """key",\s+"(.*?)"""".toRegex().find(
- html.document.select("body > script:nth-child(8)").toString()
- )?.groupValues?.get(1)!!
- val fileId = html.document.select("div.card-body > div:nth-child(2) > a").attr("href")
- .substringAfterLast("/")
- val link = app.post(
- url = "$domain/file/${fileId}",
- cookies = cookies,
- data = mapOf(
- "action" to "direct",
- "key" to key,
- ),
- headers = mapOf(
- "Content-Type" to "multipart/form-data; boundary=----",
- "x-token" to domain.substringAfter("//")
- ),
- referer = "$domain/file/${fileId}"
- ).parsed().url
- return """worker_link\s=\s'(.*mkv)""".toRegex().find(
- app.get(link).document.select("body > script:nth-child(7)").toString()
- )?.groupValues?.get(1).toString()
- }
-
- private fun getImageSrc(tag: Element): String {
- var image = ""
- val src = tag.attr("src")
- val lazySrc = tag.attr("data-pagespeed-lazy-src")
- val highResSrc = tag.attr("data-pagespeed-high-res-src")
- if (!src.isNullOrEmpty() and !src.startsWith("data") and !src.contains(".gif")) {
- image = tag.attr("src")
- } else if (!lazySrc.isNullOrEmpty() and !lazySrc.startsWith("data") and !lazySrc.contains(".gif")) {
- image = tag.attr("data-pagespeed-lazy-src")
- } else if (!highResSrc.isNullOrEmpty() and !highResSrc.startsWith("data") and !highResSrc.contains(
- ".gif"
- )
- ) {
- image = tag.attr("data-pagespeed-high-res-src")
- }
- return image
- }
-
- data class DriveHub(
- @JsonProperty("url") var url: String
-
- )
-}
diff --git a/NPJioTVProvider/build.gradle.kts b/NPJioTVProvider/build.gradle.kts
deleted file mode 100644
index 995f0a0..0000000
--- a/NPJioTVProvider/build.gradle.kts
+++ /dev/null
@@ -1,24 +0,0 @@
-version = 2
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- description = "JioTV Plus channels"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 0 // will be 3 if unspecified
- tvTypes = listOf(
- "Live",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=nayeemparvez.chadasaniya.cf&sz=%size%"
-}
diff --git a/NPJioTVProvider/src/main/AndroidManifest.xml b/NPJioTVProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/NPJioTVProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVPlugin.kt b/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVPlugin.kt
deleted file mode 100644
index 9982619..0000000
--- a/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVPlugin.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class NPJioTVPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(NPJioTVProvider())
-
- }
-}
diff --git a/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVProvider.kt b/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVProvider.kt
deleted file mode 100644
index 4d24375..0000000
--- a/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVProvider.kt
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.Qualities
-
-class NPJioTVProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://nayeemparvez.chadasaniya.ml"
- override var name = "NPJioTV+"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = false
- override val supportedTypes = setOf(
- TvType.Live,
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val categories = listOf(
- "Sports",
- "Entertainment",
- "Movies",
- "News",
- "Music",
- "Kids",
- "Infotainment",
- "Lifestyle",
- "Business",
- "Devotional",
- "Educational",
- "JioDarshan",
- "Shopping",
- )
- val items = ArrayList()
- val document = app.get(mainUrl).document
- categories.forEach { cat ->
- val results: MutableList = mutableListOf()
- document.select(".card-parent .card:contains($cat)").mapNotNull {
- val title = it.selectFirst("h5")?.text()?.trim() ?: return@mapNotNull
- val posterUrl = fixUrlNull(it.selectFirst("img")?.attr("data-src"))
- results.add(
- newMovieSearchResponse(title, title, TvType.Live) {
- this.posterUrl = posterUrl
- }
- )
- }
- items.add(
- HomePageList(
- capitalizeString(cat),
- results,
- isHorizontalImages = true
- )
- )
- }
- return HomePageResponse(items)
- }
-
- override suspend fun search(query: String): List {
- val document = app.get(mainUrl).document
- val elements = document.select(".card-parent .card h5:contains($query)").map { it.parent()
- ?.parent() }
- return elements.map {
- val title = it?.selectFirst("h5")?.text()?.trim().toString()
- val posterUrl = fixUrlNull(it?.selectFirst("img")?.attr("data-src"))
- newMovieSearchResponse(title, title, TvType.Live) {
- this.posterUrl = posterUrl
- }
- }
- }
-
- override suspend fun load(url: String): LoadResponse {
- val document = app.get(mainUrl).document.selectFirst(".card:contains(${url.substringAfterLast("/")})")
- val title = url.substringAfterLast("/")
- val poster = fixUrlNull(document?.select("img")?.attr("data-src"))
- val href = fixUrl("$mainUrl/" + document?.selectFirst("a")?.attr("href").toString())
- return newMovieLoadResponse(title, url, TvType.Live, href) {
- this.posterUrl = poster
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
- val document = app.get(data).document
- val link = "$mainUrl/${document.selectFirst("source")?.attr("src")}"
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- return true
- }
-}
\ No newline at end of file
diff --git a/NollyVerseProvider/build.gradle.kts b/NollyVerseProvider/build.gradle.kts
deleted file mode 100644
index 103fa98..0000000
--- a/NollyVerseProvider/build.gradle.kts
+++ /dev/null
@@ -1,26 +0,0 @@
-version = 1
-
-
-cloudstream {
- language = "en"
- // All of these properties are optional, you can safely remove them
-
- // description = "Lorem Ipsum"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- "AsianDrama"
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=nollyverse.com&sz=%size%"
-}
diff --git a/NollyVerseProvider/src/main/AndroidManifest.xml b/NollyVerseProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/NollyVerseProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/NollyVerseProvider/src/main/kotlin/com/darkdemon/NollyVersePlugin.kt b/NollyVerseProvider/src/main/kotlin/com/darkdemon/NollyVersePlugin.kt
deleted file mode 100644
index 24491ad..0000000
--- a/NollyVerseProvider/src/main/kotlin/com/darkdemon/NollyVersePlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class NollyVersePlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(NollyVerseProvider())
- }
-}
diff --git a/NollyVerseProvider/src/main/kotlin/com/darkdemon/NollyVerseProvider.kt b/NollyVerseProvider/src/main/kotlin/com/darkdemon/NollyVerseProvider.kt
deleted file mode 100644
index 62f1c92..0000000
--- a/NollyVerseProvider/src/main/kotlin/com/darkdemon/NollyVerseProvider.kt
+++ /dev/null
@@ -1,212 +0,0 @@
-package com.darkdemon
-
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
-import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
-import com.lagradost.cloudstream3.utils.*
-import com.lagradost.cloudstream3.utils.AppUtils.parseJson
-import org.jsoup.nodes.Element
-
-class NollyVerseProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://www.nollyverse.com"
- override var name = "NollyVerse"
- override val hasMainPage = true
- override var lang = "en"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- TvType.TvSeries,
- TvType.AsianDrama
- )
-
- private fun serializeData(element: Element): List {
-
- val parsed = element.select("td").mapNotNull {
- try {
- val name = if (element.select("tr > td:eq(0)").text()
- .contains("Episode", ignoreCase = true)
- ) it.text()
- else it.select("a").text()
- val url = it.select("a").attr("href")
- NollyVerseLink(name, url)
- } catch (e: Exception) {
- NollyVerseLink("", "")
- }
- }.filter { it.link != "" && it.name != "" }
- return parsed.reversed()
- }
-
- data class NollyVerseLink(
- @JsonProperty("name") val name: String,
- @JsonProperty("url") val link: String
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/category/latest-movies/page/" to "Latest Movies",
- "$mainUrl/category/new-series/page/" to "Latest Series",
- "$mainUrl/category/popular-movies/page/" to "Popular Movies",
- "$mainUrl/category/korean-movies/page/" to "Korean Movies",
- "$mainUrl/category/korean-series/page/" to "Korean Series"
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(request.data + page).document
- val selector = if (request.data.contains("korean")) {
- ".col-md-8 .post"
- } else if (request.data.contains("popular")) {
- ".col-md-8 .post"
- } else {
- ".post-row"
- }
- val home = document.select(selector).mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(
- list = HomePageList(
- name = request.name,
- list = home,
- isHorizontalImages = true
- ),
- hasNext = true
- )
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = this.selectFirst(".post-title a")?.text()?.trim() ?: return null
- val href = fixUrl(this.selectFirst(".post-img")?.attr("href").toString())
- val posterUrl = if (fixUrlNull(
- this.selectFirst(".post-img img")?.attr("src")
- )?.contains("blank") == true
- ) fixUrlNull(
- this.selectFirst(".post-img img")
- ?.attr("data-src")
- ) else fixUrlNull(this.selectFirst(".post-img img")?.attr("src"))
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.post(
- url = "$mainUrl/livesearch.php",
- headers = mapOf(
- "X-Requested-With" to "XMLHttpRequest",
- "Content-Type" to "application/x-www-form-urlencoded; charset=UTF-8"
- ),
- data = mapOf("name" to query)
- ).document
- return document.select("a").mapNotNull {
- val title = it.text().trim()
- val href = fixUrl(it.attr("href").toString())
- val posterUrl =
- fixUrlNull("https://i.ibb.co/fdnLwRf/istockphoto-1071359118-612x612.jpg")
- val tvtype = if (href.contains("serie")) TvType.TvSeries else TvType.Movie
- newMovieSearchResponse(title, href, tvtype) {
- this.posterUrl = posterUrl
- }
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
- val title = document.select("ol li").last()?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.selectFirst("meta[itemprop=image]")?.attr("content"))
- val tags =
- document.select("p:contains(Genre:)").text().substringAfter(" ").split(",").map { it }
- val year = Regex("([0-9]{4}?)").find(
- document.select("p:contains(Release Date:)").text().toString()
- )?.groupValues?.get(1)?.toIntOrNull()
- val tvType = if (document.select("table")
- .isNullOrEmpty()
- ) TvType.Movie else TvType.TvSeries
- val description = document.selectFirst(".blockquote > small")?.text()?.trim()
- val trailer = fixUrlNull(
- "https://www.youtube.com/embed/" + document.selectFirst(".youtube")?.attr("data-embed")
- )
- val actors =
- document.select("p:contains(Stars:)").text().substringAfter(": ").split(",").map { it }
- val recommendations = document.select(".galery-widget ul a").mapNotNull {
- val title =
- document.selectFirst("img")?.attr("alt")?.substringBefore("-") ?: return null
- val href = fixUrl(document.attr("href").toString())
- val posterUrl = fixUrlNull(document.selectFirst("img")?.attr("src"))
- newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- }
- }
-
- return if (tvType == TvType.TvSeries) {
- val seasons = document.select("tr a.btn-sm").mapNotNull { it.attr("href") }
- val episodes = ArrayList()
- for (s in seasons) {
- val document = app.get(s).document
- document.select("tbody tr").mapNotNull {
- val season = s.substringAfter("-").toIntOrNull()
- val links = it
- val data = serializeData(links)
- episodes.add(newEpisode(data) {
- this.season = season
- this.episode = episode
- })
- }
- }
- episodes.reverse()
- newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- this.rating = rating
- addActors(actors)
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- } else {
- val doc = app.get(document.select(".section-row .row a").attr("href")).document
- val serialize =
- doc.selectFirst("tbody") ?: throw ErrorLoadingException("No links found")
- newMovieLoadResponse(title, url, TvType.Movie, serializeData(serialize)) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- addActors(actors)
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
-
- val links = parseJson>(data)
- for (link in links) {
- val parsedLink = if (link.link.contains("anonfiles.com")) {
- app.get(link.link).document.selectFirst("#download-url")?.attr("href")
- } else {
- link.link
- } ?: return false
- val urlName = Regex("([0-9]+p)").find(parsedLink)?.groupValues?.get(1).toString()
- callback.invoke(
- ExtractorLink(
- this.name,
- urlName,
- parsedLink,
- "",
- getQualityFromName(parsedLink),
- false
- )
- )
- }
- return true
- }
-}
diff --git a/OnlineMoviesHinditProvider/build.gradle.kts b/OnlineMoviesHinditProvider/build.gradle.kts
deleted file mode 100644
index 77ec5bf..0000000
--- a/OnlineMoviesHinditProvider/build.gradle.kts
+++ /dev/null
@@ -1,25 +0,0 @@
-version = 1
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- // description = "Lorem Ipsum"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=111.90.159.132&sz=%size%"
-}
diff --git a/OnlineMoviesHinditProvider/src/main/AndroidManifest.xml b/OnlineMoviesHinditProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/OnlineMoviesHinditProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/OnlineMoviesHinditProvider/src/main/kotlin/com/darkdemon/OnlineMoviesHindiPlugin.kt b/OnlineMoviesHinditProvider/src/main/kotlin/com/darkdemon/OnlineMoviesHindiPlugin.kt
deleted file mode 100644
index 7ca7165..0000000
--- a/OnlineMoviesHinditProvider/src/main/kotlin/com/darkdemon/OnlineMoviesHindiPlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class OnlineMoviesHindiPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(OnlineMoviesHindiProvider())
- }
-}
diff --git a/OnlineMoviesHinditProvider/src/main/kotlin/com/darkdemon/OnlineMoviesHindiProvider.kt b/OnlineMoviesHinditProvider/src/main/kotlin/com/darkdemon/OnlineMoviesHindiProvider.kt
deleted file mode 100644
index c8d601c..0000000
--- a/OnlineMoviesHinditProvider/src/main/kotlin/com/darkdemon/OnlineMoviesHindiProvider.kt
+++ /dev/null
@@ -1,137 +0,0 @@
-
-package com.darkdemon
-
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
-import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
-import com.lagradost.cloudstream3.utils.*
-import org.jsoup.nodes.Element
-
-class OnlineMoviesHindiProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://111.90.159.132"
- override var name = "Online Movies Hindi"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- TvType.TvSeries
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/year/2022/page/" to "Latest Movies",
- "$mainUrl/best-rating/page/" to "Popular Movies",
- "$mainUrl/hollywood-movies/page/" to "Hollywood Movies",
- "$mainUrl/bollywood-movies/page/" to "Bollywood Movies",
- "$mainUrl/tv-show/page/" to "TV Shows"
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(request.data + page).document
- val home = document.select("article").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(request.name, home)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = this.selectFirst("p.entry-title")?.text()?.trim() ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("article img")?.attr("src"))
-
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query&post_type%5B%5D=post&post_type%5B%5D=tv").document
-
- return document.select("article").mapNotNull {
- it.toSearchResult()
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
-
- val title = document.selectFirst("h2.entry-title")?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.selectFirst("div.gmr-movie-data img")?.attr("src"))
- val year = document.select("div.gmr-moviedata time").text().trim().split(" ").last()
- .toIntOrNull()
- val tvType = if (document.selectFirst("div.gmr-listseries a")?.text()
- ?.contains(Regex("(?i)(Eps\\s?[0-9]+)|(episode\\s?[0-9]+)")) == true
- ) TvType.TvSeries else TvType.Movie
- val description = document.selectFirst("div.entry-content p")?.text()?.trim()
- val trailer = fixUrlNull(document.select("iframe").attr("src"))
- val rating = document.select("div.gmr-meta-rating > span:nth-child(3)").text().toRatingInt()
- val actors = document.select("div.clearfix.content-moviedata > div:nth-child(7) a").map { it.text() }
- val recommendations = document.select("article").mapNotNull {
- it.toSearchResult()
- }
-
- return if (tvType == TvType.TvSeries) {
- val episodes = document.select("div.gmr-listseries a").mapNotNull {
- val href = fixUrl(it.attr("href")?: return null)
- val name = it.text()?.trim()?: return null
- val season = name.substringAfter("S").substringBefore(' ').toInt() ?: return null
- val episode = name.substringAfterLast("Eps").toInt()?: return null
- Episode(
- href,
- name,
- season,
- episode
- )
- }
-
- newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.rating = rating
- addActors(actors)
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- } else {
- newMovieLoadResponse(title, url, TvType.Movie, url) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- //this.tags = tags
- this.rating = rating
- addActors(actors)
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
-
- val document = app.get(data).document
- document.select("video source").map { res ->
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- res.attr("src") ,
- referer = data,
- quality = Qualities.Unknown.value,
- //headers = mapOf("Range" to "bytes=0-"),
- )
- )
- }
- return true
- }
-
-
-}
diff --git a/PrmoviesProvider/build.gradle.kts b/PrmoviesProvider/build.gradle.kts
deleted file mode 100644
index 233ea7c..0000000
--- a/PrmoviesProvider/build.gradle.kts
+++ /dev/null
@@ -1,25 +0,0 @@
-version = 6
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- // description = "Lorem Ipsum"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=prmovies.bio&sz=%size%"
-}
diff --git a/PrmoviesProvider/src/main/AndroidManifest.xml b/PrmoviesProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/PrmoviesProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/PrmoviesProvider/src/main/kotlin/com/darkdemon/PrmoviesPlugin.kt b/PrmoviesProvider/src/main/kotlin/com/darkdemon/PrmoviesPlugin.kt
deleted file mode 100644
index ce4b3e7..0000000
--- a/PrmoviesProvider/src/main/kotlin/com/darkdemon/PrmoviesPlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class PrmoviesPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(PrmoviesProvider())
- }
-}
diff --git a/PrmoviesProvider/src/main/kotlin/com/darkdemon/PrmoviesProvider.kt b/PrmoviesProvider/src/main/kotlin/com/darkdemon/PrmoviesProvider.kt
deleted file mode 100644
index 7127bb5..0000000
--- a/PrmoviesProvider/src/main/kotlin/com/darkdemon/PrmoviesProvider.kt
+++ /dev/null
@@ -1,170 +0,0 @@
-// https://github.com/hexated/cloudstream-extensions-hexated/blob/master/YomoviesProvider/src/main/kotlin/com/hexated/YomoviesProvider.kt
-
-package com.darkdemon
-
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
-import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
-import com.lagradost.cloudstream3.mvvm.safeApiCall
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.loadExtractor
-import org.jsoup.nodes.Element
-
-class PrmoviesProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://prmovies.bio"
- override var name = "Prmovies"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- TvType.TvSeries
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/most-favorites/page/" to "Most Viewed",
- "$mainUrl/director/netflix/page/" to "Netflix",
- "$mainUrl/director/amazon-prime/page/" to "Amazon Prime",
- "$mainUrl/director/altbalaji/page/" to "Alt Balaji",
- "$mainUrl/director/zee5/page/" to "Zee5",
- "$mainUrl/director/voot-originals/page/" to "Voot Originals",
- "$mainUrl/director/sonyliv-original/page/" to "Sonyliv Originals",
- "$mainUrl/director/hotstar/page/" to "Hotstar",
- "$mainUrl/director/viu-originals/page/" to "Viu Originals",
- "$mainUrl/director/discovery/page/" to "Discovery"
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = if (page == 1) {
- app.get(request.data.removeSuffix("page/")).document
- } else {
- app.get(request.data + page).document
- }
- val home = document.select("div.ml-item").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(request.name, home)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = this.selectFirst("h2")?.text()?.trim() ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("data-original"))
-
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query").document
-
- return document.select("div.ml-item").mapNotNull {
- it.toSearchResult()
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
-
- val title = document.selectFirst("div.mvic-desc h3")?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.selectFirst("div.thumb.mvic-thumb img")?.attr("src"))
- val tags = document.select("div.mvici-left p:nth-child(1) a").map { it.text() }
- val year = document.select("div.mvici-right p:nth-child(3) a").text().trim()
- .toIntOrNull()
- val tvType = if (document.selectFirst("div.les-content")
- ?.select("a")?.size!! > 1 || document.selectFirst("ul.idTabs li strong")?.text()
- ?.contains(Regex("(?i)(EP\\s?[0-9]+)|(episode\\s?[0-9]+)")) == true
- ) TvType.TvSeries else TvType.Movie
- val description = document.selectFirst("p.f-desc")?.text()?.trim()
- val trailer = fixUrlNull(document.select("iframe#iframe-trailer").attr("src"))
- val rating = document.select("div.mvici-right > div.imdb_r span").text().toRatingInt()
- val actors = document.select("div.mvici-left p:nth-child(3) a").map { it.text() }
- val recommendations = document.select("div.ml-item").mapNotNull {
- it.toSearchResult()
- }
-
- return if (tvType == TvType.TvSeries) {
- val episodes = if (document.selectFirst("div.les-title strong")?.text().toString()
- .contains(Regex("(?i)EP\\s?[0-9]+|Episode\\s?[0-9]+"))
- ) {
- document.select("ul.idTabs li").map {
- val id = it.select("a").attr("href")
- Episode(
- data = fixUrl(document.select("div$id iframe").attr("src")),
- name = it.select("strong").text().replace("Server Ep", "Episode")
- )
- }
- } else {
- document.select("div.les-content a").map {
- Episode(
- data = it.attr("href"),
- name = it.text().replace("Server Ep", "Episode").trim(),
- )
- }
- }
-
- newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- this.rating = rating
- addActors(actors)
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- } else {
- newMovieLoadResponse(title, url, TvType.Movie, url) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- this.rating = rating
- addActors(actors)
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
-
- if (data.startsWith(mainUrl)) {
- app.get(data).document.select("div.movieplay iframe").map { fixUrl(it.attr("src")) }
- .apmap { source ->
- safeApiCall {
- when {
- source.startsWith("https://membed.net") -> app.get(
- source,
- referer = "$mainUrl/"
- ).document.select("ul.list-server-items li")
- .apmap {
- loadExtractor(
- it.attr("data-video").substringBefore("=https://msubload"),
- "$mainUrl/",
- subtitleCallback,
- callback
- )
- }
- else -> loadExtractor(source, "$mainUrl/", subtitleCallback, callback)
- }
- }
- }
- } else {
- loadExtractor(data, "$mainUrl/", subtitleCallback, callback)
- }
-
- return true
- }
-
-
-}
diff --git a/SnehIPTVProvider/build.gradle.kts b/SnehIPTVProvider/build.gradle.kts
deleted file mode 100644
index 0472067..0000000
--- a/SnehIPTVProvider/build.gradle.kts
+++ /dev/null
@@ -1,24 +0,0 @@
-version = 2
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- description = "This extension provide live channels from Sonyliv, Voot and Jiotv"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 0 // will be 3 if unspecified
- tvTypes = listOf(
- "Live",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=snehiptv.netlify.app&sz=%size%"
-}
diff --git a/SnehIPTVProvider/src/main/AndroidManifest.xml b/SnehIPTVProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/SnehIPTVProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVPlugin.kt b/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVPlugin.kt
deleted file mode 100644
index 082cb25..0000000
--- a/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVPlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class SnehIPTVPlugin : Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(SnehIPTVProvider())
- }
-}
diff --git a/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVProvider.kt b/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVProvider.kt
deleted file mode 100644
index 2fe9a5a..0000000
--- a/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVProvider.kt
+++ /dev/null
@@ -1,145 +0,0 @@
-package com.darkdemon
-
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.utils.*
-import com.lagradost.cloudstream3.utils.AppUtils.parseJson
-
-class SnehIPTVProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://snehiptv.netlify.app"
- override var name = "SnehIPTV"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = false
- override val supportedTypes = setOf(
- TvType.Live
- )
-
- data class IPTV(
- @JsonProperty("id") var id: String? = null,
- @JsonProperty("tvgLogo") var tvgLogo: String? = null,
- @JsonProperty("title") var title: String? = null,
- @JsonProperty("url") var url: String? = null,
- @JsonProperty("url1") var url1: String? = null
- )
-
- private suspend fun getScriptData(url: String): String {
- val html = app.get(url).document
- val script = html.select("script").last()?.attr("src")
- val doc = app.get("$mainUrl$script").text
- return doc.substringAfter("JSON.parse('").substringBefore("')},:")
- }
-
- override suspend fun getMainPage(
- page: Int, request: MainPageRequest
- ): HomePageResponse {
-
- val categories = listOf(
- "dplus",
- "hungama",
- "sonyliv",
- "voot",
- "sunxt",
- "sports",
- "entertainment",
- "movies",
- "news",
- "music",
- "kids",
- "infotainment",
- "lifestyle",
- "business",
- "educational",
- "devotional"
-
- )
- val items = ArrayList()
- val scriptData = getScriptData(mainUrl)
- val response = parseJson>(scriptData)
- categories.forEach { cat ->
- val query = if (cat == "hungama") "hgmtv" else cat
- val results: MutableList = mutableListOf()
- val filtered = response.filter { it.title?.lowercase()?.contains(query) == true }
- filtered.forEach {
- val title = it.title?.replace(regex = "\\s\\[[A-Za-z]+]$".toRegex(), "").toString()
- val posterUrl = it.tvgLogo.toString()
- results.add(
- newMovieSearchResponse(title, title, TvType.Live) {
- this.posterUrl = posterUrl
- }
- )
- }
- items.add(
- HomePageList(
- capitalizeString(cat),
- results,
- isHorizontalImages = true
- )
- )
- }
- return HomePageResponse(items)
- }
-
- override suspend fun search(query: String): List {
-
- val scriptData = getScriptData(mainUrl)
- val response = parseJson>(scriptData)
- val searchResults =
- response.filter { it.title?.lowercase()?.contains(query.lowercase()) == true }
- return searchResults.map {
- val title = it.title?.replace(regex = "\\s\\[[A-Za-z]+]$".toRegex(), "").toString()
- val posterUrl = it.tvgLogo.toString()
- newMovieSearchResponse(title, title, TvType.Live) {
- this.posterUrl = posterUrl
- }
- }
- }
-
- override suspend fun load(url: String): LoadResponse {
-
- val scriptData = getScriptData(mainUrl)
- val response = parseJson>(scriptData)
- val searchResults =
- response.filter { it.title?.contains(url.substringAfterLast("/")) == true }
- val title =
- searchResults[0].title?.replace(regex = "\\s\\[[A-Za-z]+]$".toRegex(), "").toString()
- val posterUrl = searchResults[0].tvgLogo.toString()
- val href =
- if (searchResults[0].url.isNullOrEmpty()) searchResults[0].url1 else searchResults[0].url
- return newMovieLoadResponse(title, url, TvType.Live, href) {
- this.posterUrl = posterUrl
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
- val link = if (data.contains("sonyliv") || data.contains("sunxt")) {
- app.get(data).document.selectFirst(".movie__credits a")?.attr("href").toString()
- } else if (data.contains("voot")) {
- app.get(data).document.selectFirst("source")?.attr("src").toString()
- } else {
- val html = app.get(data)
- if ( html.document.selectFirst("source")?.attr("src")
- !!.startsWith("http")
- ) html.document.selectFirst("source")
- ?.attr("src") else html.url.substringBeforeLast("/") + "/${
- html.document.selectFirst("source")?.attr("src")
- }"
- }.toString()
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- return true
- }
-}
diff --git a/SoraJioTVProvider/build.gradle.kts b/SoraJioTVProvider/build.gradle.kts
deleted file mode 100644
index 79653fd..0000000
--- a/SoraJioTVProvider/build.gradle.kts
+++ /dev/null
@@ -1,24 +0,0 @@
-version = 2
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- description = " JioTV streams from different available sources"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "Live",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=jiotv.com&sz=%size%"
-}
diff --git a/SoraJioTVProvider/src/main/AndroidManifest.xml b/SoraJioTVProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/SoraJioTVProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVExtractor.kt b/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVExtractor.kt
deleted file mode 100644
index 6b841e5..0000000
--- a/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVExtractor.kt
+++ /dev/null
@@ -1,190 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.app
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.Qualities
-
-
-// credits: hexated
-//
-object SoraJioTVExtractor: SoraJioTVProvider() {
-
- fun invokeGDL(
- id: String? = null,
- callback: (ExtractorLink) -> Unit
- ){
- val link = "$GDLJioTV/autoq.php?c=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "GDLJioTV",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
-
- fun invokeFS(
- id: String? = null,
- callback: (ExtractorLink) -> Unit
- ){
- val link = "$FSJioTV/autoq.php?c=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "FSJioTV",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
- fun invokeFH(
- id: String? = null,
- callback: (ExtractorLink) -> Unit
- ){
- val link = "$FHJioTV/autoq.php?c=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "FHJioTV",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
- fun invokeTS(
- id: String? = null,
- callback: (ExtractorLink) -> Unit
- ){
- val link = "$TSJioTV/jtv/autoqtv.php?c=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "TSJioTV",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
- fun invokeBF(
- id: String? = null,
- callback: (ExtractorLink) -> Unit
- ){
- val link = "$BFJioTV/autoq.php?c=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "BFJioTV",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
- fun invokeRPK(
- id: String? = null,
- callback: (ExtractorLink) -> Unit
- ){
- val link = "$RPKJioTV/JIOTVx/autoq.php?c=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "RPKJioTV",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
-
- suspend fun invokeTML(
- id: String? = null,
- category: Int? = null,
- callback: (ExtractorLink) -> Unit
- ) {
- if (category == 30) {
- val link = "$TMLJioTV/zee5/zeeapi.php?c=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "TMLZee5",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
-
- } else if (category == 31) {
- val document = app.get("$TMLJioTV/sonyliv/channels/$id").document
- val link = document.select("source").attr("src")
- callback.invoke(
- ExtractorLink(
- this.name,
- "TMLSonyLiv",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
-
- } else {
- val link = "$TMLJioTV/autoq.php?c=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "TMLJioTV",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
- }
-
- fun invokeSW(
- id: String? = null,
- callback: (ExtractorLink) -> Unit
- ) {
- val link = "$SWJioTV/app/master.php?id=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "SWJioTV",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
-
- fun invokeZL(
- id: String? = null,
- callback: (ExtractorLink) -> Unit
- ) {
- val link = "$ZLZee5/api.php?c=$id"
- callback.invoke(
- ExtractorLink(
- this.name,
- "ZLZee5",
- link,
- referer = "",
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- }
-}
diff --git a/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVPlugin.kt b/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVPlugin.kt
deleted file mode 100644
index 5d3e1cf..0000000
--- a/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVPlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class SoraJioTVPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(SoraJioTVProvider())
- }
-}
diff --git a/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVProvider.kt b/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVProvider.kt
deleted file mode 100644
index fda656a..0000000
--- a/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVProvider.kt
+++ /dev/null
@@ -1,235 +0,0 @@
-package com.darkdemon
-
-import com.darkdemon.SoraJioTVExtractor.invokeBF
-import com.darkdemon.SoraJioTVExtractor.invokeFH
-import com.darkdemon.SoraJioTVExtractor.invokeFS
-import com.darkdemon.SoraJioTVExtractor.invokeGDL
-import com.darkdemon.SoraJioTVExtractor.invokeRPK
-import com.darkdemon.SoraJioTVExtractor.invokeSW
-import com.darkdemon.SoraJioTVExtractor.invokeTML
-import com.darkdemon.SoraJioTVExtractor.invokeTS
-import com.darkdemon.SoraJioTVExtractor.invokeZL
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.utils.AppUtils.parseJson
-import com.lagradost.cloudstream3.utils.AppUtils.toJson
-import com.lagradost.cloudstream3.utils.ExtractorLink
-
-open class SoraJioTVProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var name = "SoraJioTV"
- override val hasMainPage = true
- override val hasChromecastSupport = true
- override var lang = "hi"
- override val supportedTypes = setOf(
- TvType.Live
- )
-
- data class Channels(
- @JsonProperty("result") var result: ArrayList = arrayListOf()
- )
-
- data class Result(
- @JsonProperty("channel_id") var channelId: String? = null,
- @JsonProperty("channel_order") var channelOrder: String? = null,
- @JsonProperty("channel_name") var channelName: String? = null,
- @JsonProperty("channelCategoryId") var channelCategoryId: Int? = null,
- @JsonProperty("channelLanguageId") var channelLanguageId: Int? = null,
- @JsonProperty("isHD") var isHD: Boolean? = null,
- @JsonProperty("broadcasterId") var broadcasterId: Int? = null,
- @JsonProperty("logoUrl") var logoUrl: String? = null
-
- )
-
- companion object {
- private const val jsonUrl =
- "https://raw.githubusercontent.com/daarkdemon/jiotvchannels/test/channels.json"
- const val GDLJioTV = "https://tv.googledrivelinks.com"
- const val FSJioTV = "https://tv.freeseries.eu.org"
- const val BFJioTV = "https://jio.buttflix.best"
- const val FHJioTV = "https://filmyhub.ga"
- const val TSJioTV = "https://tvstream.fun"
- const val RPKJioTV = "http://ranapk-nxt.ml"
- const val TMLJioTV = "http://techmaxlive.ml"
- const val SWJioTV = "https://spidyworld.ga"
- const val ZLZee5 = "https://zeeliv.tk"
- }
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val categories = mapOf(
- "Zee5" to 30,
- "Sonyliv" to 31,
- "Sports" to 8,
- "Entertainment" to 5,
- "Movies" to 6,
- "News" to 12,
- "Music" to 13,
- "Kids" to 7,
- "Lifestyle" to 9,
- "Infotainment" to 10,
- "Devotional" to 15,
- "Business" to 16,
- "Educational" to 17,
- "Shopping" to 18,
- "JioDarshan" to 19
- )
- val items = ArrayList()
- val response = app.get(jsonUrl).parsed().result
- categories.forEach { cat ->
- val results: MutableList = mutableListOf()
- val filtered = response.filter { it.channelCategoryId == cat.value }
- filtered.forEach {
- val title = it.channelName.toString()
- val posterUrl =
- if (it.logoUrl?.startsWith("https://") == true) it.logoUrl else "http://jiotv.catchup.cdn.jio.com/dare_images/images/${it.logoUrl}"
- val quality = if (it.isHD == true) "HD" else ""
- results.add(
- newMovieSearchResponse(title, it.channelId.toString(), TvType.Live) {
- this.posterUrl = posterUrl
- this.quality = getQualityFromString(quality)
- }
- )
- }
- items.add(
- HomePageList(
- capitalizeString(cat.key),
- results,
- isHorizontalImages = true
- )
- )
- }
- return HomePageResponse(items)
- }
-
- override suspend fun search(query: String): List {
- val response = app.get(jsonUrl).parsed().result
- val searchResults =
- response.filter { it.channelName?.lowercase()?.contains(query.lowercase()) == true }
-
- return searchResults.map {
- val title = it.channelName.toString()
- val posterUrl =
- if (it.logoUrl?.startsWith("https://") == true) it.logoUrl else "http://jiotv.catchup.cdn.jio.com/dare_images/images/${it.logoUrl}"
- newMovieSearchResponse(title, it.channelId.toString(), TvType.Live) {
- this.posterUrl = posterUrl
- }
- }
- }
-
- override suspend fun load(url: String): LoadResponse {
- val response = app.get(jsonUrl).parsed().result
- val searchResults =
- response.filter { it.channelId?.contains(url.substringAfterLast("/")) == true }
- val title = searchResults[0].channelName.toString()
- val posterUrl =
- "http://jiotv.catchup.cdn.jio.com/dare_images/images/${searchResults[0].logoUrl}"
- return newMovieLoadResponse(
- title, title, TvType.Live, Result(
- channelId = searchResults[0].channelId,
- channelName = title,
- channelCategoryId = searchResults[0].channelCategoryId,
- logoUrl = searchResults[0].logoUrl
- ).toJson()
- ) {
- this.posterUrl = posterUrl
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
-
- val result = parseJson(data)
- when (result.channelCategoryId) {
- 30 -> {
- argamap(
- {
- invokeZL(
- result.channelId,
- callback
- )
- },
- {
- invokeTML(
- result.channelId,
- result.channelCategoryId,
- callback
- )
- }
- )
-
- }
- 31 -> {
- argamap(
- {
- invokeTML(
- result.logoUrl?.substringBefore(".png"),
- result.channelCategoryId,
- callback
- )
- }
- )
-
- }
- else -> {
- argamap(
- {
- invokeGDL(
- result.logoUrl?.substringBefore(".png"),
- callback
- )
- },
- {
- invokeFS(
- result.logoUrl?.substringBefore(".png"),
- callback
- )
- },
- {
- invokeFH(
- result.logoUrl?.substringBefore(".png"),
- callback
- )
- },
- {
- invokeTS(
- result.logoUrl?.substringBefore(".png"),
- callback
- )
- },
- {
- invokeRPK(
- result.logoUrl?.substringBefore(".png"),
- callback
- )
- },
- {
- invokeBF(
- result.logoUrl?.substringBefore(".png"),
- callback
- )
- },
- {
- invokeTML(
- result.logoUrl?.substringBefore(".png"),
- result.channelCategoryId,
- callback
- )
- },
- {
- invokeSW(
- result.logoUrl?.substringBefore(".png"),
- callback
- )
- }
- )
- }
- }
- return true
- }
-}
diff --git a/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVUtils.kt b/SoraJioTVProvider/src/main/kotlin/com/darkdemon/SoraJioTVUtils.kt
deleted file mode 100644
index e69de29..0000000
diff --git a/StreamBlastersProvider/build.gradle.kts b/StreamBlastersProvider/build.gradle.kts
deleted file mode 100644
index 6d0e8cb..0000000
--- a/StreamBlastersProvider/build.gradle.kts
+++ /dev/null
@@ -1,25 +0,0 @@
-version = 4
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- // description = "Lorem Ipsum"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=streamblasters.lol&sz=%size%"
-}
diff --git a/StreamBlastersProvider/src/main/AndroidManifest.xml b/StreamBlastersProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/StreamBlastersProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/StreamBlastersProvider/src/main/kotlin/com/darkdemon/StreamBlastersPlugin.kt b/StreamBlastersProvider/src/main/kotlin/com/darkdemon/StreamBlastersPlugin.kt
deleted file mode 100644
index 7cd2882..0000000
--- a/StreamBlastersProvider/src/main/kotlin/com/darkdemon/StreamBlastersPlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class StreamBlastersPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(StreamBlastersProvider())
- }
-}
diff --git a/StreamBlastersProvider/src/main/kotlin/com/darkdemon/StreamBlastersProvider.kt b/StreamBlastersProvider/src/main/kotlin/com/darkdemon/StreamBlastersProvider.kt
deleted file mode 100644
index 9948b56..0000000
--- a/StreamBlastersProvider/src/main/kotlin/com/darkdemon/StreamBlastersProvider.kt
+++ /dev/null
@@ -1,165 +0,0 @@
-
-package com.darkdemon
-
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
-import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
-import com.lagradost.cloudstream3.mvvm.safeApiCall
-import com.lagradost.cloudstream3.utils.*
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Element
-
-class StreamBlastersProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://streamblasters.art"
- override var name = "StreamBlasters"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- TvType.TvSeries
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/genre/english/page/" to "English",
- "$mainUrl/genre/hindi/page/" to "Hindi",
- "$mainUrl/genre/kannada/page/" to "Kannada",
- "$mainUrl/genre/malayalam/page/" to "Malayalam",
- "$mainUrl/genre/tamil/page/" to "Tamil",
- "$mainUrl/genre/telugu/page/" to "Telugu"
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(request.data + page).document
- val home = document.select("article").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(request.name, home)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = this.selectFirst("img")?.attr("alt")?.trim() ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("data-src"))
- val quality = getQualityFromString(this.select("span.quality").text())
-
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- this.quality = quality
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query").document
-
- return document.select(".result-item").mapNotNull {
- val title = it.select(".title a").text().trim()
- val href = fixUrl(it.selectFirst(".title a")?.attr("href").toString())
- val posterUrl = fixUrlNull(it.selectFirst(".thumbnail img")?.attr("src"))
- val quality = getQualityFromString(it.select("span.quality").text())
- val tvtype = if (href.contains("tvshows")) TvType.TvSeries else TvType.Movie
- newMovieSearchResponse(title, href, tvtype) {
- this.posterUrl = posterUrl
- this.quality = quality
- }
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
-
- val title = document.selectFirst("div.sheader h1")?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.selectFirst("div.poster img")?.attr("src"))
- //val tags = document.select("div.mvici-left p:nth-child(1) a").map { it.text() }
- val year = document.select("span.date").text().trim().split(",").last()
- .toIntOrNull()
- val tvType = if (document.select("#seasons")
- .isNullOrEmpty()
- ) TvType.Movie else TvType.TvSeries
- val description = document.selectFirst(".wp-content p")?.text()?.trim()
- val trailer = fixUrlNull(document.select("iframe").attr("src"))
- val rating = document.select("#info span strong").text().toRatingInt()
- val actors = document.select("#cast > div:nth-child(4)").map { it.text() }
- val recommendations = document.select("article").mapNotNull {
- it.toSearchResult()
- }
-
- return if (tvType == TvType.TvSeries) {
- val episodes = document.select("ul.episodios li").mapNotNull {
- val href = fixUrl(it.select("a").attr("href")?: return null)
- val name = it.select("a").text().trim()
- val thumbs = it.select("img").attr("src")
- val season = it.select(".numerando").text().split(" - ").first().toInt()
- val episode = it.select(".numerando").text().split(" - ").last().toInt()
- Episode(
- href,
- name,
- season,
- episode,
- thumbs
- )
- }
-
- newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- //this.tags = tags
- this.rating = rating
- addActors(actors)
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- } else {
- newMovieLoadResponse(title, url, TvType.Movie, url) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- //this.tags = tags
- this.rating = rating
- addActors(actors)
- this.recommendations = recommendations
- addTrailer(trailer)
- }
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
-
- val document = app.get(data).document
- val id = document.select(".dooplay_player_option").attr("data-post")
- document.select("ul#playeroptionsul li#player-option-1").map {
- it.attr("data-nume")
- }.apmap { nume ->
- safeApiCall {
- val response = app.post(
- url = "$mainUrl/wp-admin/admin-ajax.php",
- data = mapOf(
- "action" to "doo_player_ajax",
- "post" to id,
- "nume" to nume,
- "type" to "movie"
- ),
- referer = data,
- headers = mapOf("X-Requested-With" to "XMLHttpRequest")
- ).parsed().embed_url
- val source = if(response.contains("iframe")) Jsoup.parse(response).select("iframe").attr("src") else response
- loadExtractor(source, data, subtitleCallback, callback)
- }
- }
- return true
- }
- data class ResponseHash(
- @JsonProperty("embed_url") val embed_url: String,
- @JsonProperty("type") val type: String?,
- )
-}
diff --git a/UWatchFreeProvider/build.gradle.kts b/UWatchFreeProvider/build.gradle.kts
deleted file mode 100644
index ef85380..0000000
--- a/UWatchFreeProvider/build.gradle.kts
+++ /dev/null
@@ -1,25 +0,0 @@
-version = 3
-
-
-cloudstream {
- language = "hi"
- // All of these properties are optional, you can safely remove them
-
- // description = "Lorem Ipsum"
- authors = listOf("darkdemon")
-
- /**
- * Status int as the following:
- * 0: Down
- * 1: Ok
- * 2: Slow
- * 3: Beta only
- * */
- status = 1 // will be 3 if unspecified
- tvTypes = listOf(
- "TvSeries",
- "Movie",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=uwatchfree.be&sz=%size%"
-}
diff --git a/UWatchFreeProvider/src/main/AndroidManifest.xml b/UWatchFreeProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 7fbfe5f..0000000
--- a/UWatchFreeProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/UWatchFreeProvider/src/main/kotlin/com/darkdemon/UWatchFreePlugin.kt b/UWatchFreeProvider/src/main/kotlin/com/darkdemon/UWatchFreePlugin.kt
deleted file mode 100644
index 66c3790..0000000
--- a/UWatchFreeProvider/src/main/kotlin/com/darkdemon/UWatchFreePlugin.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class UWatchFreePlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerExtractorAPI(DoodReExtractor())
- registerMainAPI(UWatchFreeProvider())
-
- }
-}
diff --git a/UWatchFreeProvider/src/main/kotlin/com/darkdemon/UWatchFreeProvider.kt b/UWatchFreeProvider/src/main/kotlin/com/darkdemon/UWatchFreeProvider.kt
deleted file mode 100644
index 1706088..0000000
--- a/UWatchFreeProvider/src/main/kotlin/com/darkdemon/UWatchFreeProvider.kt
+++ /dev/null
@@ -1,191 +0,0 @@
-package com.darkdemon
-
-import com.lagradost.cloudstream3.*
-import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
-import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
-import com.lagradost.cloudstream3.extractors.DoodLaExtractor
-import com.lagradost.cloudstream3.extractors.XStreamCdn
-import com.lagradost.cloudstream3.mvvm.safeApiCall
-import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.Qualities
-import com.lagradost.cloudstream3.utils.loadExtractor
-import org.jsoup.nodes.Element
-
-class UWatchFreeProvider : MainAPI() { // all providers must be an instance of MainAPI
- override var mainUrl = "https://uwatchfree.be/"
- override var name = "UWatchFree"
- override val hasMainPage = true
- override var lang = "hi"
- override val hasDownloadSupport = true
- override val supportedTypes = setOf(
- TvType.Movie,
- TvType.TvSeries
- )
-
- override val mainPage = mainPageOf(
- "$mainUrl/release-year/2022/page/" to "Latest",
- "$mainUrl/uwatchfree-movies/page/" to "Movies",
- "$mainUrl/watch-tv-series/page/" to "Series",
- "$mainUrl/watch-hindi-movies-online/page/" to "Hindi",
- "$mainUrl/tamil-movies/page/" to "Tamil",
- "$mainUrl/telugu-movies/page/" to "Telugu",
- "$mainUrl/hindi-dubbed-movies/page/" to "Hindi Dubbed"
- )
-
- override suspend fun getMainPage(
- page: Int,
- request: MainPageRequest
- ): HomePageResponse {
- val document = app.get(request.data + page).document
- val home = document.select("article").mapNotNull {
- it.toSearchResult()
- }
- return newHomePageResponse(request.name, home)
- }
-
- private fun Element.toSearchResult(): SearchResponse? {
- val title = this.selectFirst("h2 a")?.text()?.trim() ?: return null
- val href = fixUrl(this.selectFirst("a")?.attr("href").toString())
- val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src"))
- val quality = getQualityFromString(this.select(".mli-quality").text())
-
- return newMovieSearchResponse(title, href, TvType.Movie) {
- this.posterUrl = posterUrl
- this.quality = quality
- }
- }
-
- override suspend fun search(query: String): List {
- val document = app.get("$mainUrl/?s=$query&submit=Search").document
-
- return document.select("article").mapNotNull {
- it.toSearchResult()
- }
- }
-
- override suspend fun load(url: String): LoadResponse? {
- val document = app.get(url).document
-
- val title = document.selectFirst(".entry-title")?.text()?.trim() ?: return null
- val poster = fixUrlNull(document.selectFirst(".moviemeta img")?.attr("src"))
- val tags = document.select("div.moviemeta > p:nth-child(4) a").map { it.text() }
- val yearRegex = Regex("""/(\d{4})/gm""")
- val year = yearRegex.find(
- document.select("div.moviemeta > p:nth-child(7)").text()
- )?.groupValues?.getOrNull(1)?.toIntOrNull()
- val description = document.selectFirst("div.moviemeta > p:nth-child(9)")?.text()?.trim()
- val actors =
- document.select("div.moviemeta > p:nth-child(3) span[itemprop=name]").map { it.text() }
- val tvType = if (document.selectFirst(".tritem td:first-child")
- ?.text()
- ?.contains(Regex("(?i)(Episode\\s?[0-9]+)")) == true
- ) TvType.TvSeries else TvType.Movie
- return if (tvType == TvType.TvSeries) {
- val episodes = document.select(".tritem").mapNotNull {
- val href = fixUrl(it.select("a").attr("href") ?: return null)
- val name = it.selectFirst("td")?.text()?.trim()
- val seasonRegex = Regex("""Season\s?([0-9]+)""")
- val season = seasonRegex.find(
- document.select(".entry-title").text()
- )?.groupValues?.getOrNull(1)?.toIntOrNull()
- val episode = name?.substringAfter("Episode 0")?.substringBefore(":")?.toIntOrNull()
- Episode(
- href,
- name,
- season,
- episode,
- )
- }
-
- newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- addActors(actors)
- }
- } else {
- newMovieLoadResponse(title, url, TvType.Movie, url) {
- this.posterUrl = poster
- this.year = year
- this.plot = description
- this.tags = tags
- addActors(actors)
- }
- }
- }
-
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
- val doc = app.get(data).document
- val urls = ArrayList()
- if (data.contains("player")) {
- urls.add(app.get(data).document.select("iframe").attr("src"))
- } else {
- doc.select(".magnet-link a").map { src ->
- if (src.attr("href").contains("send.cm")) {
- val url = app.get(src.attr("href")).document.select("source").attr("src")
- urls.add(url)
- }
- }
- }
- doc.select("body a:contains(Click to Play)").map { fixUrl(it.attr("href")) }
- .apmap { source ->
- app.get(
- source,
- referer = data
- ).document.select("iframe")
- .apmap {
- urls.add(it.attr("src"))
- }
- }
- println(urls)
- urls.forEach { url ->
- if (url.contains("send.cm")) {
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- url,
- mainUrl,
- quality = Qualities.Unknown.value,
- )
- )
- } else if (url.startsWith("https://0gomovies.top")) {
- val script = app.get(url).text
- println(script)
- val srcRegex = Regex("""(file: ")(https?.*?\.m3u8)""")
- val source =
- srcRegex.find(script.toString())?.groupValues?.getOrNull(2)
- ?.toString()
- println(source)
- callback.invoke(
- ExtractorLink(
- this.name,
- this.name,
- source.toString(),
- referer = url,
- quality = Qualities.Unknown.value,
- isM3u8 = true,
- )
- )
- } else {
- loadExtractor(
- url,
- "$mainUrl/",
- subtitleCallback,
- callback
- )
- }
- }
- return true
- }
-}
-
-class DoodReExtractor : DoodLaExtractor() {
- override var mainUrl = "https://dood.re"
-}