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] 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