diff --git a/GDJioTVProvider/build.gradle.kts b/GDJioTVProvider/build.gradle.kts
new file mode 100644
index 0000000..4b92f98
--- /dev/null
+++ b/GDJioTVProvider/build.gradle.kts
@@ -0,0 +1,24 @@
+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 = 1 // 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
new file mode 100644
index 0000000..7fbfe5f
--- /dev/null
+++ b/GDJioTVProvider/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVPlugin.kt b/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVPlugin.kt
new file mode 100644
index 0000000..23c32e6
--- /dev/null
+++ b/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVPlugin.kt
@@ -0,0 +1,14 @@
+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
new file mode 100644
index 0000000..5f85819
--- /dev/null
+++ b/GDJioTVProvider/src/main/kotlin/com/darkdemon/GDJioTVProvider.kt
@@ -0,0 +1,81 @@
+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/NPJioTVProvider/build.gradle.kts b/NPJioTVProvider/build.gradle.kts
index 4f699ed..f5f3c77 100644
--- a/NPJioTVProvider/build.gradle.kts
+++ b/NPJioTVProvider/build.gradle.kts
@@ -1,4 +1,4 @@
-version = 1
+version = 2
cloudstream {
diff --git a/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVProvider.kt b/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVProvider.kt
index 0a993e8..4d24375 100644
--- a/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVProvider.kt
+++ b/NPJioTVProvider/src/main/kotlin/com/darkdemon/NPJioTVProvider.kt
@@ -5,7 +5,7 @@ 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.cf"
+ override var mainUrl = "https://nayeemparvez.chadasaniya.ml"
override var name = "NPJioTV+"
override val hasMainPage = true
override var lang = "hi"
diff --git a/SnehIPTVProvider/build.gradle.kts b/SnehIPTVProvider/build.gradle.kts
index 5b54a1d..30000d6 100644
--- a/SnehIPTVProvider/build.gradle.kts
+++ b/SnehIPTVProvider/build.gradle.kts
@@ -1,4 +1,4 @@
-version = 1
+version = 2
cloudstream {
diff --git a/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVProvider.kt b/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVProvider.kt
index 9a59f77..2fe9a5a 100644
--- a/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVProvider.kt
+++ b/SnehIPTVProvider/src/main/kotlin/com/darkdemon/SnehIPTVProvider.kt
@@ -35,8 +35,11 @@ class SnehIPTVProvider : MainAPI() { // all providers must be an instance of Mai
): HomePageResponse {
val categories = listOf(
+ "dplus",
+ "hungama",
"sonyliv",
"voot",
+ "sunxt",
"sports",
"entertainment",
"movies",
@@ -54,10 +57,11 @@ class SnehIPTVProvider : MainAPI() { // all providers must be an instance of Mai
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(cat) == true }
+ 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 title = it.title?.replace(regex = "\\s\\[[A-Za-z]+]$".toRegex(), "").toString()
val posterUrl = it.tvgLogo.toString()
results.add(
newMovieSearchResponse(title, title, TvType.Live) {
@@ -76,14 +80,14 @@ class SnehIPTVProvider : MainAPI() { // all providers must be an instance of Mai
return HomePageResponse(items)
}
- override suspend fun search(query: String): List? {
+ 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 title = it.title?.replace(regex = "\\s\\[[A-Za-z]+]$".toRegex(), "").toString()
val posterUrl = it.tvgLogo.toString()
newMovieSearchResponse(title, title, TvType.Live) {
this.posterUrl = posterUrl
@@ -91,18 +95,18 @@ class SnehIPTVProvider : MainAPI() { // all providers must be an instance of Mai
}
}
- override suspend fun load(url: String): LoadResponse? {
+ 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()
+ 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.Movie, href) {
+ return newMovieLoadResponse(title, url, TvType.Live, href) {
this.posterUrl = posterUrl
}
}
@@ -113,14 +117,16 @@ class SnehIPTVProvider : MainAPI() { // all providers must be an instance of Mai
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
): Boolean {
-
- val link = if (data.contains("sonyliv")) {
+ 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)
- html.url.substringBeforeLast("/") + "/${
+ 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()