From 1da69244bc6ac7d5f69bab957d7826c42173e057 Mon Sep 17 00:00:00 2001
From: Hexated <37908684+hexated@users.noreply.github.com>
Date: Mon, 5 Sep 2022 06:12:52 +0700
Subject: [PATCH 1/9] added Topdocumentaryfilms (#9)
---
Topdocumentaryfilms/build.gradle.kts | 23 ++++
.../src/main/AndroidManifest.xml | 2 +
.../com/lagradost/Topdocumentaryfilms.kt | 101 ++++++++++++++++++
.../lagradost/TopdocumentaryfilmsPlugin.kt | 14 +++
4 files changed, 140 insertions(+)
create mode 100644 Topdocumentaryfilms/build.gradle.kts
create mode 100644 Topdocumentaryfilms/src/main/AndroidManifest.xml
create mode 100644 Topdocumentaryfilms/src/main/kotlin/com/lagradost/Topdocumentaryfilms.kt
create mode 100644 Topdocumentaryfilms/src/main/kotlin/com/lagradost/TopdocumentaryfilmsPlugin.kt
diff --git a/Topdocumentaryfilms/build.gradle.kts b/Topdocumentaryfilms/build.gradle.kts
new file mode 100644
index 0000000..8e4f662
--- /dev/null
+++ b/Topdocumentaryfilms/build.gradle.kts
@@ -0,0 +1,23 @@
+// use an integer for version numbers
+version = 1
+
+
+cloudstream {
+ language = "en"
+ // All of these properties are optional, you can safely remove them
+
+ // description = "Lorem Ipsum"
+ authors = listOf("Hexated")
+
+ /**
+ * Status int as the following:
+ * 0: Down
+ * 1: Ok
+ * 2: Slow
+ * 3: Beta only
+ * */
+ status = 1 // will be 3 if unspecified
+ tvTypes = listOf("Documentary")
+
+ iconUrl = "https://www.google.com/s2/favicons?domain=topdocumentaryfilms.com&sz=%size%"
+}
\ No newline at end of file
diff --git a/Topdocumentaryfilms/src/main/AndroidManifest.xml b/Topdocumentaryfilms/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..29aec9d
--- /dev/null
+++ b/Topdocumentaryfilms/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/Topdocumentaryfilms/src/main/kotlin/com/lagradost/Topdocumentaryfilms.kt b/Topdocumentaryfilms/src/main/kotlin/com/lagradost/Topdocumentaryfilms.kt
new file mode 100644
index 0000000..33f8596
--- /dev/null
+++ b/Topdocumentaryfilms/src/main/kotlin/com/lagradost/Topdocumentaryfilms.kt
@@ -0,0 +1,101 @@
+package com.lagradost
+
+import com.lagradost.cloudstream3.*
+import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
+import com.lagradost.cloudstream3.utils.ExtractorLink
+import com.lagradost.cloudstream3.utils.loadExtractor
+import org.jsoup.nodes.Element
+
+class Topdocumentaryfilms : MainAPI() {
+ override var mainUrl = "https://topdocumentaryfilms.com/"
+ override var name = "Topdocumentaryfilms"
+ override val hasMainPage = true
+ override val hasDownloadSupport = true
+ override val supportedTypes = setOf(TvType.Documentary)
+
+
+ override val mainPage = mainPageOf(
+ "$mainUrl/category/technology/page/" to "Technology",
+ "$mainUrl/category/military-war/page/" to " Military and War",
+ "$mainUrl/category/sports/page/" to "Sports",
+ "$mainUrl/category/media/page/" to "Media",
+ "$mainUrl/category/society/page/" to "Society",
+ "$mainUrl/category/history/page/" to "History",
+ "$mainUrl/category/sex/page/" to "Sexuality",
+ "$mainUrl/category/health/page/" to "Health",
+ "$mainUrl/category/science-technology/page/" to "Science",
+ "$mainUrl/category/environment/page/" to "Environment",
+ "$mainUrl/category/religion/page/" to "Religion",
+ "$mainUrl/category/economics/page/" to "Economics",
+ "$mainUrl/category/psychology/page/" to "Psychology",
+ "$mainUrl/category/drugs/page/" to "Drugs",
+ "$mainUrl/category/politics/page/" to "Politics",
+ "$mainUrl/category/crime/page/" to "Crime",
+ "$mainUrl/category/philosophy/page/" to "Philosophy",
+ "$mainUrl/category/crime-conspiracy/page/" to "Conspiracy",
+ "$mainUrl/category/music-performing-arts/page/" to "Performing Arts",
+ "$mainUrl/category/biography/page/" to "Biography",
+ "$mainUrl/category/nature-wildlife/page/" to "Nature",
+ "$mainUrl/category/art-artists/page/" to " Art and Artists",
+ "$mainUrl/category/mystery/page/" to "Mystery",
+ "$mainUrl/category/911/page/" to "9/11",
+ )
+
+ override suspend fun getMainPage(
+ page: Int,
+ request: MainPageRequest
+ ): HomePageResponse {
+ val document = app.get(request.data + page).document
+ val home = document.select("main article").mapNotNull {
+ it.toSearchResult()
+ }
+ return newHomePageResponse(request.name, home)
+ }
+
+ private fun Element.toSearchResult(): SearchResponse? {
+ val title = this.selectFirst("h2 > a")?.text() ?: return null
+ val href = this.selectFirst("h2 > a")!!.attr("href")
+ val posterUrl = this.selectFirst("a img")?.let {
+ if (it.attr("data-src").isNullOrBlank()) it.attr("src") else it.attr("data-src")
+ }
+ return newMovieSearchResponse(title, href, TvType.Documentary) {
+ this.posterUrl = posterUrl
+ }
+ }
+
+ override suspend fun load(url: String): LoadResponse? {
+ val document = app.get(url).document
+ val title = document.selectFirst("header > h1")?.text() ?: return null
+ val link = document.selectFirst("article meta[itemprop=embedUrl]")?.attr("content")?.split("/")?.last()?.let{
+ "https://www.youtube.com/watch?v=$it"
+ } ?: throw ErrorLoadingException("No link found")
+
+ return newMovieLoadResponse(title, url, TvType.Movie, link) {
+ this.posterUrl = document.select("div.player-content > img").attr("src")
+ this.year = document.selectFirst("div.meta-bar.meta-single")?.ownText()?.filter { it.isDigit() }?.toIntOrNull()
+ this.plot = document.select("div[itemprop=reviewBody] > p").text().trim()
+ this.tags = document.select("div.meta-bar.meta-single > a").map { it.text() }
+ this.rating = document.selectFirst("div.module div.star")?.text()?.toRatingInt()
+ this.recommendations = document.select("ul.side-wrap.clear li").mapNotNull {
+ val recName = it.selectFirst("a")?.attr("title") ?: return@mapNotNull null
+ val recHref = it.selectFirst("a")!!.attr("href")
+ newMovieSearchResponse(recName, recHref, TvType.Documentary) {
+ this.posterUrl = it.selectFirst("a img")?.attr("data-src").toString()
+ }
+ }
+ addTrailer(link)
+ }
+ }
+
+ override suspend fun loadLinks(
+ data: String,
+ isCasting: Boolean,
+ subtitleCallback: (SubtitleFile) -> Unit,
+ callback: (ExtractorLink) -> Unit
+ ): Boolean {
+
+ loadExtractor(data, data, subtitleCallback, callback)
+
+ return true
+ }
+}
diff --git a/Topdocumentaryfilms/src/main/kotlin/com/lagradost/TopdocumentaryfilmsPlugin.kt b/Topdocumentaryfilms/src/main/kotlin/com/lagradost/TopdocumentaryfilmsPlugin.kt
new file mode 100644
index 0000000..500131c
--- /dev/null
+++ b/Topdocumentaryfilms/src/main/kotlin/com/lagradost/TopdocumentaryfilmsPlugin.kt
@@ -0,0 +1,14 @@
+
+package com.lagradost
+
+import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
+import com.lagradost.cloudstream3.plugins.Plugin
+import android.content.Context
+
+@CloudstreamPlugin
+class TopdocumentaryfilmsPlugin: Plugin() {
+ override fun load(context: Context) {
+ // All providers should be added in this manner. Please don't edit the providers list directly.
+ registerMainAPI(Topdocumentaryfilms())
+ }
+}
\ No newline at end of file
From bfe6b1790fc0cf5de0cef5c32adafc6573276f2d Mon Sep 17 00:00:00 2001
From: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Date: Thu, 8 Sep 2022 17:39:49 +0200
Subject: [PATCH 2/9] add superembed
---
SuperembedProvider/build.gradle.kts | 26 +++++++
.../src/main/AndroidManifest.xml | 2 +
.../com/lagradost/SuperembedProvider.kt | 76 +++++++++++++++++++
.../com/lagradost/SuperembedProviderPlugin.kt | 14 ++++
4 files changed, 118 insertions(+)
create mode 100644 SuperembedProvider/build.gradle.kts
create mode 100644 SuperembedProvider/src/main/AndroidManifest.xml
create mode 100644 SuperembedProvider/src/main/kotlin/com/lagradost/SuperembedProvider.kt
create mode 100644 SuperembedProvider/src/main/kotlin/com/lagradost/SuperembedProviderPlugin.kt
diff --git a/SuperembedProvider/build.gradle.kts b/SuperembedProvider/build.gradle.kts
new file mode 100644
index 0000000..3378ffc
--- /dev/null
+++ b/SuperembedProvider/build.gradle.kts
@@ -0,0 +1,26 @@
+// use an integer for version numbers
+version = 3
+
+
+cloudstream {
+ language = "en"
+ // All of these properties are optional, you can safely remove them
+
+ description = "Uses TMDB"
+ authors = listOf("Cloudburst")
+
+ /**
+ * Status int as the following:
+ * 0: Down
+ * 1: Ok
+ * 2: Slow
+ * 3: Beta only
+ * */
+ status = 0 // will be 3 if unspecified
+ tvTypes = listOf(
+ "TvSeries",
+ "Movie",
+ )
+
+ iconUrl = "https://www.google.com/s2/favicons?domain=www.superembed.stream&sz=%size%"
+}
\ No newline at end of file
diff --git a/SuperembedProvider/src/main/AndroidManifest.xml b/SuperembedProvider/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..29aec9d
--- /dev/null
+++ b/SuperembedProvider/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/SuperembedProvider/src/main/kotlin/com/lagradost/SuperembedProvider.kt b/SuperembedProvider/src/main/kotlin/com/lagradost/SuperembedProvider.kt
new file mode 100644
index 0000000..cf8ce5c
--- /dev/null
+++ b/SuperembedProvider/src/main/kotlin/com/lagradost/SuperembedProvider.kt
@@ -0,0 +1,76 @@
+package com.lagradost
+
+import android.util.Log
+import com.lagradost.cloudstream3.SubtitleFile
+import com.lagradost.cloudstream3.TvType
+import com.lagradost.cloudstream3.app
+import com.lagradost.cloudstream3.base64Decode
+import com.lagradost.cloudstream3.metaproviders.TmdbLink
+import com.lagradost.cloudstream3.metaproviders.TmdbProvider
+import com.lagradost.cloudstream3.network.WebViewResolver
+import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
+import com.lagradost.cloudstream3.utils.ExtractorLink
+import com.lagradost.cloudstream3.utils.Qualities
+import com.lagradost.cloudstream3.utils.getQualityFromName
+
+class SuperembedProvider : TmdbProvider() {
+ override var mainUrl = "https://seapi.link"
+ override val apiName = "Superembed"
+ override var name = "Superembed"
+ override val instantLinkLoading = true
+ override val useMetaLoadResponse = true
+ override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie)
+
+ override suspend fun loadLinks(
+ data: String,
+ isCasting: Boolean,
+ subtitleCallback: (SubtitleFile) -> Unit,
+ callback: (ExtractorLink) -> Unit
+ ): Boolean {
+ val mappedData = tryParseJson(data)
+ val tmdbId = mappedData?.tmdbID ?: return false
+
+ val document = app.get("https://seapi.link/?type=tmdb&id=${tmdbId}&max_results=1").text
+ val response = tryParseJson(document) ?: return false
+
+ response.results.forEach {
+ it.toExtractorLink()?.let { it1 ->
+ Log.d("supaembed", it1.url)
+ callback.invoke(it1)
+ }
+ }
+
+ return true
+ }
+
+ private data class ApiResponse(
+ val results: List
+ )
+
+ private data class ApiResultItem(
+ val server: String,
+ val title: String,
+ val quality: String,
+ val size: Int,
+ val url: String
+ ) {
+ private suspend fun getIframeContents(): String? {
+ val document = app.get(url).text
+ val regex = "