From 9bd5bc00df445cec3cad4c73d620895dd28cbff6 Mon Sep 17 00:00:00 2001 From: C10udburst <18114966+C10udburst@users.noreply.github.com> Date: Wed, 17 Aug 2022 14:48:16 +0200 Subject: [PATCH] remove non english providers and add lang property --- AllAnimeProvider/build.gradle.kts | 1 + AllMoviesForYouProvider/build.gradle.kts | 1 + AniflixProvider/build.gradle.kts | 1 + AnimeFlickProvider/build.gradle.kts | 1 + AnimeIndoProvider/build.gradle.kts | 26 -- .../src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/AnimeIndoProvider.kt | 192 --------- .../com/lagradost/AnimeIndoProviderPlugin.kt | 14 - AnimePaheProvider/build.gradle.kts | 1 + AnimeSailProvider/build.gradle.kts | 26 -- .../src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/AnimeSailProvider.kt | 191 -------- .../com/lagradost/AnimeSailProviderPlugin.kt | 14 - AnimekisaProvider/build.gradle.kts | 1 + AsiaFlixProvider/build.gradle.kts | 1 + BflixProvider/build.gradle.kts | 1 + DramaidProvider/build.gradle.kts | 25 -- DramaidProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/DramaidProvider.kt | 213 --------- .../com/lagradost/DramaidProviderPlugin.kt | 14 - DubbedAnimeProvider/build.gradle.kts | 1 + DubokuProvider/build.gradle.kts | 26 -- DubokuProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/DubokuProvider.kt | 133 ------ .../com/lagradost/DubokuProviderPlugin.kt | 14 - EjaTv/build.gradle.kts | 1 + FrenchStreamProvider/build.gradle.kts | 26 -- .../src/main/AndroidManifest.xml | 2 - .../com/lagradost/FrenchStreamProvider.kt | 273 ------------ .../lagradost/FrenchStreamProviderPlugin.kt | 14 - GogoanimeProvider/build.gradle.kts | 1 + GomunimeProvider/build.gradle.kts | 26 -- GomunimeProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/GomunimeProvider.kt | 232 ---------- .../com/lagradost/GomunimeProviderPlugin.kt | 14 - HDMProvider/build.gradle.kts | 1 + HDMovie5/build.gradle.kts | 24 -- HDMovie5/src/main/AndroidManifest.xml | 2 - .../src/main/kotlin/com/lagradost/HDMovie5.kt | 154 ------- .../kotlin/com/lagradost/HDMovie5Plugin.kt | 14 - HDrezkaProvider/build.gradle.kts | 27 -- HDrezkaProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/HDrezkaProvider.kt | 408 ------------------ .../com/lagradost/HDrezkaProviderPlugin.kt | 14 - IHaveNoTvProvider/build.gradle.kts | 1 + IdlixProvider/build.gradle.kts | 25 -- IdlixProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/IdlixProvider.kt | 385 ----------------- .../com/lagradost/IdlixProviderPlugin.kt | 14 - KawaiifuProvider/build.gradle.kts | 1 + KimCartoonProvider/build.gradle.kts | 1 + KisskhProvider/build.gradle.kts | 1 + KuramanimeProvider/build.gradle.kts | 26 -- .../src/main/AndroidManifest.xml | 2 - .../com/lagradost/KuramanimeProvider.kt | 176 -------- .../com/lagradost/KuramanimeProviderPlugin.kt | 14 - KuronimeProvider/build.gradle.kts | 26 -- KuronimeProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/KuronimeProvider.kt | 197 --------- .../com/lagradost/KuronimeProviderPlugin.kt | 14 - LayarKacaProvider/build.gradle.kts | 26 -- .../src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/LayarKacaProvider.kt | 176 -------- .../com/lagradost/LayarKacaProviderPlugin.kt | 14 - MeloMovieProvider/build.gradle.kts | 1 + MultiplexProvider/build.gradle.kts | 26 -- .../src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/MultiplexProvider.kt | 188 -------- .../com/lagradost/MultiplexProviderPlugin.kt | 14 - NeonimeProvider/build.gradle.kts | 27 -- NeonimeProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/NeonimeProvider.kt | 178 -------- .../com/lagradost/NeonimeProviderPlugin.kt | 14 - NginxProvider/build.gradle.kts | 1 + NineAnimeProvider/build.gradle.kts | 1 + NontonAnimeIDProvider/build.gradle.kts | 26 -- .../src/main/AndroidManifest.xml | 2 - .../com/lagradost/NontonAnimeIDProvider.kt | 257 ----------- .../lagradost/NontonAnimeIDProviderPlugin.kt | 14 - OlgplyProvider/build.gradle.kts | 1 + OploverzProvider/build.gradle.kts | 26 -- OploverzProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/OploverzProvider.kt | 203 --------- .../com/lagradost/OploverzProviderPlugin.kt | 14 - OtakudesuProvider/build.gradle.kts | 26 -- .../src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/OtakudesuProvider.kt | 204 --------- .../com/lagradost/OtakudesuProviderPlugin.kt | 14 - PelisflixProvider/build.gradle.kts | 26 -- .../src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/PelisflixProvider.kt | 231 ---------- .../com/lagradost/PelisflixProviderPlugin.kt | 14 - PhimmoichillProvider/build.gradle.kts | 27 -- .../src/main/AndroidManifest.xml | 2 - .../com/lagradost/PhimmoichillProvider.kt | 222 ---------- .../lagradost/PhimmoichillProviderPlugin.kt | 14 - PinoyHDXyzProvider/build.gradle.kts | 25 -- .../src/main/AndroidManifest.xml | 2 - .../com/lagradost/PinoyHDXyzProvider.kt | 237 ---------- .../com/lagradost/PinoyHDXyzProviderPlugin.kt | 14 - PinoyMovies/build.gradle.kts | 23 - PinoyMovies/src/main/AndroidManifest.xml | 2 - .../com/lagradost/PinoyMoviePediaProvider.kt | 238 ---------- .../PinoyMoviePediaProviderPlugin.kt | 16 - .../com/lagradost/PinoyMoviesEsProvider.kt | 251 ----------- .../kotlin/com/lagradost/VstreamhubHelper.kt | 58 --- .../main/kotlin/com/lagradost/XStreamCdn.kt | 68 --- RebahinProvider/build.gradle.kts | 28 -- RebahinProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/RebahinProvider.kt | 324 -------------- .../com/lagradost/RebahinProviderPlugin.kt | 14 - SflixProvider/build.gradle.kts | 1 + SoaptwoDayProvider/build.gradle.kts | 1 + SuperStream/build.gradle.kts | 1 + TenshiProvider/build.gradle.kts | 1 + TheFlixToProvider/build.gradle.kts | 1 + TocanimeProvider/build.gradle.kts | 26 -- TocanimeProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/TocanimeProvider.kt | 178 -------- .../com/lagradost/TocanimeProviderPlugin.kt | 14 - TrailersTwoProvider/build.gradle.kts | 1 + UakinoProvider/build.gradle.kts | 26 -- UakinoProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/UakinoProvider.kt | 181 -------- .../com/lagradost/UakinoProviderPlugin.kt | 14 - VMoveeProvider/build.gradle.kts | 1 + VfFilmProvider/build.gradle.kts | 24 -- VfFilmProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/VfFilmProvider.kt | 122 ------ .../com/lagradost/VfFilmProviderPlugin.kt | 14 - VfSerieProvider/build.gradle.kts | 23 - VfSerieProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/VfSerieProvider.kt | 179 -------- .../com/lagradost/VfSerieProviderPlugin.kt | 14 - VidSrcProvider/build.gradle.kts | 1 + VidstreamBundle/build.gradle.kts | 1 + WatchCartoonOnlineProvider/build.gradle.kts | 1 + WcofunProvider/build.gradle.kts | 1 + XcineProvider/build.gradle.kts | 27 -- XcineProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/XcineProvider.kt | 256 ----------- .../com/lagradost/XcineProviderPlugin.kt | 14 - YomoviesProvider/build.gradle.kts | 25 -- YomoviesProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/YomoviesProvider.kt | 161 ------- .../com/lagradost/YomoviesProviderPlugin.kt | 14 - 146 files changed, 31 insertions(+), 7636 deletions(-) delete mode 100644 AnimeIndoProvider/build.gradle.kts delete mode 100644 AnimeIndoProvider/src/main/AndroidManifest.xml delete mode 100644 AnimeIndoProvider/src/main/kotlin/com/lagradost/AnimeIndoProvider.kt delete mode 100644 AnimeIndoProvider/src/main/kotlin/com/lagradost/AnimeIndoProviderPlugin.kt delete mode 100644 AnimeSailProvider/build.gradle.kts delete mode 100644 AnimeSailProvider/src/main/AndroidManifest.xml delete mode 100644 AnimeSailProvider/src/main/kotlin/com/lagradost/AnimeSailProvider.kt delete mode 100644 AnimeSailProvider/src/main/kotlin/com/lagradost/AnimeSailProviderPlugin.kt delete mode 100644 DramaidProvider/build.gradle.kts delete mode 100644 DramaidProvider/src/main/AndroidManifest.xml delete mode 100644 DramaidProvider/src/main/kotlin/com/lagradost/DramaidProvider.kt delete mode 100644 DramaidProvider/src/main/kotlin/com/lagradost/DramaidProviderPlugin.kt delete mode 100644 DubokuProvider/build.gradle.kts delete mode 100644 DubokuProvider/src/main/AndroidManifest.xml delete mode 100644 DubokuProvider/src/main/kotlin/com/lagradost/DubokuProvider.kt delete mode 100644 DubokuProvider/src/main/kotlin/com/lagradost/DubokuProviderPlugin.kt delete mode 100644 FrenchStreamProvider/build.gradle.kts delete mode 100644 FrenchStreamProvider/src/main/AndroidManifest.xml delete mode 100644 FrenchStreamProvider/src/main/kotlin/com/lagradost/FrenchStreamProvider.kt delete mode 100644 FrenchStreamProvider/src/main/kotlin/com/lagradost/FrenchStreamProviderPlugin.kt delete mode 100644 GomunimeProvider/build.gradle.kts delete mode 100644 GomunimeProvider/src/main/AndroidManifest.xml delete mode 100644 GomunimeProvider/src/main/kotlin/com/lagradost/GomunimeProvider.kt delete mode 100644 GomunimeProvider/src/main/kotlin/com/lagradost/GomunimeProviderPlugin.kt delete mode 100644 HDMovie5/build.gradle.kts delete mode 100644 HDMovie5/src/main/AndroidManifest.xml delete mode 100644 HDMovie5/src/main/kotlin/com/lagradost/HDMovie5.kt delete mode 100644 HDMovie5/src/main/kotlin/com/lagradost/HDMovie5Plugin.kt delete mode 100644 HDrezkaProvider/build.gradle.kts delete mode 100644 HDrezkaProvider/src/main/AndroidManifest.xml delete mode 100644 HDrezkaProvider/src/main/kotlin/com/lagradost/HDrezkaProvider.kt delete mode 100644 HDrezkaProvider/src/main/kotlin/com/lagradost/HDrezkaProviderPlugin.kt delete mode 100644 IdlixProvider/build.gradle.kts delete mode 100644 IdlixProvider/src/main/AndroidManifest.xml delete mode 100644 IdlixProvider/src/main/kotlin/com/lagradost/IdlixProvider.kt delete mode 100644 IdlixProvider/src/main/kotlin/com/lagradost/IdlixProviderPlugin.kt delete mode 100644 KuramanimeProvider/build.gradle.kts delete mode 100644 KuramanimeProvider/src/main/AndroidManifest.xml delete mode 100644 KuramanimeProvider/src/main/kotlin/com/lagradost/KuramanimeProvider.kt delete mode 100644 KuramanimeProvider/src/main/kotlin/com/lagradost/KuramanimeProviderPlugin.kt delete mode 100644 KuronimeProvider/build.gradle.kts delete mode 100644 KuronimeProvider/src/main/AndroidManifest.xml delete mode 100644 KuronimeProvider/src/main/kotlin/com/lagradost/KuronimeProvider.kt delete mode 100644 KuronimeProvider/src/main/kotlin/com/lagradost/KuronimeProviderPlugin.kt delete mode 100644 LayarKacaProvider/build.gradle.kts delete mode 100644 LayarKacaProvider/src/main/AndroidManifest.xml delete mode 100644 LayarKacaProvider/src/main/kotlin/com/lagradost/LayarKacaProvider.kt delete mode 100644 LayarKacaProvider/src/main/kotlin/com/lagradost/LayarKacaProviderPlugin.kt delete mode 100644 MultiplexProvider/build.gradle.kts delete mode 100644 MultiplexProvider/src/main/AndroidManifest.xml delete mode 100644 MultiplexProvider/src/main/kotlin/com/lagradost/MultiplexProvider.kt delete mode 100644 MultiplexProvider/src/main/kotlin/com/lagradost/MultiplexProviderPlugin.kt delete mode 100644 NeonimeProvider/build.gradle.kts delete mode 100644 NeonimeProvider/src/main/AndroidManifest.xml delete mode 100644 NeonimeProvider/src/main/kotlin/com/lagradost/NeonimeProvider.kt delete mode 100644 NeonimeProvider/src/main/kotlin/com/lagradost/NeonimeProviderPlugin.kt delete mode 100644 NontonAnimeIDProvider/build.gradle.kts delete mode 100644 NontonAnimeIDProvider/src/main/AndroidManifest.xml delete mode 100644 NontonAnimeIDProvider/src/main/kotlin/com/lagradost/NontonAnimeIDProvider.kt delete mode 100644 NontonAnimeIDProvider/src/main/kotlin/com/lagradost/NontonAnimeIDProviderPlugin.kt delete mode 100644 OploverzProvider/build.gradle.kts delete mode 100644 OploverzProvider/src/main/AndroidManifest.xml delete mode 100644 OploverzProvider/src/main/kotlin/com/lagradost/OploverzProvider.kt delete mode 100644 OploverzProvider/src/main/kotlin/com/lagradost/OploverzProviderPlugin.kt delete mode 100644 OtakudesuProvider/build.gradle.kts delete mode 100644 OtakudesuProvider/src/main/AndroidManifest.xml delete mode 100644 OtakudesuProvider/src/main/kotlin/com/lagradost/OtakudesuProvider.kt delete mode 100644 OtakudesuProvider/src/main/kotlin/com/lagradost/OtakudesuProviderPlugin.kt delete mode 100644 PelisflixProvider/build.gradle.kts delete mode 100644 PelisflixProvider/src/main/AndroidManifest.xml delete mode 100644 PelisflixProvider/src/main/kotlin/com/lagradost/PelisflixProvider.kt delete mode 100644 PelisflixProvider/src/main/kotlin/com/lagradost/PelisflixProviderPlugin.kt delete mode 100644 PhimmoichillProvider/build.gradle.kts delete mode 100644 PhimmoichillProvider/src/main/AndroidManifest.xml delete mode 100644 PhimmoichillProvider/src/main/kotlin/com/lagradost/PhimmoichillProvider.kt delete mode 100644 PhimmoichillProvider/src/main/kotlin/com/lagradost/PhimmoichillProviderPlugin.kt delete mode 100644 PinoyHDXyzProvider/build.gradle.kts delete mode 100644 PinoyHDXyzProvider/src/main/AndroidManifest.xml delete mode 100644 PinoyHDXyzProvider/src/main/kotlin/com/lagradost/PinoyHDXyzProvider.kt delete mode 100644 PinoyHDXyzProvider/src/main/kotlin/com/lagradost/PinoyHDXyzProviderPlugin.kt delete mode 100644 PinoyMovies/build.gradle.kts delete mode 100644 PinoyMovies/src/main/AndroidManifest.xml delete mode 100644 PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviePediaProvider.kt delete mode 100644 PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviePediaProviderPlugin.kt delete mode 100644 PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviesEsProvider.kt delete mode 100644 PinoyMovies/src/main/kotlin/com/lagradost/VstreamhubHelper.kt delete mode 100644 PinoyMovies/src/main/kotlin/com/lagradost/XStreamCdn.kt delete mode 100644 RebahinProvider/build.gradle.kts delete mode 100644 RebahinProvider/src/main/AndroidManifest.xml delete mode 100644 RebahinProvider/src/main/kotlin/com/lagradost/RebahinProvider.kt delete mode 100644 RebahinProvider/src/main/kotlin/com/lagradost/RebahinProviderPlugin.kt delete mode 100644 TocanimeProvider/build.gradle.kts delete mode 100644 TocanimeProvider/src/main/AndroidManifest.xml delete mode 100644 TocanimeProvider/src/main/kotlin/com/lagradost/TocanimeProvider.kt delete mode 100644 TocanimeProvider/src/main/kotlin/com/lagradost/TocanimeProviderPlugin.kt delete mode 100644 UakinoProvider/build.gradle.kts delete mode 100644 UakinoProvider/src/main/AndroidManifest.xml delete mode 100644 UakinoProvider/src/main/kotlin/com/lagradost/UakinoProvider.kt delete mode 100644 UakinoProvider/src/main/kotlin/com/lagradost/UakinoProviderPlugin.kt delete mode 100644 VfFilmProvider/build.gradle.kts delete mode 100644 VfFilmProvider/src/main/AndroidManifest.xml delete mode 100644 VfFilmProvider/src/main/kotlin/com/lagradost/VfFilmProvider.kt delete mode 100644 VfFilmProvider/src/main/kotlin/com/lagradost/VfFilmProviderPlugin.kt delete mode 100644 VfSerieProvider/build.gradle.kts delete mode 100644 VfSerieProvider/src/main/AndroidManifest.xml delete mode 100644 VfSerieProvider/src/main/kotlin/com/lagradost/VfSerieProvider.kt delete mode 100644 VfSerieProvider/src/main/kotlin/com/lagradost/VfSerieProviderPlugin.kt delete mode 100644 XcineProvider/build.gradle.kts delete mode 100644 XcineProvider/src/main/AndroidManifest.xml delete mode 100644 XcineProvider/src/main/kotlin/com/lagradost/XcineProvider.kt delete mode 100644 XcineProvider/src/main/kotlin/com/lagradost/XcineProviderPlugin.kt delete mode 100644 YomoviesProvider/build.gradle.kts delete mode 100644 YomoviesProvider/src/main/AndroidManifest.xml delete mode 100644 YomoviesProvider/src/main/kotlin/com/lagradost/YomoviesProvider.kt delete mode 100644 YomoviesProvider/src/main/kotlin/com/lagradost/YomoviesProviderPlugin.kt diff --git a/AllAnimeProvider/build.gradle.kts b/AllAnimeProvider/build.gradle.kts index 7bb2284..019a4dc 100644 --- a/AllAnimeProvider/build.gradle.kts +++ b/AllAnimeProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/AllMoviesForYouProvider/build.gradle.kts b/AllMoviesForYouProvider/build.gradle.kts index 6de4950..c8f0301 100644 --- a/AllMoviesForYouProvider/build.gradle.kts +++ b/AllMoviesForYouProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/AniflixProvider/build.gradle.kts b/AniflixProvider/build.gradle.kts index dcf2ba3..d67f873 100644 --- a/AniflixProvider/build.gradle.kts +++ b/AniflixProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/AnimeFlickProvider/build.gradle.kts b/AnimeFlickProvider/build.gradle.kts index 25b3e27..e2ed228 100644 --- a/AnimeFlickProvider/build.gradle.kts +++ b/AnimeFlickProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/AnimeIndoProvider/build.gradle.kts b/AnimeIndoProvider/build.gradle.kts deleted file mode 100644 index 5caab06..0000000 --- a/AnimeIndoProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "OVA", - "Anime", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=animeindo.sbs&sz=24" -} \ No newline at end of file diff --git a/AnimeIndoProvider/src/main/AndroidManifest.xml b/AnimeIndoProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/AnimeIndoProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/AnimeIndoProvider/src/main/kotlin/com/lagradost/AnimeIndoProvider.kt b/AnimeIndoProvider/src/main/kotlin/com/lagradost/AnimeIndoProvider.kt deleted file mode 100644 index fb132b7..0000000 --- a/AnimeIndoProvider/src/main/kotlin/com/lagradost/AnimeIndoProvider.kt +++ /dev/null @@ -1,192 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.APIHolder.getCaptchaToken -import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.loadExtractor -import com.lagradost.nicehttp.NiceResponse -import org.jsoup.Jsoup -import org.jsoup.nodes.Element - -class AnimeIndoProvider : MainAPI() { - override var mainUrl = "https://animeindo.sbs" - override var name = "AnimeIndo" - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return if (t.contains("OVA") || t.contains("Special")) TvType.OVA - else if (t.contains("Movie")) TvType.AnimeMovie - else TvType.Anime - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Finished Airing" -> ShowStatus.Completed - "Currently Airing" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - - private suspend fun request(url: String): NiceResponse { - val req = app.get( - url, - cookies = mapOf("recaptcha_cookie" to "#Asia/Jakarta#-420#win32#Windows#0,false,false#Google Inc. (Intel)~ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0)") - ) - if (req.isSuccessful) { - return req - } else { - val document = app.get(url).document - val captchaKey = - document.select("script[src*=https://www.google.com/recaptcha/api.js?render=]") - .attr("src").substringAfter("render=").substringBefore("&") - val token = getCaptchaToken(url, captchaKey) - return app.post( - url, - data = mapOf( - "action" to "recaptcha_for_all", - "token" to "$token", - "sitekey" to captchaKey - ) - ) - } - } - } - - override val mainPage = mainPageOf( - "$mainUrl/anime-terbaru/page/" to "Anime Terbaru", - "$mainUrl/donghua-terbaru/page/" to "Donghua Terbaru" - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val document = request(request.data + page).document - val home = document.select("div.post-show > article").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun getProperAnimeLink(uri: String): String { - return if (uri.contains("/anime/")) { - uri - } else { - var title = uri.substringAfter("$mainUrl/") - title = when { - (title.contains("-episode")) && !(title.contains("-movie")) -> Regex("(.+)-episode").find( - title - )?.groupValues?.get(1).toString() - (title.contains("-movie")) -> Regex("(.+)-movie").find(title)?.groupValues?.get( - 1 - ).toString() - else -> title - } - "$mainUrl/anime/$title" - } - } - - private fun Element.toSearchResult(): AnimeSearchResponse? { - val title = this.selectFirst("div.title")?.text()?.trim() ?: return null - val href = getProperAnimeLink(this.selectFirst("a")!!.attr("href")) - val posterUrl = this.select("img[itemprop=image]").attr("src").toString() - val type = getType(this.select("div.type").text().trim()) - val epNum = - this.selectFirst("span.episode")?.ownText()?.replace(Regex("[^0-9]"), "")?.trim() - ?.toIntOrNull() - return newAnimeSearchResponse(title, href, type) { - this.posterUrl = posterUrl - addSub(epNum) - } - - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = request(link).document - - return document.select(".site-main.relat > article").map { - val title = it.selectFirst("div.title > h2")!!.ownText().trim() - val href = it.selectFirst("a")!!.attr("href") - val posterUrl = it.selectFirst("img")!!.attr("src").toString() - val type = getType(it.select("div.type").text().trim()) - newAnimeSearchResponse(title, href, type) { - this.posterUrl = posterUrl - } - } - } - - override suspend fun load(url: String): LoadResponse { - val document = request(url).document - - val title = document.selectFirst("h1.entry-title")?.text().toString().trim() - val poster = document.selectFirst("div.thumb > img[itemprop=image]")?.attr("src") - val tags = document.select("div.genxed > a").map { it.text() } - val type = getType( - document.selectFirst("div.info-content > div.spe > span:nth-child(6)")?.ownText() - .toString() - ) - val year = Regex("\\d, ([0-9]*)").find( - document.select("div.info-content > div.spe > span:nth-child(9) > time").text() - )?.groupValues?.get(1)?.toIntOrNull() - val status = getStatus( - document.selectFirst("div.info-content > div.spe > span:nth-child(1)")!!.ownText() - .trim() - ) - val description = document.select("div[itemprop=description] > p").text() - val trailer = document.selectFirst("div.player-embed iframe")?.attr("src") - val episodes = document.select("div.lstepsiode.listeps ul li").mapNotNull { - val header = it.selectFirst("span.lchx > a") ?: return@mapNotNull null - val name = header.text().trim() - val episode = header.text().trim().replace("Episode", "").trim().toIntOrNull() - val link = fixUrl(header.attr("href")) - Episode(link, name = name, episode = episode) - }.reversed() - - return newAnimeLoadResponse(title, url, type) { - engName = title - posterUrl = poster - this.year = year - addEpisodes(DubStatus.Subbed, episodes) - showStatus = status - plot = description - this.tags = tags - addTrailer(trailer) - } - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - - val document = request(data).document - document.select("div.itemleft > .mirror > option").mapNotNull { - fixUrl(Jsoup.parse(base64Decode(it.attr("value"))).select("iframe").attr("src")) - }.apmap { - if (it.startsWith("https://uservideo.xyz")) { - app.get(it, referer = "$mainUrl/").document.select("iframe").attr("src") - } else { - it - } - }.apmap { - loadExtractor(it, data, subtitleCallback, callback) - } - - return true - } - - -} \ No newline at end of file diff --git a/AnimeIndoProvider/src/main/kotlin/com/lagradost/AnimeIndoProviderPlugin.kt b/AnimeIndoProvider/src/main/kotlin/com/lagradost/AnimeIndoProviderPlugin.kt deleted file mode 100644 index d1dab81..0000000 --- a/AnimeIndoProvider/src/main/kotlin/com/lagradost/AnimeIndoProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class AnimeIndoProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(AnimeIndoProvider()) - } -} \ No newline at end of file diff --git a/AnimePaheProvider/build.gradle.kts b/AnimePaheProvider/build.gradle.kts index c6905e5..c74b698 100644 --- a/AnimePaheProvider/build.gradle.kts +++ b/AnimePaheProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/AnimeSailProvider/build.gradle.kts b/AnimeSailProvider/build.gradle.kts deleted file mode 100644 index 619cf24..0000000 --- a/AnimeSailProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "Anime", - "OVA", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=111.90.143.42&sz=24" -} \ No newline at end of file diff --git a/AnimeSailProvider/src/main/AndroidManifest.xml b/AnimeSailProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/AnimeSailProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/AnimeSailProvider/src/main/kotlin/com/lagradost/AnimeSailProvider.kt b/AnimeSailProvider/src/main/kotlin/com/lagradost/AnimeSailProvider.kt deleted file mode 100644 index b190fd8..0000000 --- a/AnimeSailProvider/src/main/kotlin/com/lagradost/AnimeSailProvider.kt +++ /dev/null @@ -1,191 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -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 com.lagradost.nicehttp.NiceResponse -import org.jsoup.Jsoup -import org.jsoup.nodes.Element - -class AnimeSailProvider : MainAPI() { - override var mainUrl = "https://111.90.143.42" - override var name = "AnimeSail" - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return if (t.contains("OVA") || t.contains("Special")) TvType.OVA - else if (t.contains("Movie")) TvType.AnimeMovie - else TvType.Anime - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Completed" -> ShowStatus.Completed - "Ongoing" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - private suspend fun request(url: String, ref: String? = null): NiceResponse { - return app.get( - url, - headers = mapOf("Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"), - cookies = mapOf("_as_ipin_ct" to "ID"), - referer = ref - ) - } - - override val mainPage = mainPageOf( - "$mainUrl/page/" to "Episode Terbaru", - "$mainUrl/movie-terbaru/page/" to "Movie Terbaru", - "$mainUrl/genres/donghua/page/" to "Donghua" - ) - - override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { - val document = request(request.data + page).document - val home = document.select("article").map { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun getProperAnimeLink(uri: String): String { - return if (uri.contains("/anime/")) { - uri - } else { - var title = uri.substringAfter("$mainUrl/") - title = when { - (title.contains("-episode")) && !(title.contains("-movie")) -> title.substringBefore( - "-episode" - ) - (title.contains("-movie")) -> title.substringBefore("-movie") - else -> title - } - - "$mainUrl/anime/$title" - } - } - - private fun Element.toSearchResult(): AnimeSearchResponse { - val href = getProperAnimeLink(fixUrlNull(this.selectFirst("a")?.attr("href")).toString()) - val title = this.select(".tt > h2").text().trim() - val posterUrl = fixUrlNull(this.selectFirst("div.limit img")?.attr("src")) - val epNum = this.selectFirst(".tt > h2")?.text()?.let { - Regex("Episode\\s?([0-9]+)").find(it)?.groupValues?.getOrNull(1)?.toIntOrNull() - } - return newAnimeSearchResponse(title, href, TvType.Anime) { - this.posterUrl = posterUrl - addSub(epNum) - } - - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = request(link).document - - return document.select("div.listupd article").map { - it.toSearchResult() - } - } - - override suspend fun load(url: String): LoadResponse { - val document = request(url).document - - val title = document.selectFirst("h1.entry-title")?.text().toString().trim() - val type = getType( - document.select("tbody th:contains(Tipe)").next().text() - ) - val episodes = document.select("ul.daftar > li").map { - val header = it.select("a").text().trim() - val name = - Regex("(Episode\\s?[0-9]+)").find(header)?.groupValues?.getOrNull(0) ?: header - val link = fixUrl(it.select("a").attr("href")) - Episode(link, name = name) - }.reversed() - - return newAnimeLoadResponse(title, url, type) { - posterUrl = document.selectFirst("div.entry-content > img")?.attr("src") - this.year = - document.select("tbody th:contains(Dirilis)").next().text().trim().toIntOrNull() - addEpisodes(DubStatus.Subbed, episodes) - showStatus = - getStatus(document.select("tbody th:contains(Status)").next().text().trim()) - plot = document.selectFirst("div.entry-content > p")?.text() - this.tags = - document.select("tbody th:contains(Genre)").next().select("a").map { it.text() } - } - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - - val document = request(data).document - - document.select(".mobius > .mirror > option").apmap { - safeApiCall { - val iframe = fixUrl( - Jsoup.parse(base64Decode(it.attr("data-em"))).select("iframe").attr("src") - ?: throw ErrorLoadingException("No iframe found") - ) - - when { - iframe.startsWith("$mainUrl/utils/player/arch/") || iframe.startsWith( - "$mainUrl/utils/player/race/" - ) -> request(iframe, ref = data).document.select("source").attr("src") - .let { link -> - val source = - when { - iframe.contains("/arch/") -> "Arch" - iframe.contains("/race/") -> "Race" - else -> this.name - } - val quality = - Regex("\\.([0-9]{3,4})\\.").find(link)?.groupValues?.get(1) - callback.invoke( - ExtractorLink( - source = source, - name = source, - url = link, - referer = mainUrl, - quality = quality?.toIntOrNull() ?: Qualities.Unknown.value - ) - ) - } -// skip for now -// iframe.startsWith("$mainUrl/utils/player/fichan/") -> "" -// iframe.startsWith("$mainUrl/utils/player/blogger/") -> "" - iframe.startsWith("$mainUrl/utils/player/framezilla/") || iframe.startsWith("https://uservideo.xyz") -> { - request(iframe, ref = data).document.select("iframe").attr("src") - .let { link -> - loadExtractor(fixUrl(link), mainUrl, subtitleCallback, callback) - } - } - else -> { - loadExtractor(iframe, mainUrl, subtitleCallback, callback) - } - } - } - } - - return true - } - - -} \ No newline at end of file diff --git a/AnimeSailProvider/src/main/kotlin/com/lagradost/AnimeSailProviderPlugin.kt b/AnimeSailProvider/src/main/kotlin/com/lagradost/AnimeSailProviderPlugin.kt deleted file mode 100644 index 6b2b8a9..0000000 --- a/AnimeSailProvider/src/main/kotlin/com/lagradost/AnimeSailProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class AnimeSailProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(AnimeSailProvider()) - } -} \ No newline at end of file diff --git a/AnimekisaProvider/build.gradle.kts b/AnimekisaProvider/build.gradle.kts index 5d62c10..79a7e5c 100644 --- a/AnimekisaProvider/build.gradle.kts +++ b/AnimekisaProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/AsiaFlixProvider/build.gradle.kts b/AsiaFlixProvider/build.gradle.kts index 0280ad9..b65b85c 100644 --- a/AsiaFlixProvider/build.gradle.kts +++ b/AsiaFlixProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/BflixProvider/build.gradle.kts b/BflixProvider/build.gradle.kts index 69c717d..e12d533 100644 --- a/BflixProvider/build.gradle.kts +++ b/BflixProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/DramaidProvider/build.gradle.kts b/DramaidProvider/build.gradle.kts deleted file mode 100644 index 14fe581..0000000 --- a/DramaidProvider/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AsianDrama", - "Movie", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=185.224.83.103&sz=24" -} \ No newline at end of file diff --git a/DramaidProvider/src/main/AndroidManifest.xml b/DramaidProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/DramaidProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/DramaidProvider/src/main/kotlin/com/lagradost/DramaidProvider.kt b/DramaidProvider/src/main/kotlin/com/lagradost/DramaidProvider.kt deleted file mode 100644 index 318a5ca..0000000 --- a/DramaidProvider/src/main/kotlin/com/lagradost/DramaidProvider.kt +++ /dev/null @@ -1,213 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.getQualityFromName -import com.lagradost.cloudstream3.utils.loadExtractor -import org.jsoup.Jsoup -import org.jsoup.nodes.Element - -class DramaidProvider : MainAPI() { - override var mainUrl = "https://185.224.83.103" - override var name = "DramaId" - override val hasQuickSearch = false - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - override val hasChromecastSupport = false - override val supportedTypes = setOf(TvType.AsianDrama) - - companion object { - fun getStatus(t: String): ShowStatus { - return when (t) { - "Completed" -> ShowStatus.Completed - "Ongoing" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - override val mainPage = mainPageOf( - "&status=&type=&order=update" to "Drama Terbaru", - "&order=latest" to "Baru Ditambahkan", - "&status=&type=&order=popular" to "Drama Popular", - ) - - override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { - val document = app.get("$mainUrl/series/?page=$page${request.data}").document - val home = document.select("article[itemscope=itemscope]").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun getProperDramaLink(uri: String): String { - return if (uri.contains("/series/")) { - uri - } else { - "$mainUrl/series/" + Regex("$mainUrl/(.+)-ep.+").find(uri)?.groupValues?.get(1) - .toString() - } - } - - private fun Element.toSearchResult(): SearchResponse? { - val href = getProperDramaLink(this.selectFirst("a.tip")!!.attr("href")) - val title = this.selectFirst("h2[itemprop=headline]")?.text()?.trim() ?: return null - val posterUrl = fixUrlNull(this.selectFirst(".limit > noscript > img")?.attr("src")) - - return newTvSeriesSearchResponse(title, href, TvType.AsianDrama) { - this.posterUrl = posterUrl - } - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = app.get(link).document - - return document.select("article[itemscope=itemscope]").map { - val title = it.selectFirst("h2[itemprop=headline]")!!.text().trim() - val poster = it.selectFirst(".limit > noscript > img")!!.attr("src") - val href = it.selectFirst("a.tip")!!.attr("href") - - newTvSeriesSearchResponse(title, href, TvType.AsianDrama) { - this.posterUrl = poster - } - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst("h1.entry-title")!!.text().trim() - val poster = document.select(".thumb > noscript > img").attr("src") - val tags = document.select(".genxed > a").map { it.text() } - - val year = Regex("\\d, ([0-9]*)").find( - document.selectFirst(".info-content > .spe > span > time")!!.text().trim() - )?.groupValues?.get(1).toString().toIntOrNull() - val status = getStatus( - document.select(".info-content > .spe > span:nth-child(1)") - .text().trim().replace("Status: ", "") - ) - val description = document.select(".entry-content > p").text().trim() - - val episodes = document.select(".eplister > ul > li").map { - val name = it.selectFirst("a > .epl-title")!!.text().trim() - val link = it.select("a").attr("href") - val epNum = it.selectFirst("a > .epl-num")!!.text().trim().toIntOrNull() - newEpisode(link) { - this.name = name - this.episode = epNum - } - }.reversed() - - val recommendations = - document.select(".listupd > article[itemscope=itemscope]").map { rec -> - val epTitle = rec.selectFirst("h2[itemprop=headline]")!!.text().trim() - val epPoster = rec.selectFirst(".limit > noscript > img")!!.attr("src") - val epHref = fixUrl(rec.selectFirst("a.tip")!!.attr("href")) - - newTvSeriesSearchResponse(epTitle, epHref, TvType.AsianDrama) { - this.posterUrl = epPoster - } - } - - if (episodes.size == 1) { - return newMovieLoadResponse(title, url, TvType.Movie, episodes[0].data) { - posterUrl = poster - this.year = year - plot = description - this.tags = tags - this.recommendations = recommendations - } - } else { - return newTvSeriesLoadResponse(title, url, TvType.AsianDrama, episodes = episodes) { - posterUrl = poster - this.year = year - showStatus = status - plot = description - this.tags = tags - this.recommendations = recommendations - } - } - - } - - private data class Sources( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String, - @JsonProperty("type") val type: String, - @JsonProperty("default") val default: Boolean? - ) - - private data class Tracks( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String, - @JsonProperty("kind") val type: String, - @JsonProperty("default") val default: Boolean? - ) - - private suspend fun invokeDriveSource( - url: String, - name: String, - subCallback: (SubtitleFile) -> Unit, - sourceCallback: (ExtractorLink) -> Unit - ) { - val server = app.get(url).document.selectFirst(".picasa")?.nextElementSibling()?.data() - - val source = "[${server!!.substringAfter("sources: [").substringBefore("],")}]".trimIndent() - val trackers = server.substringAfter("tracks:[").substringBefore("],") - .replace("//language", "") - .replace("file", "\"file\"") - .replace("label", "\"label\"") - .replace("kind", "\"kind\"").trimIndent() - - tryParseJson>(source)?.map { - sourceCallback( - ExtractorLink( - name, - "Drive", - fixUrl(it.file), - referer = "https://motonews.club/", - quality = getQualityFromName(it.label) - ) - ) - } - - tryParseJson(trackers)?.let { - subCallback.invoke( - SubtitleFile( - if (it.label.contains("Indonesia")) "${it.label}n" else it.label, - it.file - ) - ) - } - - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - val document = app.get(data).document - val sources = document.select(".mobius > .mirror > option").mapNotNull { - fixUrl(Jsoup.parse(base64Decode(it.attr("value"))).select("iframe").attr("src")) - } - - sources.map { - it.replace("https://ndrama.xyz", "https://www.fembed.com") - }.apmap { - when { - it.contains("motonews.club") -> invokeDriveSource(it, this.name, subtitleCallback, callback) - else -> loadExtractor(it, data, subtitleCallback, callback) - } - } - - return true - } - -} diff --git a/DramaidProvider/src/main/kotlin/com/lagradost/DramaidProviderPlugin.kt b/DramaidProvider/src/main/kotlin/com/lagradost/DramaidProviderPlugin.kt deleted file mode 100644 index 4ee73cb..0000000 --- a/DramaidProvider/src/main/kotlin/com/lagradost/DramaidProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class DramaidProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(DramaidProvider()) - } -} \ No newline at end of file diff --git a/DubbedAnimeProvider/build.gradle.kts b/DubbedAnimeProvider/build.gradle.kts index 0644ac5..49602bc 100644 --- a/DubbedAnimeProvider/build.gradle.kts +++ b/DubbedAnimeProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/DubokuProvider/build.gradle.kts b/DubokuProvider/build.gradle.kts deleted file mode 100644 index 02e1885..0000000 --- a/DubokuProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AsianDrama", - "TvSeries", - "Movie", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=www.duboku.tv&sz=24" -} \ No newline at end of file diff --git a/DubokuProvider/src/main/AndroidManifest.xml b/DubokuProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/DubokuProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/DubokuProvider/src/main/kotlin/com/lagradost/DubokuProvider.kt b/DubokuProvider/src/main/kotlin/com/lagradost/DubokuProvider.kt deleted file mode 100644 index a71d781..0000000 --- a/DubokuProvider/src/main/kotlin/com/lagradost/DubokuProvider.kt +++ /dev/null @@ -1,133 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addActors -import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.M3u8Helper -import org.jsoup.nodes.Element - -class DubokuProvider : MainAPI() { - override var mainUrl = "https://www.duboku.tv" - override var name = "Duboku" - override val hasMainPage = true - override var lang = "zh" - override val hasDownloadSupport = true - override val supportedTypes = setOf( - TvType.Movie, - TvType.TvSeries, - TvType.AsianDrama, - ) - - override val mainPage = mainPageOf( - "$mainUrl/vodshow/2--time------" to "连续剧 时间", - "$mainUrl/vodshow/2--hits------" to "连续剧 人气", - "$mainUrl/vodshow/13--time------" to "陆剧 时间", - "$mainUrl/vodshow/13--hits------" to "陆剧 人气", - "$mainUrl/vodshow/15--time------" to "日韩剧 时间", - "$mainUrl/vodshow/15--hits------" to "日韩剧 人气", - "$mainUrl/vodshow/21--time------" to "短剧 时间", - "$mainUrl/vodshow/21--hits------" to "短剧 人气", - "$mainUrl/vodshow/16--time------" to "英美剧 时间", - "$mainUrl/vodshow/16--hits------" to "英美剧 人气", - "$mainUrl/vodshow/14--time------" to "台泰剧 时间", - "$mainUrl/vodshow/14--hits------" to "台泰剧 人气", - "$mainUrl/vodshow/20--time------" to "港剧 时间", - "$mainUrl/vodshow/20--hits------" to "港剧 人气", - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val document = app.get("${request.data}$page---.html").document - val home = document.select("ul.myui-vodlist.clearfix li").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun Element.toSearchResult(): SearchResponse? { - val title = this.selectFirst("h4.title a")?.text()?.trim() ?: return null - val href = fixUrl(this.selectFirst("a")?.attr("href").toString()) - val posterUrl = fixUrlNull(this.selectFirst("a")?.attr("data-original")) - val episode = this.selectFirst("span.pic-text.text-right")?.text()?.filter { it.isDigit() } - ?.toIntOrNull() - - return newAnimeSearchResponse(title, href, TvType.Movie) { - this.posterUrl = posterUrl - addSub(episode) - } - } - - override suspend fun search(query: String): List { - val document = app.get("$mainUrl/vodsearch/-------------.html?wd=$query&submit=").document - - return document.select("ul#searchList li").mapNotNull { - it.toSearchResult() - } - } - - override suspend fun load(url: String): LoadResponse? { - val document = app.get(url).document - - val title = document.selectFirst("h1.title")?.text()?.trim() ?: return null - val tvType = if (document.select("ul.myui-content__list li").size == 1 - ) TvType.Movie else TvType.TvSeries - val actors = document.select("p.data")[2].select("a").map { it.text() } - - val episodes = document.select("ul.myui-content__list li").map { - val href = fixUrl(it.select("a").attr("href")) - val name = it.select("a").text().trim() - Episode( - data = href, - name = name, - ) - } - return newTvSeriesLoadResponse(title, url, tvType, episodes) { - this.posterUrl = fixUrlNull( - document.selectFirst("a.myui-vodlist__thumb.picture img")?.attr("data-original") - ) - this.year = - document.select("p.data")[0].select("a").last()?.text()?.trim()?.toIntOrNull() - this.plot = document.selectFirst("span.sketch.content")?.text()?.trim() - this.tags = document.select("p.data")[0].select("a").map { it.text() } - this.rating = document.select("div#rating span.branch").text().toRatingInt() - addActors(actors) - } - - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - - app.get(data).document.select("script").map { script -> - if (script.data().contains("var player_data={")) { - val dataJson = - script.data().substringAfter("var player_data={").substringBefore("}") - tryParseJson("{$dataJson}")?.let { source -> - M3u8Helper.generateM3u8( - this.name, - source.url ?: return@map, - referer = "https://w.duboku.io/", - headers = mapOf("Origin" to "https://w.duboku.io") - ).forEach(callback) - } - } - } - - - return true - } - - data class Sources( - @JsonProperty("url") val url: String?, - ) - - -} \ No newline at end of file diff --git a/DubokuProvider/src/main/kotlin/com/lagradost/DubokuProviderPlugin.kt b/DubokuProvider/src/main/kotlin/com/lagradost/DubokuProviderPlugin.kt deleted file mode 100644 index 4c77005..0000000 --- a/DubokuProvider/src/main/kotlin/com/lagradost/DubokuProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class DubokuProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(DubokuProvider()) - } -} \ No newline at end of file diff --git a/EjaTv/build.gradle.kts b/EjaTv/build.gradle.kts index f5651cf..c663a09 100644 --- a/EjaTv/build.gradle.kts +++ b/EjaTv/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/FrenchStreamProvider/build.gradle.kts b/FrenchStreamProvider/build.gradle.kts deleted file mode 100644 index 207caf1..0000000 --- a/FrenchStreamProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "TvSeries", - "Movie", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=french-stream.re&sz=24" -} \ No newline at end of file diff --git a/FrenchStreamProvider/src/main/AndroidManifest.xml b/FrenchStreamProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/FrenchStreamProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/FrenchStreamProvider/src/main/kotlin/com/lagradost/FrenchStreamProvider.kt b/FrenchStreamProvider/src/main/kotlin/com/lagradost/FrenchStreamProvider.kt deleted file mode 100644 index 4d6720c..0000000 --- a/FrenchStreamProvider/src/main/kotlin/com/lagradost/FrenchStreamProvider.kt +++ /dev/null @@ -1,273 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addRating -import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.extractorApis - - -class FrenchStreamProvider : MainAPI() { - override var mainUrl = "https://french-stream.re" - override var name = "French Stream" - override val hasQuickSearch = false - override val hasMainPage = true - override var lang = "fr" - override val supportedTypes = setOf(TvType.AnimeMovie, TvType.TvSeries, TvType.Movie) - - override suspend fun search(query: String): List { - val link = "$mainUrl/?do=search&subaction=search&story=$query" - val soup = app.post(link).document - - return soup.select("div.short-in.nl").map { li -> - val href = fixUrl(li.selectFirst("a.short-poster")!!.attr("href")) - val poster = li.selectFirst("img")?.attr("src") - val title = li.selectFirst("> a.short-poster")!!.text().toString().replace(". ", "") - val year = li.selectFirst(".date")?.text()?.split("-")?.get(0)?.toIntOrNull() - if (title.contains( - "saison", - ignoreCase = true - ) - ) { // if saison in title ==> it's a TV serie - TvSeriesSearchResponse( - title, - href, - this.name, - TvType.TvSeries, - poster, - year, - (title.split("Eps ", " ")[1]).split(" ")[0].toIntOrNull() - ) - } else { // it's a movie - MovieSearchResponse( - title, - href, - this.name, - TvType.Movie, - poster, - year, - ) - } - } - } - - override suspend fun load(url: String): LoadResponse { - val soup = app.get(url).document - - val title = soup.selectFirst("h1#s-title")!!.text().toString() - val isMovie = !title.contains("saison", ignoreCase = true) - val description = - soup.selectFirst("div.fdesc")!!.text().toString() - .split("streaming", ignoreCase = true)[1].replace(" : ", "") - var poster = fixUrlNull(soup.selectFirst("div.fposter > img")?.attr("src")) - val listEpisode = soup.select("div.elink") - - if (isMovie) { - val tags = soup.select("ul.flist-col > li").getOrNull(1) - val tagsList = tags?.select("a") - ?.mapNotNull { // all the tags like action, thriller ...; unused variable - it?.text() - } - return newMovieLoadResponse(title, url, TvType.Movie, url) { - this.posterUrl = poster - addRating(soup.select("div.fr-count > div").text()) - this.year = soup.select("ul.flist-col > li").getOrNull(2)?.text()?.toIntOrNull() - this.tags = tagsList - this.plot = description - addTrailer(soup.selectFirst("div.fleft > span > a")?.attr("href")) - } - } else // a tv serie - { - //println(listEpisode) - //println("listeEpisode:") - val episodeList = if (" - val epNum = a.text().split("Episode")[1].trim().toIntOrNull() - val epTitle = if (a.text().contains("Episode")) { - val type = if ("honey" in a.attr("id")) { - "VF" - } else { - "VOSTFR" - } - "Episode " + epNum?.toString() + " en " + type - } else { - a.text() - } - if (poster == null) { - poster = a.selectFirst("div.fposter > img")?.attr("src") - } - Episode( - fixUrl(url).plus("-episodenumber:$epNum"), - epTitle, - null, - epNum, - null, // episode Thumbnail - null // episode date - ) - } - return TvSeriesLoadResponse( - title, - url, - this.name, - TvType.TvSeries, - episodes, - poster, - null, - description, - ShowStatus.Ongoing, - ) - } - } - - fun translate( - // the website has weird naming of series for episode 2 and 1 and original version content - episodeNumber: String, - is_vf_available: Boolean, - ): String { - return if (episodeNumber == "1") { - if (is_vf_available) { // 1 translate differently if vf is available or not - "FGHIJK" - } else { - "episode033" - } - } else { - "episode" + (episodeNumber.toInt() + 32).toString() - } - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit, - ): Boolean { - val servers = - if (data.contains("-episodenumber:"))// It's a serie: - { - val split = - data.split("-episodenumber:") // the data contains the url and the wanted episode number (a temporary dirty fix that will last forever) - val url = split[0] - val wantedEpisode = - if (split[1] == "2") { // the episode number 2 has id of ABCDE, don't ask any question - "ABCDE" - } else { - "episode" + split[1] - } - - - val soup = app.get(fixUrl(url)).document - val div = - if (wantedEpisode == "episode1") { - "> div.tabs-sel " // this element is added when the wanted episode is one (the place changes in the document) - } else { - "" - } - val serversvf =// French version servers - soup.select("div#$wantedEpisode > div.selink > ul.btnss $div> li") - .mapNotNull { li -> // list of all french version servers - val serverUrl = fixUrl(li.selectFirst("a")!!.attr("href")) -// val litext = li.text() - if (serverUrl.isNotBlank()) { - if (li.text().replace(" ", "").replace(" ", "").isNotBlank()) { - Pair(li.text().replace(" ", ""), "vf" + fixUrl(serverUrl)) - } else { - null - } - } else { - null - } - } - - val translated = translate(split[1], serversvf.isNotEmpty()) - val serversvo = // Original version servers - soup.select("div#$translated > div.selink > ul.btnss $div> li") - .mapNotNull { li -> - val serverUrl = fixUrlNull(li.selectFirst("a")?.attr("href")) - if (!serverUrl.isNullOrEmpty()) { - if (li.text().replace(" ", "").isNotBlank()) { - Pair(li.text().replace(" ", ""), "vo" + fixUrl(serverUrl)) - } else { - null - } - } else { - null - } - } - serversvf + serversvo - } else { // it's a movie - val movieServers = - app.get(fixUrl(data)).document.select("nav#primary_nav_wrap > ul > li > ul > li > a") - .mapNotNull { a -> - val serverurl = fixUrlNull(a.attr("href")) ?: return@mapNotNull null - val parent = a.parents()[2] - val element = parent.selectFirst("a")!!.text().plus(" ") - if (a.text().replace(" ", "").isNotBlank()) { - Pair(element.plus(a.text()), fixUrl(serverurl)) - } else { - null - } - } - movieServers - } - - servers.apmap { - for (extractor in extractorApis) { - if (it.first.contains(extractor.name, ignoreCase = true)) { - // val name = it.first - // print("true for $name") - extractor.getSafeUrl(it.second, it.second, subtitleCallback, callback) - break - } - } - } - - return true - } - - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse? { - val document = app.get(mainUrl).document - val docs = document.select("div.sect") - val returnList = docs.mapNotNull { - val epList = it.selectFirst("> div.sect-c.floats.clearfix") ?: return@mapNotNull null - val title = - it.selectFirst("> div.sect-t.fx-row.icon-r > div.st-left > a.st-capt")!!.text() - val list = epList.select("> div.short") - val isMovieType = title.contains("Films") // if truen type is Movie - val currentList = list.map { head -> - val hrefItem = head.selectFirst("> div.short-in.nl > a") - val href = fixUrl(hrefItem!!.attr("href")) - val img = hrefItem.selectFirst("> img") - val posterUrl = img!!.attr("src") - val name = img.attr("> div.short-title").toString() - return@map if (isMovieType) MovieSearchResponse( - name, - href, - this.name, - TvType.Movie, - posterUrl, - null - ) else TvSeriesSearchResponse( - name, - href, - this.name, - TvType.TvSeries, - posterUrl, - null, null - ) - } - if (currentList.isNotEmpty()) { - HomePageList(title, currentList) - } else null - } - if (returnList.isEmpty()) return null - return HomePageResponse(returnList) - } -} diff --git a/FrenchStreamProvider/src/main/kotlin/com/lagradost/FrenchStreamProviderPlugin.kt b/FrenchStreamProvider/src/main/kotlin/com/lagradost/FrenchStreamProviderPlugin.kt deleted file mode 100644 index f111fc9..0000000 --- a/FrenchStreamProvider/src/main/kotlin/com/lagradost/FrenchStreamProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class FrenchStreamProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(FrenchStreamProvider()) - } -} \ No newline at end of file diff --git a/GogoanimeProvider/build.gradle.kts b/GogoanimeProvider/build.gradle.kts index 2ee6852..3f30ffc 100644 --- a/GogoanimeProvider/build.gradle.kts +++ b/GogoanimeProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/GomunimeProvider/build.gradle.kts b/GomunimeProvider/build.gradle.kts deleted file mode 100644 index c9cdc6d..0000000 --- a/GomunimeProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "Anime", - "OVA", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=185.231.223.76&sz=24" -} \ No newline at end of file diff --git a/GomunimeProvider/src/main/AndroidManifest.xml b/GomunimeProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/GomunimeProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/GomunimeProvider/src/main/kotlin/com/lagradost/GomunimeProvider.kt b/GomunimeProvider/src/main/kotlin/com/lagradost/GomunimeProvider.kt deleted file mode 100644 index 30689dc..0000000 --- a/GomunimeProvider/src/main/kotlin/com/lagradost/GomunimeProvider.kt +++ /dev/null @@ -1,232 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer -import com.lagradost.cloudstream3.mvvm.safeApiCall -import com.lagradost.cloudstream3.utils.AppUtils.parseJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.M3u8Helper -import com.lagradost.cloudstream3.utils.Qualities -import com.lagradost.cloudstream3.utils.loadExtractor -import org.jsoup.Jsoup - -class GomunimeProvider : MainAPI() { - override var mainUrl = "https://185.231.223.76" - override var name = "Gomunime" - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return if (t.contains("OVA") || t.contains("Special")) TvType.OVA - else if (t.contains("Movie")) TvType.AnimeMovie - else TvType.Anime - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Completed" -> ShowStatus.Completed - "Ongoing" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - override val mainPage = mainPageOf( - "e" to "Episode Baru", - "c" to "Completed", - "la" to "Live Action", - "t" to "Trending" - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val home = Jsoup.parse( - (app.post( - url = "$mainUrl/wp-admin/admin-ajax.php/wp-admin/admin-ajax.php", - headers = mapOf("Referer" to mainUrl), - data = mapOf( - "action" to "home_ajax", - "fungsi" to request.data, - "pag" to "$page" - ) - ).parsedSafe()?.html ?: throw ErrorLoadingException("Invalid Json reponse")) - ).select("li").mapNotNull { - val title = it.selectFirst("a.name")?.text()?.trim() ?: return@mapNotNull null - val href = getProperAnimeLink(it.selectFirst("a")!!.attr("href")) - val posterUrl = it.selectFirst("img")?.attr("src") - val type = getType(it.selectFirst(".taglist > span")!!.text().trim()) - val epNum = it.select(".tag.ep").text().replace(Regex("[^0-9]"), "").trim() - .toIntOrNull() - newAnimeSearchResponse(title, href, type) { - this.posterUrl = posterUrl - addSub(epNum) - } - } - - return newHomePageResponse(request.name, home) - } - - private fun getProperAnimeLink(uri: String): String { - return if (uri.contains("-episode")) { - val href = - "$mainUrl/anime/" + Regex("\\w\\d/(.*)-episode.*").find(uri)?.groupValues?.get(1) - .toString() - when { - href.contains("pokemon") -> href.replace(Regex("-[0-9]+"), "") - else -> href - } - } else { - uri - } - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = app.get(link).document - - return document.select(".anime-list > li").map { - val title = it.selectFirst("a.name")!!.text() - val poster = it.selectFirst("img")!!.attr("src") - val tvType = getType(it.selectFirst(".taglist > span")?.text().toString()) - val href = fixUrl(it.selectFirst("a.name")!!.attr("href")) - - newAnimeSearchResponse(title, href, tvType) { - this.posterUrl = poster - addDubStatus(dubExist = false, subExist = true) - } - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst(".entry-title")?.text().toString() - val poster = document.selectFirst(".thumbposter > img")?.attr("data-lazy-src") - val tags = document.select(".genxed > a").map { it.text() } - - val year = Regex("\\d, ([0-9]*)").find( - document.select("time[itemprop = datePublished]").text() - )?.groupValues?.get(1)?.toIntOrNull() - val status = getStatus(document.selectFirst(".spe > span")!!.ownText()) - val description = document.select("div[itemprop = description] > p").text() - val trailer = document.selectFirst("div.embed-responsive noscript iframe")?.attr("src") - val episodes = parseJson>( - Regex("var episodelist = (\\[.*])").find( - document.select(".bixbox.bxcl.epcheck > script").toString().trim() - )?.groupValues?.get(1).toString().replace(Regex("""\\"""), "").trim() - ).map { - val name = - Regex("(Episode\\s?[0-9]+)").find(it.epTitle.toString())?.groupValues?.getOrNull(0) - ?: it.epTitle - val link = it.epLink - Episode(link, name) - }.reversed() - - return newAnimeLoadResponse(title, url, TvType.Anime) { - engName = title - posterUrl = poster - this.year = year - addEpisodes(DubStatus.Subbed, episodes) - showStatus = status - plot = description - this.tags = tags - addTrailer(trailer) - } - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - val document = app.get(data).document - - val scriptData = document.select("aside.sidebar > script").dataNodes().toString() - val key = scriptData.substringAfter("var a_ray = '").substringBefore("';") - val title = scriptData.substringAfter("var judul_postingan = \"").substringBefore("\";") - - val sources: List> = app.post( - url = "https://path.gomuni.me/app/vapi.php", - data = mapOf("data" to key, "judul" to title, "func" to "mirror") - ).document.select("div.gomunime-server-mirror").map { - Pair( - it.attr("data-vhash"), - it.attr("data-type") - ) - } - - sources.apmap { - safeApiCall { - when { - it.second.contains("frame") -> { - loadExtractor(it.first, data, subtitleCallback, callback) - } - it.second.contains("hls") -> { - app.post( - url = "https://path.gomuni.me/app/vapi.php", - data = mapOf("fid" to it.first, "func" to "hls") - ).text.let { link -> - M3u8Helper.generateM3u8( - this.name, - link, - "$mainUrl/", - headers = mapOf("Origin" to mainUrl) - ).forEach(callback) - } - } - it.second.contains("mp4") -> { - app.post( - url = "https://path.gomuni.me/app/vapi.php", - data = mapOf("data" to it.first, "func" to "blogs") - ).parsed>().map { - callback.invoke( - ExtractorLink( - source = name, - name = "Mobi SD", - url = it.file, - referer = "$mainUrl/", - quality = Qualities.P360.value - ) - ) - } - } - else -> null - } - } - } - - return true - } - - private data class Response( - @JsonProperty("status") val status: Boolean, - @JsonProperty("html") val html: String - ) - - data class MobiSource( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String, - @JsonProperty("type") val type: String - ) - - private data class EpisodeElement( - @JsonProperty("data-index") val dataIndex: Long?, - @JsonProperty("ep-num") val epNum: String?, - @JsonProperty("ep-title") val epTitle: String?, - @JsonProperty("ep-link") val epLink: String, - @JsonProperty("ep-date") val epDate: String? - ) - -} \ No newline at end of file diff --git a/GomunimeProvider/src/main/kotlin/com/lagradost/GomunimeProviderPlugin.kt b/GomunimeProvider/src/main/kotlin/com/lagradost/GomunimeProviderPlugin.kt deleted file mode 100644 index 3a7ecee..0000000 --- a/GomunimeProvider/src/main/kotlin/com/lagradost/GomunimeProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class GomunimeProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(GomunimeProvider()) - } -} \ No newline at end of file diff --git a/HDMProvider/build.gradle.kts b/HDMProvider/build.gradle.kts index 1e957a0..75c5595 100644 --- a/HDMProvider/build.gradle.kts +++ b/HDMProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/HDMovie5/build.gradle.kts b/HDMovie5/build.gradle.kts deleted file mode 100644 index 7fdd3a5..0000000 --- a/HDMovie5/build.gradle.kts +++ /dev/null @@ -1,24 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * 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", - ) - - } \ No newline at end of file diff --git a/HDMovie5/src/main/AndroidManifest.xml b/HDMovie5/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/HDMovie5/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/HDMovie5/src/main/kotlin/com/lagradost/HDMovie5.kt b/HDMovie5/src/main/kotlin/com/lagradost/HDMovie5.kt deleted file mode 100644 index 8691c02..0000000 --- a/HDMovie5/src/main/kotlin/com/lagradost/HDMovie5.kt +++ /dev/null @@ -1,154 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.httpsify -import com.lagradost.cloudstream3.utils.loadExtractor -import org.jsoup.Jsoup -import org.jsoup.nodes.Element - -class HDMovie5 : MainAPI() { - override var mainUrl = "https://hdmovie2.click" - override var name = "HDMovie" - override var lang = "hi" - - override val hasQuickSearch = true - override val hasMainPage = true - override val supportedTypes = setOf( - TvType.Movie, - TvType.TvSeries, - ) - - override val mainPage = mainPageOf( - "$mainUrl/genre/tv-movie/page/" to "TV Movie", - "$mainUrl/genre/tv-show/page/" to "TV- Show", - "$mainUrl/genre/hindi-dubbed/page/" to "Hindi Dubbed", - "$mainUrl/genre/netflix/page/" to "NETFLIX", - ) - - override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { - val home = app.get(request.data + page).document.select("article.item").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun Element.toSearchResult(): SearchResponse? { - val title = this.selectFirst("h3 > a")?.text()?.trim() ?: return null - val href = fixUrl(this.selectFirst("a")!!.attr("href")) - val posterUrl = this.selectFirst("img")?.attr("src") - return newMovieSearchResponse(title, href, TvType.Movie) { - addPoster(posterUrl) - } - } - - private data class QuickSearchResponse( - val title: String, - val url: String, - val img: String, - val extra: Extra - ) { - data class Extra( - val date: String - ) - } - - override suspend fun quickSearch(query: String): List { - return app.get("$mainUrl/wp-json/dooplay/search/?keyword=$query&nonce=ddbde04d9c") - .parsed>().map { - val res = it.value - MovieSearchResponse( - res.title, - res.url, - this.name, - TvType.Movie, - res.img, - res.extra.date.toIntOrNull() - ) - } - } - - override suspend fun search(query: String): List { - return app.get("$mainUrl/?s=$query").document.select(".search-page>div.result-item").map { - val image = it.select(".image") - MovieSearchResponse( - image.select("img").attr("alt"), - image.select("a").attr("href"), - this.name, - TvType.Movie, - image.select("img").attr("src"), - it.select(".year").text().toIntOrNull() - ) - } - } - - override suspend fun load(url: String): LoadResponse { - val doc = app.get(url).document - val info = doc.select(".sheader") - val links = doc.select("#playeroptionsul>li") - val data = links.joinToString(",") { it.attr("data-post") } - return MovieLoadResponse( - info.select(".data>h1").text(), - url, - this.name, - TvType.Movie, - data, - info.select(".poster>img").attr("src"), - info.select(".date").text().substringAfter(", ").toIntOrNull(), - doc.select(".wp-content>p").let { it.getOrNull(it.size - 1)?.text() }, - (doc.select("#repimdb>strong").text().toFloatOrNull()?.times(1000))?.toInt(), - info.select(".sgeneros>a").map { it.text() }, - info.select(".runtime").text().substringBefore(" Min.").toIntOrNull(), - mutableListOf(), - doc.select("#single_relacionados>article>a").map { - val img = it.select("img") - MovieSearchResponse( - img.attr("alt"), - it.attr("href"), - this.name, - TvType.Movie, - img.attr("src") - ) - }, - doc.select("#cast>.persons>.person").mapNotNull { - if (it.attr("itemprop") != "director") { - ActorData( - Actor( - it.select("meta").attr("content"), - it.select("img").attr("src") - ) - ) - } else null - }, - ) - } - - private data class PlayerAjaxResponse( - @JsonProperty("embed_url") - val embedURL: String? = null - ) - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - return data.split(",").apmapIndexed { index, it -> - val p = app.post( - "$mainUrl/wp-admin/admin-ajax.php", - data = mapOf( - "action" to "doo_player_ajax", - "post" to it, - "nume" to "${index + 1}", - "type" to "movie" - ) - ) - val html = p.parsedSafe()?.embedURL ?: return@apmapIndexed false - val doc = Jsoup.parse(html) - val link = doc.select("iframe").attr("src") - loadExtractor(httpsify(link), "$mainUrl/", subtitleCallback, callback) - }.contains(true) - } -} diff --git a/HDMovie5/src/main/kotlin/com/lagradost/HDMovie5Plugin.kt b/HDMovie5/src/main/kotlin/com/lagradost/HDMovie5Plugin.kt deleted file mode 100644 index 9d35487..0000000 --- a/HDMovie5/src/main/kotlin/com/lagradost/HDMovie5Plugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class HDMovie5Plugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(HDMovie5()) - } -} \ No newline at end of file diff --git a/HDrezkaProvider/build.gradle.kts b/HDrezkaProvider/build.gradle.kts deleted file mode 100644 index b795753..0000000 --- a/HDrezkaProvider/build.gradle.kts +++ /dev/null @@ -1,27 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AsianDrama", - "Anime", - "TvSeries", - "Movie", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=hdrezka19139.org&sz=24" -} \ No newline at end of file diff --git a/HDrezkaProvider/src/main/AndroidManifest.xml b/HDrezkaProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/HDrezkaProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/HDrezkaProvider/src/main/kotlin/com/lagradost/HDrezkaProvider.kt b/HDrezkaProvider/src/main/kotlin/com/lagradost/HDrezkaProvider.kt deleted file mode 100644 index 6d7da73..0000000 --- a/HDrezkaProvider/src/main/kotlin/com/lagradost/HDrezkaProvider.kt +++ /dev/null @@ -1,408 +0,0 @@ -package com.lagradost - -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.mvvm.suspendSafeApiCall -import com.lagradost.cloudstream3.utils.AppUtils.toJson -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 -import org.jsoup.Jsoup -import org.jsoup.nodes.Element -import java.util.* - -class HDrezkaProvider : MainAPI() { - override var mainUrl = "https://hdrezka19139.org" - override var name = "HDrezka" - override val hasMainPage = true - override var lang = "ru" - override val hasDownloadSupport = true - override val supportedTypes = setOf( - TvType.Movie, - TvType.TvSeries, - TvType.Anime, - TvType.AsianDrama - ) - - override val mainPage = mainPageOf( - "$mainUrl/films/?filter=watching" to "фильмы", - "$mainUrl/series/?filter=watching" to "сериалы", - "$mainUrl/cartoons/?filter=watching" to "мультфильмы", - "$mainUrl/animation/?filter=watching" to "аниме", - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val url = request.data.split("?") - val home = app.get("${url.first()}page/$page/?${url.last()}").document.select( - "div.b-content__inline_items div.b-content__inline_item" - ).map { - it.toSearchResult() - } - - return newHomePageResponse(request.name, home) - } - - private fun Element.toSearchResult(): SearchResponse { - val title = - this.selectFirst("div.b-content__inline_item-link > a")?.text()?.trim().toString() - val href = this.selectFirst("a")?.attr("href").toString() - val posterUrl = this.select("img").attr("src") - val type = if (this.select("span.info").isNotEmpty()) TvType.TvSeries else TvType.Movie - return if (type == TvType.Movie) { - newMovieSearchResponse(title, href, TvType.Movie) { - this.posterUrl = posterUrl - } - } else { - val episode = - this.select("span.info").text().substringAfter(",").replace(Regex("[^0-9]"), "") - .toIntOrNull() - newAnimeSearchResponse(title, href, TvType.TvSeries) { - this.posterUrl = posterUrl - addDubStatus( - dubExist = true, - dubEpisodes = episode, - subExist = true, - subEpisodes = episode - ) - } - } - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/search/?do=search&subaction=search&q=$query" - val document = app.get(link).document - - return document.select("div.b-content__inline_items div.b-content__inline_item").map { - it.toSearchResult() - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val id = url.split("/").last().split("-").first() - val title = (document.selectFirst("div.b-post__origtitle")?.text()?.trim() - ?: document.selectFirst("div.b-post__title h1")?.text()?.trim()).toString() - val poster = fixUrlNull(document.selectFirst("div.b-sidecover img")?.attr("src")) - val tags = - document.select("table.b-post__info > tbody > tr:nth-child(5) span[itemprop=genre]") - .map { it.text() } - val year = document.select("div.film-info > div:nth-child(2) a").text().toIntOrNull() - val tvType = if (document.select("div#simple-episodes-tabs") - .isNullOrEmpty() - ) TvType.Movie else TvType.TvSeries - val description = document.selectFirst("div.b-post__description_text")?.text()?.trim() - val trailer = app.post( - "$mainUrl/engine/ajax/gettrailervideo.php", - data = mapOf("id" to id), - referer = url - ).parsedSafe()?.code.let { - Jsoup.parse(it.toString()).select("iframe").attr("src") - } - val rating = - document.selectFirst("table.b-post__info > tbody > tr:nth-child(1) span.bold")?.text() - .toRatingInt() - val actors = document.select("table.b-post__info > tbody > tr:last-child span.item").map { - Actor( - it.selectFirst("span[itemprop=name]")?.text().toString(), - it.selectFirst("span[itemprop=actor]")?.attr("data-photo") - ) - } - - val recommendations = document.select("div.b-sidelist div.b-content__inline_item").map { - it.toSearchResult() - } - - val data = HashMap() - val server = ArrayList>() - - data["id"] = id - data["favs"] = document.selectFirst("input#ctrl_favs")?.attr("value").toString() - data["ref"] = url - - return if (tvType == TvType.TvSeries) { - document.select("ul#translators-list li").map { res -> - server.add( - mapOf( - "translator_name" to res.text(), - "translator_id" to res.attr("data-translator_id"), - ) - ) - } - val episodes = document.select("div#simple-episodes-tabs ul li").map { - val season = it.attr("data-season_id").toIntOrNull() - val episode = it.attr("data-episode_id").toIntOrNull() - val name = "Episode $episode" - - data["season"] = "$season" - data["episode"] = "$episode" - data["server"] = server - data["action"] = "get_stream" - - Episode( - data.toJson(), - name, - season, - episode, - ) - } - - 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 { - document.select("ul#translators-list li").map { res -> - server.add( - mapOf( - "translator_name" to res.text(), - "translator_id" to res.attr("data-translator_id"), - "camrip" to res.attr("data-camrip"), - "ads" to res.attr("data-ads"), - "director" to res.attr("data-director") - ) - ) - } - - data["server"] = server - data["action"] = "get_movie" - - newMovieLoadResponse(title, url, TvType.Movie, data.toJson()) { - this.posterUrl = poster - this.year = year - this.plot = description - this.tags = tags - this.rating = rating - addActors(actors) - this.recommendations = recommendations - addTrailer(trailer) - } - } - } - - private fun decryptStreamUrl(data: String): String { - - fun getTrash(arr: List, item: Int): List { - val trash = ArrayList>() - for (i in 1..item) { - trash.add(arr) - } - return trash.reduce { acc, list -> - val temp = ArrayList() - acc.forEach { ac -> - list.forEach { li -> - temp.add(ac.plus(li)) - } - } - return@reduce temp - } - } - - val trashList = listOf("@", "#", "!", "^", "$") - val trashSet = getTrash(trashList, 2) + getTrash(trashList, 3) - var trashString = data.replace("#h", "").split("//_//").joinToString("") - - trashSet.forEach { - val temp = base64Encode(it.toByteArray()) - trashString = trashString.replace(temp, "") - } - - return base64Decode(trashString) - - } - - private fun cleanCallback( - source: String, - url: String, - quality: String, - isM3u8: Boolean, - sourceCallback: (ExtractorLink) -> Unit - ) { - sourceCallback.invoke( - ExtractorLink( - source, - source, - url, - "$mainUrl/", - getQuality(quality), - isM3u8, - headers = mapOf( - "Origin" to mainUrl - ) - ) - ) - } - - private fun getLanguage(str: String): String { - return when (str) { - "Русский" -> "Russian" - "Українська" -> "Ukrainian" - else -> str - } - } - - private fun getQuality(str: String): Int { - return when (str) { - "360p" -> Qualities.P240.value - "480p" -> Qualities.P360.value - "720p" -> Qualities.P480.value - "1080p" -> Qualities.P720.value - "1080p Ultra" -> Qualities.P1080.value - else -> getQualityFromName(str) - } - } - - private fun invokeSources( - source: String, - url: String, - subtitle: String, - subCallback: (SubtitleFile) -> Unit, - sourceCallback: (ExtractorLink) -> Unit - ) { - decryptStreamUrl(url).split(",").map { links -> - val quality = - Regex("\\[([0-9]*p.*?)]").find(links)?.groupValues?.getOrNull(1) - .toString().trim() - links.replace("[$quality]", "").split("or").map { it.trim() } - .map { link -> - - if (link.endsWith(".m3u8")) { - cleanCallback( - "$source (Main)", - link, - quality, - true, - sourceCallback, - ) - } else { - cleanCallback( - "$source (Backup)", - link, - quality, - false, - sourceCallback, - ) - } - } - } - - subtitle.split(",").map { sub -> - val language = - Regex("\\[(.*)]").find(sub)?.groupValues?.getOrNull(1) - .toString() - val link = sub.replace("[$language]", "").trim() - subCallback.invoke( - SubtitleFile( - getLanguage(language), - link - ) - ) - } - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - - tryParseJson(data)?.let { res -> - if (res.server?.isEmpty() == true) { - val document = app.get(res.ref ?: return@let).document - document.select("script").map { script -> - if (script.data().contains("sof.tv.initCDNMoviesEvents(")) { - val dataJson = - script.data().substringAfter("false, {").substringBefore("});") - tryParseJson("{$dataJson}")?.let { source -> - invokeSources( - this.name, - source.streams, - source.subtitle.toString(), - subtitleCallback, - callback - ) - } - } - } - } else { - res.server?.apmap { server -> - suspendSafeApiCall { - app.post( - url = "$mainUrl/ajax/get_cdn_series/?t=${Date().time}", - data = mapOf( - "id" to res.id, - "translator_id" to server.translator_id, - "favs" to res.favs, - "is_camrip" to server.camrip, - "is_ads" to server.ads, - "is_director" to server.director, - "season" to res.season, - "episode" to res.episode, - "action" to res.action, - ).filterValues { it != null }.mapValues { it.value as String }, - referer = res.ref - ).parsedSafe()?.let { source -> - invokeSources( - server.translator_name.toString(), - source.url, - source.subtitle.toString(), - subtitleCallback, - callback - ) - } - } - } - } - } - - return true - } - - data class LocalSources( - @JsonProperty("streams") val streams: String, - @JsonProperty("subtitle") val subtitle: Any?, - ) - - data class Sources( - @JsonProperty("url") val url: String, - @JsonProperty("subtitle") val subtitle: Any?, - ) - - data class Server( - @JsonProperty("translator_name") val translator_name: String?, - @JsonProperty("translator_id") val translator_id: String?, - @JsonProperty("camrip") val camrip: String?, - @JsonProperty("ads") val ads: String?, - @JsonProperty("director") val director: String?, - ) - - data class Data( - @JsonProperty("id") val id: String?, - @JsonProperty("favs") val favs: String?, - @JsonProperty("server") val server: List?, - @JsonProperty("season") val season: String?, - @JsonProperty("episode") val episode: String?, - @JsonProperty("action") val action: String?, - @JsonProperty("ref") val ref: String?, - ) - - data class Trailer( - @JsonProperty("success") val success: Boolean?, - @JsonProperty("code") val code: String?, - ) - -} \ No newline at end of file diff --git a/HDrezkaProvider/src/main/kotlin/com/lagradost/HDrezkaProviderPlugin.kt b/HDrezkaProvider/src/main/kotlin/com/lagradost/HDrezkaProviderPlugin.kt deleted file mode 100644 index 3a1d51a..0000000 --- a/HDrezkaProvider/src/main/kotlin/com/lagradost/HDrezkaProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class HDrezkaProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(HDrezkaProvider()) - } -} \ No newline at end of file diff --git a/IHaveNoTvProvider/build.gradle.kts b/IHaveNoTvProvider/build.gradle.kts index e161bca..319d81b 100644 --- a/IHaveNoTvProvider/build.gradle.kts +++ b/IHaveNoTvProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/IdlixProvider/build.gradle.kts b/IdlixProvider/build.gradle.kts deleted file mode 100644 index fced90d..0000000 --- a/IdlixProvider/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * 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=94.103.82.88&sz=24" -} \ No newline at end of file diff --git a/IdlixProvider/src/main/AndroidManifest.xml b/IdlixProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/IdlixProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/IdlixProvider/src/main/kotlin/com/lagradost/IdlixProvider.kt b/IdlixProvider/src/main/kotlin/com/lagradost/IdlixProvider.kt deleted file mode 100644 index 3ff2b0b..0000000 --- a/IdlixProvider/src/main/kotlin/com/lagradost/IdlixProvider.kt +++ /dev/null @@ -1,385 +0,0 @@ -package com.lagradost - -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 com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -import org.jsoup.nodes.Element -import java.net.URI - -class IdlixProvider : MainAPI() { - override var mainUrl = "https://94.103.82.88" - override var name = "Idlix" - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - override val supportedTypes = setOf( - TvType.Movie, - TvType.TvSeries, - ) - - override val mainPage = mainPageOf( - "$mainUrl/trending/page/?get=movies" to "Trending Movies", - "$mainUrl/trending/page/?get=tv" to "Trending TV Series", - "$mainUrl/movie/page/" to "Movie Terbaru", - "$mainUrl/tvseries/page/" to "TV Series Terbaru", - "$mainUrl/season/page/" to "Season Terbaru", - "$mainUrl/episode/page/" to "Episode Terbaru", - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val url = request.data.split("?") - val document = app.get("${url.first()}$page/?${url.lastOrNull()}").document - val home = document.select("div.items.full article, div#archive-content article").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun getProperLink(uri: String): String { - return when { - uri.contains("/episode/") -> { - var title = uri.substringAfter("$mainUrl/episode/") - title = Regex("(.+?)-season").find(title)?.groupValues?.get(1).toString() - "$mainUrl/tvseries/$title" - } - uri.contains("/season/") -> { - var title = uri.substringAfter("$mainUrl/season/") - title = Regex("(.+?)-season").find(title)?.groupValues?.get(1).toString() - "$mainUrl/tvseries/$title" - } - else -> { - uri - } - } - } - - private fun Element.toSearchResult(): SearchResponse { - val title = this.selectFirst("h3 > a")!!.text().replace(Regex("\\(\\d{4}\\)"), "").trim() - val href = getProperLink(this.selectFirst("h3 > a")!!.attr("href")) - val posterUrl = this.select("div.poster > img").attr("src").toString() - 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 link = "$mainUrl/search/$query" - val document = app.get(link).document - - return document.select("div.result-item").map { - val title = - it.selectFirst("div.title > a")!!.text().replace(Regex("\\(\\d{4}\\)"), "").trim() - val href = getProperLink(it.selectFirst("div.title > a")!!.attr("href")) - val posterUrl = it.selectFirst("img")!!.attr("src").toString() - newMovieSearchResponse(title, href, TvType.TvSeries) { - this.posterUrl = posterUrl - } - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = - document.selectFirst("div.data > h1")?.text()?.replace(Regex("\\(\\d{4}\\)"), "") - ?.trim().toString() - val poster = document.select("div.poster > img").attr("src").toString() - val tags = document.select("div.sgeneros > a").map { it.text() } - - val year = Regex(",\\s?(\\d+)").find( - document.select("span.date").text().trim() - )?.groupValues?.get(1).toString().toIntOrNull() - val tvType = if (document.select("ul#section > li:nth-child(1)").text().contains("Episodes") - ) TvType.TvSeries else TvType.Movie - val description = document.select("div.wp-content > p").text().trim() - val trailer = document.selectFirst("div.embed iframe")?.attr("src") - val rating = - document.selectFirst("span.dt_rating_vgs")?.text()?.toRatingInt() - val actors = document.select("div.persons > div[itemprop=actor]").map { - Actor(it.select("meta[itemprop=name]").attr("content"), it.select("img").attr("src")) - } - - val recommendations = document.select("div.owl-item").map { - val recName = - it.selectFirst("a")!!.attr("href").toString().removeSuffix("/").split("/").last() - val recHref = it.selectFirst("a")!!.attr("href") - val recPosterUrl = it.selectFirst("img")?.attr("src").toString() - newTvSeriesSearchResponse(recName, recHref, TvType.TvSeries) { - this.posterUrl = recPosterUrl - } - } - - return if (tvType == TvType.TvSeries) { - val episodes = document.select("ul.episodios > li").map { - val href = it.select("a").attr("href") - val name = fixTitle(it.select("div.episodiotitle > a").text().trim()) - val image = it.select("div.imagen > img").attr("src") - val episode = it.select("div.numerando").text().replace(" ", "").split("-").last() - .toIntOrNull() - val season = it.select("div.numerando").text().replace(" ", "").split("-").first() - .toIntOrNull() - Episode( - href, - name, - season, - episode, - image - ) - } - 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) - } - } - } - - private fun getLanguage(str: String): String { - return when { - str.lowercase().contains("indonesia") || str.lowercase() - .contains("bahasa") -> "Indonesian" - else -> str - } - } - - data class ResponseHash( - @JsonProperty("embed_url") val embed_url: String, - @JsonProperty("type") val type: String?, - ) - - data class ResponseSource( - @JsonProperty("hls") val hls: Boolean, - @JsonProperty("videoSource") val videoSource: String, - @JsonProperty("securedLink") val securedLink: String?, - ) - - data class Tracks( - @JsonProperty("kind") val kind: String?, - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String?, - ) - - private suspend fun invokeLokalSource( - url: String, - subCallback: (SubtitleFile) -> Unit, - sourceCallback: (ExtractorLink) -> Unit - ) { - val document = app.get(url, referer = "$mainUrl/").document - val hash = url.split("/").last().substringAfter("data=") - - val m3uLink = app.post( - url = "https://jeniusplay.com/player/index.php?data=$hash&do=getVideo", - data = mapOf("hash" to hash, "r" to "$mainUrl/"), - referer = url, - headers = mapOf("X-Requested-With" to "XMLHttpRequest") - ).parsed().videoSource - - M3u8Helper.generateM3u8( - this.name, - m3uLink, - url, - ).forEach(sourceCallback) - - - document.select("script").map { script -> - if (script.data().contains("eval(function(p,a,c,k,e,d)")) { - val subData = - getAndUnpack(script.data()).substringAfter("\"tracks\":[").substringBefore("],") - tryParseJson>("[$subData]")?.map { subtitle -> - subCallback.invoke( - SubtitleFile( - getLanguage(subtitle.label!!), - subtitle.file - ) - ) - } - } - } - } - - data class ResponseLaviolaSource( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String?, - ) - - private suspend fun invokeLaviolaSource( - url: String, - subCallback: (SubtitleFile) -> Unit, - sourceCallback: (ExtractorLink) -> Unit - ) { - val document = app.get(url, referer = "$mainUrl/").document - val baseName = "Laviola" - val baseUrl = "https://laviola.live/" - document.select("script").map { script -> - if (script.data().contains("var config = {")) { - val data = script.data().substringAfter("sources: [").substringBefore("],") - tryParseJson>("[$data]")?.map { m3u -> - val m3uData = app.get(m3u.file, referer = baseUrl).text - val quality = - Regex("\\d{3,4}\\.m3u8").findAll(m3uData).map { it.value }.toList() - quality.forEach { - sourceCallback.invoke( - ExtractorLink( - source = baseName, - name = baseName, - url = m3u.file.replace("video.m3u8", it), - referer = baseUrl, - quality = getQualityFromName("${it.replace(".m3u8", "")}p"), - isM3u8 = true - ) - ) - } - } - - val subData = script.data().substringAfter("tracks: [").substringBefore("],") - tryParseJson>("[$subData]")?.map { subtitle -> - subCallback.invoke( - SubtitleFile( - getLanguage(subtitle.label!!), - (if (subtitle.kind!!.contains("captions")) subtitle.file else null)!! - ) - ) - } - } - } - } - - private data class Captions( - @JsonProperty("id") val id: String, - @JsonProperty("hash") val hash: String, - @JsonProperty("language") val language: String, - ) - - private data class Data( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String, - ) - - private data class Player( - @JsonProperty("poster_file") val poster_file: String, - ) - - private data class ResponseCdn( - @JsonProperty("success") val success: Boolean, - @JsonProperty("player") val player: Player, - @JsonProperty("data") val data: List?, - @JsonProperty("captions") val captions: List? - ) - - private suspend fun invokeCdnSource( - url: String, - subCallback: (SubtitleFile) -> Unit, - sourceCallback: (ExtractorLink) -> Unit - ) { - val domainUrl = "https://cdnplayer.online" - val id = url.trimEnd('/').split("/").last() - val sources = app.post( - url = "$domainUrl/api/source/$id", - data = mapOf("r" to mainUrl, "d" to URI(url).host) - ).parsed() - - sources.data?.map { - sourceCallback.invoke( - ExtractorLink( - name, - "Cdnplayer", - fixUrl(it.file), - referer = url, - quality = getQualityFromName(it.label) - ) - ) - } - val userData = sources.player.poster_file.split("/")[2] - sources.captions?.map { subtitle -> - subCallback.invoke( - SubtitleFile( - getLanguage(subtitle.language), - "$domainUrl/asset/userdata/$userData/caption/${subtitle.hash}/${subtitle.id}.srt" - ) - ) - } - - } - - 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("meta#dooplay-ajax-counter").attr("data-postid") - val type = if (data.contains("/movie/")) "movie" else "tv" - - document.select("ul#playeroptionsul > li").map { - it.attr("data-nume") - }.apmap { nume -> - safeApiCall { - var source = app.post( - url = "$mainUrl/wp-admin/admin-ajax.php", - data = mapOf( - "action" to "doo_player_ajax", - "post" to id, - "nume" to nume, - "type" to type - ) - ).parsed().embed_url - - when { - source.startsWith("https://jeniusplay.com") -> invokeLokalSource( - source, - subtitleCallback, - callback - ) - source.startsWith("https://laviola.live") -> invokeLaviolaSource( - source, - subtitleCallback, - callback - ) - source.startsWith("https://cdnplayer.online") -> invokeCdnSource( - source, - subtitleCallback, - callback - ) - else -> { - if (source.startsWith("https://uservideo.xyz")) { - source = app.get(source).document.select("iframe").attr("src") - } - loadExtractor(source, data, subtitleCallback, callback) - } - } - } - } - - return true - } - - -} \ No newline at end of file diff --git a/IdlixProvider/src/main/kotlin/com/lagradost/IdlixProviderPlugin.kt b/IdlixProvider/src/main/kotlin/com/lagradost/IdlixProviderPlugin.kt deleted file mode 100644 index 302a547..0000000 --- a/IdlixProvider/src/main/kotlin/com/lagradost/IdlixProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class IdlixProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(IdlixProvider()) - } -} \ No newline at end of file diff --git a/KawaiifuProvider/build.gradle.kts b/KawaiifuProvider/build.gradle.kts index d2e3e37..b862411 100644 --- a/KawaiifuProvider/build.gradle.kts +++ b/KawaiifuProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/KimCartoonProvider/build.gradle.kts b/KimCartoonProvider/build.gradle.kts index 4e8de17..c505ea5 100644 --- a/KimCartoonProvider/build.gradle.kts +++ b/KimCartoonProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/KisskhProvider/build.gradle.kts b/KisskhProvider/build.gradle.kts index 3456beb..a7a8a71 100644 --- a/KisskhProvider/build.gradle.kts +++ b/KisskhProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/KuramanimeProvider/build.gradle.kts b/KuramanimeProvider/build.gradle.kts deleted file mode 100644 index 3f6c69d..0000000 --- a/KuramanimeProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "Anime", - "OVA", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=kuramanime.com&sz=24" -} \ No newline at end of file diff --git a/KuramanimeProvider/src/main/AndroidManifest.xml b/KuramanimeProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/KuramanimeProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/KuramanimeProvider/src/main/kotlin/com/lagradost/KuramanimeProvider.kt b/KuramanimeProvider/src/main/kotlin/com/lagradost/KuramanimeProvider.kt deleted file mode 100644 index 48da3b3..0000000 --- a/KuramanimeProvider/src/main/kotlin/com/lagradost/KuramanimeProvider.kt +++ /dev/null @@ -1,176 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall -import com.lagradost.cloudstream3.utils.ExtractorLink -import org.jsoup.Jsoup -import org.jsoup.nodes.Element - -class KuramanimeProvider : MainAPI() { - override var mainUrl = "https://kuramanime.com" - override var name = "Kuramanime" - override val hasQuickSearch = false - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return if (t.contains("OVA") || t.contains("Special")) TvType.OVA - else if (t.contains("Movie")) TvType.AnimeMovie - else TvType.Anime - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Selesai Tayang" -> ShowStatus.Completed - "Sedang Tayang" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - override val mainPage = mainPageOf( - "$mainUrl/anime/ongoing?order_by=updated&page=" to "Sedang Tayang", - "$mainUrl/anime/finished?order_by=updated&page=" to "Selesai Tayang", - "$mainUrl/properties/season/summer-2022?order_by=most_viewed&page=" to "Dilihat Terbanyak Musim Ini", - "$mainUrl/anime/movie?order_by=updated&page=" to "Film Layar Lebar", - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val document = app.get(request.data + page).document - - val home = document.select("div.col-lg-4.col-md-6.col-sm-6").mapNotNull { - it.toSearchResult() - } - - return newHomePageResponse(request.name, home) - } - - private fun getProperAnimeLink(uri: String): String { - return if (uri.contains("/episode")) { - Regex("(.*)/episode/.+").find(uri)?.groupValues?.get(1).toString() + "/" - } else { - uri - } - } - - private fun Element.toSearchResult(): AnimeSearchResponse? { - val href = getProperAnimeLink(fixUrl(this.selectFirst("a")!!.attr("href"))) - val title = this.selectFirst("h5 a")?.text() ?: return null - val posterUrl = fixUrl(this.select("div.product__item__pic.set-bg").attr("data-setbg")) - val episode = Regex("([0-9*])\\s?/").find( - this.select("div.ep span").text() - )?.groupValues?.getOrNull(1)?.toIntOrNull() - - return newAnimeSearchResponse(title, href, TvType.Anime) { - this.posterUrl = posterUrl - addSub(episode) - } - - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/anime?search=$query&order_by=oldest" - val document = app.get(link).document - - return document.select(".product__item").mapNotNull { - val title = it.selectFirst("div.product__item__text > h5")!!.text().trim() - val poster = it.selectFirst("a > div")!!.attr("data-setbg") - val tvType = - getType(it.selectFirst(".product__item__text > ul > li")!!.text().toString()) - val href = fixUrl(it.selectFirst("a")!!.attr("href")) - - newAnimeSearchResponse(title, href, tvType) { - this.posterUrl = poster - addDubStatus(dubExist = false, subExist = true) - } - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst(".anime__details__title > h3")!!.text().trim() - val poster = document.selectFirst(".anime__details__pic")?.attr("data-setbg") - val tags = - document.select("div.anime__details__widget > div > div:nth-child(2) > ul > li:nth-child(1)") - .text().trim().replace("Genre: ", "").split(", ") - - val year = Regex("[^0-9]").replace( - document.select("div.anime__details__widget > div > div:nth-child(1) > ul > li:nth-child(5)") - .text().trim().replace("Musim: ", ""), "" - ).toIntOrNull() - val status = getStatus( - document.select("div.anime__details__widget > div > div:nth-child(1) > ul > li:nth-child(3)") - .text().trim().replace("Status: ", "") - ) - val description = document.select(".anime__details__text > p").text().trim() - - val episodes = - Jsoup.parse(document.select("#episodeLists").attr("data-content")).select("a").map { - val name = it.text().trim() - val link = it.attr("href") - Episode(link, name) - } - - val recommendations = document.select("div#randomList > a").mapNotNull { - val epHref = it.attr("href") - val epTitle = it.select("h5.sidebar-title-h5.px-2.py-2").text() - val epPoster = it.select(".product__sidebar__view__item.set-bg").attr("data-setbg") - - newAnimeSearchResponse(epTitle, epHref, TvType.Anime) { - this.posterUrl = epPoster - addDubStatus(dubExist = false, subExist = true) - } - } - - return newAnimeLoadResponse(title, url, TvType.Anime) { - engName = title - posterUrl = poster - this.year = year - addEpisodes(DubStatus.Subbed, episodes) - showStatus = status - plot = description - this.tags = tags - this.recommendations = recommendations - } - - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - val servers = app.get(data).document - servers.select("video#player > source").map { - suspendSafeApiCall { - val url = it.attr("src") - val quality = it.attr("size").toInt() - callback.invoke( - ExtractorLink( - name, - name, - url, - referer = "$mainUrl/", - quality = quality - ) - ) - } - } - - return true - } - -} \ No newline at end of file diff --git a/KuramanimeProvider/src/main/kotlin/com/lagradost/KuramanimeProviderPlugin.kt b/KuramanimeProvider/src/main/kotlin/com/lagradost/KuramanimeProviderPlugin.kt deleted file mode 100644 index 9776cf6..0000000 --- a/KuramanimeProvider/src/main/kotlin/com/lagradost/KuramanimeProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class KuramanimeProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(KuramanimeProvider()) - } -} \ No newline at end of file diff --git a/KuronimeProvider/build.gradle.kts b/KuronimeProvider/build.gradle.kts deleted file mode 100644 index b4d8da6..0000000 --- a/KuronimeProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "Anime", - "OVA", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=45.12.2.2&sz=24" -} \ No newline at end of file diff --git a/KuronimeProvider/src/main/AndroidManifest.xml b/KuronimeProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/KuronimeProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/KuronimeProvider/src/main/kotlin/com/lagradost/KuronimeProvider.kt b/KuronimeProvider/src/main/kotlin/com/lagradost/KuronimeProvider.kt deleted file mode 100644 index 5f68ec6..0000000 --- a/KuronimeProvider/src/main/kotlin/com/lagradost/KuronimeProvider.kt +++ /dev/null @@ -1,197 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer -import com.lagradost.cloudstream3.mvvm.safeApiCall -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.getQualityFromName -import com.lagradost.cloudstream3.utils.loadExtractor -import org.jsoup.Jsoup -import org.jsoup.nodes.Element - -class KuronimeProvider : MainAPI() { - override var mainUrl = "https://45.12.2.2" - override var name = "Kuronime" - override val hasQuickSearch = false - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return if (t.contains("OVA") || t.contains("Special")) TvType.OVA - else if (t.contains("Movie")) TvType.AnimeMovie - else TvType.Anime - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Completed" -> ShowStatus.Completed - "Ongoing" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - override val mainPage = mainPageOf( - "$mainUrl/page/" to "New Episodes", - "$mainUrl/popular-anime/page/" to "Popular Anime", - "$mainUrl/movies/page/" to "Movies", - "$mainUrl/genres/donghua/page/" to "Donghua", - "$mainUrl/live-action/page/" to "Live Action", - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val document = app.get(request.data + page).document - val home = document.select("article").map { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun getProperAnimeLink(uri: String): String { - return if (uri.contains("/anime/")) { - uri - } else { - var title = uri.substringAfter("$mainUrl/") - title = when { - (title.contains("-episode")) && !(title.contains("-movie")) -> Regex("nonton-(.+)-episode").find( - title - )?.groupValues?.get(1).toString() - (title.contains("-movie")) -> Regex("nonton-(.+)-movie").find(title)?.groupValues?.get( - 1 - ).toString() - else -> title - } - - "$mainUrl/anime/$title" - } - } - - private fun Element.toSearchResult(): AnimeSearchResponse { - val href = getProperAnimeLink(fixUrlNull(this.selectFirst("a")?.attr("href")).toString()) - val title = this.select(".bsuxtt, .tt > h4").text().trim() - val posterUrl = fixUrlNull( - this.selectFirst("div.view,div.bt")?.nextElementSibling()?.select("img") - ?.attr("data-src") - ) - val epNum = this.select(".ep").text().replace(Regex("[^0-9]"), "").trim().toIntOrNull() - val tvType = getType(this.selectFirst(".bt > span")?.text().toString()) - return newAnimeSearchResponse(title, href, tvType) { - this.posterUrl = posterUrl - addSub(epNum) - } - - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = app.get(link).document - - return document.select("article.bs").map { - it.toSearchResult() - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst(".entry-title")?.text().toString().trim() - val poster = document.selectFirst("div.l[itemprop=image] > img")?.attr("data-src") - val tags = document.select(".infodetail > ul > li:nth-child(2) > a").map { it.text() } - val type = getType( - document.selectFirst(".infodetail > ul > li:nth-child(7)")?.ownText()?.trim().toString() - ) - val trailer = document.selectFirst("div.tply iframe")?.attr("data-lazy-src") - val year = Regex("\\d, ([0-9]*)").find( - document.select(".infodetail > ul > li:nth-child(5)").text() - )?.groupValues?.get(1)?.toIntOrNull() - val status = getStatus( - document.selectFirst(".infodetail > ul > li:nth-child(3)")!!.ownText() - .replace(Regex("\\W"), "") - ) - val description = document.select("span.const > p").text() - - val episodes = document.select("div.bixbox.bxcl > ul > li").map { - val name = it.selectFirst("a")?.text()?.trim() - val episode = - it.selectFirst("a")?.text()?.trim()?.replace("Episode", "")?.trim()?.toIntOrNull() - val link = it.selectFirst("a")!!.attr("href") - Episode(link, name = name, episode = episode) - }.reversed() - - return newAnimeLoadResponse(title, url, type) { - engName = title - posterUrl = poster - this.year = year - addEpisodes(DubStatus.Subbed, episodes) - showStatus = status - plot = description - addTrailer(trailer) - this.tags = tags - } - } - - private suspend fun invokeKuroSource( - url: String, - sourceCallback: (ExtractorLink) -> Unit - ) { - val doc = app.get(url, referer = "${mainUrl}/").document - - doc.select("script").map { script -> - if (script.data().contains("function jalankan_jwp() {")) { - val data = script.data() - val doma = data.substringAfter("var doma = \"").substringBefore("\";") - val token = data.substringAfter("var token = \"").substringBefore("\";") - val pat = data.substringAfter("var pat = \"").substringBefore("\";") - val link = "$doma$token$pat/index.m3u8" - val quality = - Regex("\\d{3,4}p").find(doc.select("title").text())?.groupValues?.get(0) - - sourceCallback.invoke( - ExtractorLink( - this.name, - this.name, - link, - referer = "https://animeku.org/", - quality = getQualityFromName(quality), - headers = mapOf("Origin" to "https://animeku.org"), - isM3u8 = true - ) - ) - } - } - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - val document = app.get(data).document - val sources = document.select(".mobius > .mirror > option").mapNotNull { - fixUrl(Jsoup.parse(base64Decode(it.attr("value"))).select("iframe").attr("data-src")) - } - - sources.apmap { - safeApiCall { - when { - it.startsWith("https://animeku.org") -> invokeKuroSource(it, callback) - else -> loadExtractor(it, mainUrl, subtitleCallback, callback) - } - } - } - return true - } - -} \ No newline at end of file diff --git a/KuronimeProvider/src/main/kotlin/com/lagradost/KuronimeProviderPlugin.kt b/KuronimeProvider/src/main/kotlin/com/lagradost/KuronimeProviderPlugin.kt deleted file mode 100644 index 91aad99..0000000 --- a/KuronimeProvider/src/main/kotlin/com/lagradost/KuronimeProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class KuronimeProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(KuronimeProvider()) - } -} \ No newline at end of file diff --git a/LayarKacaProvider/build.gradle.kts b/LayarKacaProvider/build.gradle.kts deleted file mode 100644 index b436907..0000000 --- a/LayarKacaProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AsianDrama", - "TvSeries", - "Movie", - ) - - - } \ No newline at end of file diff --git a/LayarKacaProvider/src/main/AndroidManifest.xml b/LayarKacaProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/LayarKacaProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/LayarKacaProvider/src/main/kotlin/com/lagradost/LayarKacaProvider.kt b/LayarKacaProvider/src/main/kotlin/com/lagradost/LayarKacaProvider.kt deleted file mode 100644 index cd31c85..0000000 --- a/LayarKacaProvider/src/main/kotlin/com/lagradost/LayarKacaProvider.kt +++ /dev/null @@ -1,176 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addActors -import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.loadExtractor -import org.jsoup.Jsoup -import org.jsoup.nodes.Element - -class LayarKacaProvider : MainAPI() { - override var mainUrl = "https://lk21.xn--6frz82g" - override var name = "LayarKaca" - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - override val supportedTypes = setOf( - TvType.Movie, - TvType.TvSeries, - TvType.AsianDrama - ) - - override val mainPage = mainPageOf( - "$mainUrl/populer/page/" to "Film Terplopuler", - "$mainUrl/latest-series/page/" to "Series Terbaru", - "$mainUrl/series/asian/page/" to "Film Asian Terbaru", - "$mainUrl/latest/page/" to "Film Upload Terbaru", - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val document = app.get(request.data + page).document - val home = document.select("article.mega-item").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun Element.toSearchResult(): SearchResponse? { - val title = this.selectFirst("h1.grid-title > a")?.ownText()?.trim() ?: return null - val href = fixUrl(this.selectFirst("h1.grid-title > a")!!.attr("href")) - val posterUrl = fixUrlNull(this.selectFirst(".grid-poster > a > img")?.attr("src")) - val quality = this.select("div.quality").text().trim() - return newMovieSearchResponse(title, href, TvType.Movie) { - this.posterUrl = posterUrl - addQuality(quality) - } - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = app.get(link).document - - return document.select("div.search-item").map { - val title = it.selectFirst("h2 > a")!!.text().trim() - val href = it.selectFirst("h2 > a")!!.attr("href") - val posterUrl = fixUrl(it.selectFirst("img.img-thumbnail")?.attr("src").toString()) - newTvSeriesSearchResponse(title, href, TvType.TvSeries) { - this.posterUrl = posterUrl - } - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst("li.last > span[itemprop=name]")?.text()?.trim().toString() - val poster = fixUrl(document.select("img.img-thumbnail").attr("src").toString()) - val tags = document.select("div.content > div:nth-child(5) > h3 > a").map { it.text() } - - val year = Regex("\\d, (\\d+)").find( - document.select("div.content > div:nth-child(7) > h3").text().trim() - )?.groupValues?.get(1).toString().toIntOrNull() - val tvType = if (document.select("div.serial-wrapper") - .isNotEmpty() - ) TvType.TvSeries else TvType.Movie - val description = document.select("div.content > blockquote").text().trim() - val trailer = document.selectFirst("div.action-player li > a.fancybox")?.attr("href") - val rating = - document.selectFirst("div.content > div:nth-child(6) > h3")?.text()?.toRatingInt() - val actors = - document.select("div.col-xs-9.content > div:nth-child(3) > h3 > a").map { it.text() } - - val recommendations = document.select("div.row.item-media").map { - val recName = it.selectFirst("h3")?.text()?.trim().toString() - val recHref = it.selectFirst(".content-media > a")!!.attr("href") - val recPosterUrl = - fixUrl(it.selectFirst(".poster-media > a > img")?.attr("src").toString()) - newTvSeriesSearchResponse(recName, recHref, TvType.TvSeries) { - this.posterUrl = recPosterUrl - } - } - - return if (tvType == TvType.TvSeries) { - val episodes = document.select("div.episode-list > a:matches(\\d+)").map { - val href = fixUrl(it.attr("href")) - val episode = it.text().toIntOrNull() - val season = - it.attr("href").substringAfter("season-").substringBefore("-").toIntOrNull() - Episode( - href, - "Episode $episode", - season, - episode, - ) - }.reversed() - 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 - -// maybe will need this in future -// val sources = if (data.contains("-episode-")) { -// document.select("script").mapNotNull { script -> -// if (script.data().contains("var data =")) { -// val scriptData = -// script.toString().substringAfter("var data = '").substringBefore("';") -// Jsoup.parse(scriptData).select("li").map { -// fixUrl(it.select("a").attr("href")) -// } -// } else { -// null -// } -// }[0] -// } else { -// document.select("ul#loadProviders > li").map { -// fixUrl(it.select("a").attr("href")) -// } -// } - - document.select("ul#loadProviders > li").map { - fixUrl(it.select("a").attr("href")) - }.apmap { - val link = if (it.startsWith("https://layarkacaxxi.icu")) { - it.substringBeforeLast("/") - } else { - it - } - loadExtractor(link, data, subtitleCallback, callback) - } - - return true - } - - -} \ No newline at end of file diff --git a/LayarKacaProvider/src/main/kotlin/com/lagradost/LayarKacaProviderPlugin.kt b/LayarKacaProvider/src/main/kotlin/com/lagradost/LayarKacaProviderPlugin.kt deleted file mode 100644 index 841423a..0000000 --- a/LayarKacaProvider/src/main/kotlin/com/lagradost/LayarKacaProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class LayarKacaProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(LayarKacaProvider()) - } -} \ No newline at end of file diff --git a/MeloMovieProvider/build.gradle.kts b/MeloMovieProvider/build.gradle.kts index 9d4c472..a12a9c8 100644 --- a/MeloMovieProvider/build.gradle.kts +++ b/MeloMovieProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/MultiplexProvider/build.gradle.kts b/MultiplexProvider/build.gradle.kts deleted file mode 100644 index 5440d1f..0000000 --- a/MultiplexProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AsianDrama", - "TvSeries", - "Movie", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=146.19.24.137&sz=24" -} \ No newline at end of file diff --git a/MultiplexProvider/src/main/AndroidManifest.xml b/MultiplexProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/MultiplexProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/MultiplexProvider/src/main/kotlin/com/lagradost/MultiplexProvider.kt b/MultiplexProvider/src/main/kotlin/com/lagradost/MultiplexProvider.kt deleted file mode 100644 index d6d0e79..0000000 --- a/MultiplexProvider/src/main/kotlin/com/lagradost/MultiplexProvider.kt +++ /dev/null @@ -1,188 +0,0 @@ -package com.lagradost - -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.AppUtils.tryParseJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.getQualityFromName -import org.jsoup.nodes.Element - -class MultiplexProvider : MainAPI() { - override var mainUrl = "https://146.19.24.137" - override var name = "Multiplex" - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - override val supportedTypes = setOf( - TvType.Movie, - TvType.TvSeries, - TvType.AsianDrama - ) - - override val mainPage = mainPageOf( - "$mainUrl/genre/top-popular-movies/page/" to "Top Popolar Movies", - "$mainUrl/genre/series-ongoing/page/" to "Series Ongoing", - "$mainUrl/genre/series-barat/page/" to "Series Barat", - "$mainUrl/genre/series-korea/page/" to "Series Korea", - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val document = app.get(request.data + page).document - val home = document.select("article.item").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun Element.toSearchResult(): SearchResponse? { - val title = this.selectFirst("h2.entry-title > a")?.text()?.trim() ?: return null - val href = fixUrl(this.selectFirst("a")!!.attr("href")) - val posterUrl = fixUrlNull(this.selectFirst("a > img")?.attr("data-src")) - val quality = this.select("div.gmr-quality-item > a").text().trim() - return if (quality.isEmpty()) { - val episode = this.select("div.gmr-numbeps > span").text().toIntOrNull() - newAnimeSearchResponse(title, href, TvType.TvSeries) { - this.posterUrl = posterUrl - addSub(episode) - } - } else { - newMovieSearchResponse(title, href, TvType.Movie) { - this.posterUrl = posterUrl - addQuality(quality) - } - } - } - - private fun Element.toBottomSearchResult(): SearchResponse? { - val title = this.selectFirst("a > span.idmuvi-rp-title")?.text()?.trim() ?: return null - val href = this.selectFirst("a")!!.attr("href") - val posterUrl = fixUrl(this.selectFirst("a > img")?.attr("data-src").toString()) - return newMovieSearchResponse(title, href, TvType.Movie) { - this.posterUrl = posterUrl - } - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query&post_type[]=post&post_type[]=tv" - val document = app.get(link).document - return document.select("article.item").mapNotNull { - it.toSearchResult() - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = - document.selectFirst("h1.entry-title")?.text()?.substringBefore("Season")?.trim() - .toString() - val poster = - fixUrl(document.selectFirst("figure.pull-left > img")?.attr("data-src").toString()) - val tags = document.select("span.gmr-movie-genre:contains(Genre:) > a").map { it.text() } - - val year = - document.select("span.gmr-movie-genre:contains(Year:) > a").text().trim().toIntOrNull() - val tvType = if (url.contains("/tv/")) TvType.TvSeries else TvType.Movie - val description = document.selectFirst("div[itemprop=description] > p")?.text()?.trim() - val trailer = document.selectFirst("ul.gmr-player-nav li a.gmr-trailer-popup")?.attr("href") - val rating = - document.selectFirst("div.gmr-meta-rating > span[itemprop=ratingValue]")?.text() - ?.toRatingInt() - val actors = document.select("div.gmr-moviedata").last()?.select("span[itemprop=actors]") - ?.map { it.select("a").text() } - - val recommendations = document.select("div.idmuvi-rp ul li").mapNotNull { - it.toBottomSearchResult() - } - - return if (tvType == TvType.TvSeries) { - val episodes = document.select("div.gmr-listseries > a").map { - val href = fixUrl(it.attr("href")) - val episode = it.text().split(" ").last().toIntOrNull() - val season = it.text().split(" ").first().substringAfter("S").toIntOrNull() - Episode( - href, - "Episode $episode", - season, - episode, - ) - } - 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) - } - } - } - - private data class ResponseSource( - @JsonProperty("file") val file: String, - @JsonProperty("type") val type: String?, - @JsonProperty("label") val label: String? - ) - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - - val document = app.get(data).document - - val id = document.selectFirst("div#muvipro_player_content_id")!!.attr("data-id") - val server = app.post( - "$mainUrl/wp-admin/admin-ajax.php", - data = mapOf("action" to "muvipro_player_content", "tab" to "player1", "post_id" to id) - ).document.select("iframe").attr("src") - - app.get(server, referer = "$mainUrl/").document.select("script").map { script -> - if (script.data().contains("var config = {")) { - val source = script.data().substringAfter("sources: [").substringBefore("],") - tryParseJson>("[$source]")?.map { m3u -> - val m3uData = app.get(m3u.file, referer = "https://gdriveplayer.link/").text - val quality = - Regex("\\d{3,4}\\.m3u8").findAll(m3uData).map { it.value }.toList() - quality.forEach { - callback.invoke( - ExtractorLink( - source = name, - name = name, - url = m3u.file.replace("video.m3u8", it), - referer = "https://gdriveplayer.link/", - quality = getQualityFromName("${it.replace(".m3u8", "")}p"), - isM3u8 = true - ) - ) - } - } - } - } - - return true - - } - - -} \ No newline at end of file diff --git a/MultiplexProvider/src/main/kotlin/com/lagradost/MultiplexProviderPlugin.kt b/MultiplexProvider/src/main/kotlin/com/lagradost/MultiplexProviderPlugin.kt deleted file mode 100644 index 6b1f60a..0000000 --- a/MultiplexProvider/src/main/kotlin/com/lagradost/MultiplexProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class MultiplexProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(MultiplexProvider()) - } -} \ No newline at end of file diff --git a/NeonimeProvider/build.gradle.kts b/NeonimeProvider/build.gradle.kts deleted file mode 100644 index d2e9c59..0000000 --- a/NeonimeProvider/build.gradle.kts +++ /dev/null @@ -1,27 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "Anime", - "Movie", - "OVA", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=neonime.watch&sz=24" -} \ No newline at end of file diff --git a/NeonimeProvider/src/main/AndroidManifest.xml b/NeonimeProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/NeonimeProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/NeonimeProvider/src/main/kotlin/com/lagradost/NeonimeProvider.kt b/NeonimeProvider/src/main/kotlin/com/lagradost/NeonimeProvider.kt deleted file mode 100644 index b8c5683..0000000 --- a/NeonimeProvider/src/main/kotlin/com/lagradost/NeonimeProvider.kt +++ /dev/null @@ -1,178 +0,0 @@ -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 -import java.util.* - -class NeonimeProvider : MainAPI() { - override var mainUrl = "https://neonime.watch" - override var name = "Neonime" - override val hasQuickSearch = false - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return if (t.contains("OVA") || t.contains("Special")) TvType.OVA - else if (t.contains("Movie")) TvType.AnimeMovie - else TvType.Anime - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Ended" -> ShowStatus.Completed - "OnGoing" -> ShowStatus.Ongoing - "Ongoing" -> ShowStatus.Ongoing - "In Production" -> ShowStatus.Ongoing - "Returning Series" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - override val mainPage = mainPageOf( - "$mainUrl/episode/page/" to "Episode Terbaru", - "$mainUrl/tvshows/page/" to "Anime Terbaru", - "$mainUrl/movies/page/" to "Movie", - ) - - override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { - val document = app.get(request.data + page).document - val home = document.select("tbody tr,div.item").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun getProperAnimeLink(uri: String): String { - return when { - uri.contains("/episode") -> { - val title = uri.substringAfter("$mainUrl/episode/").let { tt -> - val fixTitle = Regex("(.*)-\\d{1,2}x\\d+").find(tt)?.groupValues?.getOrNull(1).toString() - when { - !tt.contains("-season") && !tt.contains(Regex("-1x\\d+")) && !tt.contains("one-piece") -> "$fixTitle-season-${Regex("-(\\d{1,2})x\\d+").find(tt)?.groupValues?.getOrNull(1).toString()}" - tt.contains("-special") -> fixTitle.replace(Regex("-x\\d+"), "") - !fixTitle.contains("-subtitle-indonesia") -> "$fixTitle-subtitle-indonesia" - else -> fixTitle - } - } - -// title = when { -// title.contains("youkoso-jitsuryoku") && !title.contains("-season") -> title.replace("-e-", "-e-tv-") -// else -> title -// } - - "$mainUrl/tvshows/$title" - } - else -> uri - } - } - - private fun Element.toSearchResult(): AnimeSearchResponse? { - val title = this.selectFirst("td.bb a")?.ownText() ?: this.selectFirst("h2")?.text() ?: return null - val href = getProperAnimeLink(fixUrl(this.select("a").attr("href"))) - val posterUrl = fixUrl(this.select("img").attr("data-src")) - val epNum = this.selectFirst("td.bb span")?.text()?.let { eps -> - Regex("Episode\\s?([0-9]+)").find(eps)?.groupValues?.getOrNull(1)?.toIntOrNull() - } - - return newAnimeSearchResponse(title, href, TvType.Anime) { - this.posterUrl = posterUrl - addSub(epNum) - } - - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = app.get(link).document - - return document.select("div.item.episode-home").mapNotNull { - val title = it.selectFirst("div.judul-anime > span")!!.text() - val poster = it.select("img").attr("data-src").toString().trim() - val episodes = it.selectFirst("div.fixyear > h2.text-center")!! - .text().replace(Regex("[^0-9]"), "").trim().toIntOrNull() - val tvType = getType(it.selectFirst("span.calidad2.episode")?.text().toString()) - val href = getProperAnimeLink(fixUrl(it.selectFirst("a")!!.attr("href"))) - - newAnimeSearchResponse(title, href, tvType) { - this.posterUrl = poster - addSub(episodes) - } - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - if (url.contains("movie") || url.contains("live-action")) { - val mTitle = document.selectFirst(".sbox > .data > h1[itemprop = name]")?.text().toString().trim() - val mTrailer = document.selectFirst("div.youtube_id iframe")?.attr("data-wpfc-original-src")?.substringAfterLast("html#")?.let{ "https://www.youtube.com/embed/$it"} - - return newMovieLoadResponse(name = mTitle, url = url, type = TvType.Movie, dataUrl = url) { - posterUrl = document.selectFirst(".sbox > .imagen > .fix > img[itemprop = image]")?.attr("data-src") - year = document.selectFirst("a[href*=release-year]")!!.text().toIntOrNull() - plot = document.select("div[itemprop = description]").text().trim() - rating = document.select("span[itemprop = ratingValue]").text().toIntOrNull() - tags = document.select("p.meta_dd > a").map { it.text() } - addTrailer(mTrailer) - } - } - else { - val title = document.select("h1[itemprop = name]").text().trim() - val trailer = document.selectFirst("div.youtube_id_tv iframe")?.attr("data-wpfc-original-src")?.substringAfterLast("html#")?.let{ "https://www.youtube.com/embed/$it"} - - val episodes = document.select("ul.episodios > li").mapNotNull { - val header = it.selectFirst(".episodiotitle > a")?.ownText().toString() - val name = Regex("(Episode\\s?[0-9]+)").find(header)?.groupValues?.getOrNull(0) ?: header - val link = fixUrl(it.selectFirst(".episodiotitle > a")!!.attr("href")) - Episode(link, name) - }.reversed() - - return newAnimeLoadResponse(title, url, TvType.Anime) { - engName = title - posterUrl = document.selectFirst(".imagen > img")?.attr("data-src") - year = document.select("#info a[href*=\"-year/\"]").text().toIntOrNull() - addEpisodes(DubStatus.Subbed, episodes) - showStatus = getStatus(document.select("div.metadatac > span").last()!!.text().trim()) - plot = document.select("div[itemprop = description] > p").text().trim() - tags = document.select("#info a[href*=\"-genre/\"]").map { it.text() } - addTrailer(trailer) - } - } - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - val source = if(data.contains("movie") || data.contains("live-action")) { - app.get(data).document.select("#player2-1 > div[id*=div]").mapNotNull { - fixUrl(it.select("iframe").attr("data-src")) - } - } else { - app.get(data).document.select(".player2 > .embed2 > div[id*=player]").mapNotNull { - fixUrl(it.select("iframe").attr("data-src")) - } - } - - source.apmap { - loadExtractor(it, data, subtitleCallback, callback) - } - - return true - } - -} \ No newline at end of file diff --git a/NeonimeProvider/src/main/kotlin/com/lagradost/NeonimeProviderPlugin.kt b/NeonimeProvider/src/main/kotlin/com/lagradost/NeonimeProviderPlugin.kt deleted file mode 100644 index e99ad13..0000000 --- a/NeonimeProvider/src/main/kotlin/com/lagradost/NeonimeProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class NeonimeProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(NeonimeProvider()) - } -} \ No newline at end of file diff --git a/NginxProvider/build.gradle.kts b/NginxProvider/build.gradle.kts index 6b459e0..631b0d8 100644 --- a/NginxProvider/build.gradle.kts +++ b/NginxProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/NineAnimeProvider/build.gradle.kts b/NineAnimeProvider/build.gradle.kts index f97127a..d1e7ba4 100644 --- a/NineAnimeProvider/build.gradle.kts +++ b/NineAnimeProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/NontonAnimeIDProvider/build.gradle.kts b/NontonAnimeIDProvider/build.gradle.kts deleted file mode 100644 index 7289991..0000000 --- a/NontonAnimeIDProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "Anime", - "OVA", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=75.119.159.228&sz=24" -} \ No newline at end of file diff --git a/NontonAnimeIDProvider/src/main/AndroidManifest.xml b/NontonAnimeIDProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/NontonAnimeIDProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/NontonAnimeIDProvider/src/main/kotlin/com/lagradost/NontonAnimeIDProvider.kt b/NontonAnimeIDProvider/src/main/kotlin/com/lagradost/NontonAnimeIDProvider.kt deleted file mode 100644 index bc75ac2..0000000 --- a/NontonAnimeIDProvider/src/main/kotlin/com/lagradost/NontonAnimeIDProvider.kt +++ /dev/null @@ -1,257 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -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.Jsoup -import org.jsoup.nodes.Element - -class NontonAnimeIDProvider : MainAPI() { - override var mainUrl = "https://75.119.159.228" - override var name = "NontonAnimeID" - override val hasQuickSearch = false - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return when { - t.contains("TV") -> TvType.Anime - t.contains("Movie") -> TvType.AnimeMovie - else -> TvType.OVA - } - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Finished Airing" -> ShowStatus.Completed - "Currently Airing" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { - val document = app.get(mainUrl).document - - val homePageList = ArrayList() - - document.select("section#postbaru").forEach { block -> - val header = block.selectFirst("h2")!!.text().trim() - val animes = block.select("article.animeseries").map { - it.toSearchResult() - } - if (animes.isNotEmpty()) homePageList.add(HomePageList(header, animes)) - } - - document.select("aside#sidebar_right > div:nth-child(4)").forEach { block -> - val header = block.selectFirst("h3")!!.ownText().trim() - val animes = block.select("li.fullwdth").map { - it.toSearchResultPopular() - } - if (animes.isNotEmpty()) homePageList.add(HomePageList(header, animes)) - } - - return HomePageResponse(homePageList) - } - - private fun getProperAnimeLink(uri: String): String { - return if (uri.contains("/anime/")) { - uri - } else { - var title = uri.substringAfter("$mainUrl/") - val fixTitle = Regex("(.*)-episode.*").find(title)?.groupValues?.getOrNull(1).toString() - title = when { - title.contains("utawarerumono-season-3") -> fixTitle.replace( - "season-3", - "futari-no-hakuoro" - ) - title.contains("kingdom-season-4") -> fixTitle.replace("season-4", "4th-season") - title.contains("maou-sama-season-2") -> fixTitle.replace("season-2", "2") - title.contains("overlord-season-4") -> fixTitle.replace("season-4", "iv") - title.contains("kyoushitsu-e-season-2") -> fixTitle.replace( - "kyoushitsu-e-season-2", - "kyoushitsu-e-tv-2nd-season" - ) - title.contains("season-2") -> fixTitle.replace("season-2", "2nd-season") - title.contains("season-3") -> fixTitle.replace("season-3", "3rd-season") - title.contains("movie") -> title.substringBefore("-movie") - else -> fixTitle - } - "$mainUrl/anime/$title" - } - } - - private fun Element.toSearchResult(): AnimeSearchResponse { - val href = getProperAnimeLink(fixUrl(this.selectFirst("a")!!.attr("href"))) - val title = this.selectFirst("h3.title")!!.text() - val posterUrl = fixUrl(this.select("img").attr("data-src")) - - return newAnimeSearchResponse(title, href, TvType.Anime) { - this.posterUrl = posterUrl - addDubStatus(dubExist = false, subExist = true) - } - - } - - private fun Element.toSearchResultPopular(): AnimeSearchResponse { - val href = getProperAnimeLink(fixUrl(this.selectFirst("a")!!.attr("href"))) - val title = this.select("h4").text().trim() - val posterUrl = fixUrl(this.select("img").attr("data-src")) - - return newAnimeSearchResponse(title, href, TvType.Anime) { - this.posterUrl = posterUrl - addDubStatus(dubExist = false, subExist = true) - } - - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = app.get(link).document - - return document.select(".result > ul > li").mapNotNull { - val title = it.selectFirst("h2")!!.text().trim() - val poster = it.selectFirst("img")!!.attr("src") - val tvType = getType( - it.selectFirst(".boxinfores > span.typeseries")!!.text().toString() - ) - val href = fixUrl(it.selectFirst("a")!!.attr("href")) - - newAnimeSearchResponse(title, href, tvType) { - this.posterUrl = poster - addDubStatus(dubExist = false, subExist = true) - } - } - } - - private data class EpResponse( - @JsonProperty("posts") val posts: String?, - @JsonProperty("max_page") val max_page: Int?, - @JsonProperty("found_posts") val found_posts: Int?, - @JsonProperty("content") val content: String - ) - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst("h1.entry-title.cs")!!.text().trim() - val poster = document.selectFirst(".poster > img")?.attr("data-src") - val tags = document.select(".tagline > a").map { it.text() } - - val year = Regex("\\d, ([0-9]*)").find( - document.select(".bottomtitle > span:nth-child(5)").text() - )?.groupValues?.get(1)?.toIntOrNull() - val status = getStatus( - document.select("span.statusseries").text().trim() - ) - val type = getType(document.select("span.typeseries").text().trim()) - val rating = document.select("span.nilaiseries").text().trim().toIntOrNull() - val description = document.select(".entry-content.seriesdesc > p").text().trim() - val trailer = document.selectFirst("iframe#traileryt")?.attr("data-src") - - val episodes = if (document.select("button.buttfilter").isNotEmpty()) { - val id = document.select("input[name=series_id]").attr("value") - val numEp = - document.selectFirst(".latestepisode > a")?.text()?.replace(Regex("[^0-9]"), "") - .toString() - Jsoup.parse( - app.post( - url = "$mainUrl/wp-admin/admin-ajax.php", - data = mapOf( - "misha_number_of_results" to numEp, - "misha_order_by" to "date-DESC", - "action" to "mishafilter", - "series_id" to id - ) - ).parsed().content - ).select("li").map { - val name = Regex("(Episode\\s?[0-9]+)").find( - it.selectFirst("a")?.text().toString() - )?.groupValues?.getOrNull(0) ?: it.selectFirst("a")?.text() - val link = fixUrl(it.selectFirst("a")!!.attr("href")) - Episode(link, name) - }.reversed() - } else { - document.select("ul.misha_posts_wrap2 > li").map { - val name = Regex("(Episode\\s?[0-9]+)").find( - it.selectFirst("a")?.text().toString() - )?.groupValues?.getOrNull(0) ?: it.selectFirst("a")?.text() - val link = it.select("a").attr("href") - Episode(link, name) - }.reversed() - } - - - val recommendations = document.select(".result > li").mapNotNull { - val epHref = it.selectFirst("a")!!.attr("href") - val epTitle = it.selectFirst("h3")!!.text() - val epPoster = it.select(".top > img").attr("data-src") - - newAnimeSearchResponse(epTitle, epHref, TvType.Anime) { - this.posterUrl = epPoster - addDubStatus(dubExist = false, subExist = true) - } - } - - return newAnimeLoadResponse(title, url, type) { - engName = title - posterUrl = poster - this.year = year - addEpisodes(DubStatus.Subbed, episodes) - showStatus = status - this.rating = rating - plot = description - addTrailer(trailer) - this.tags = tags - this.recommendations = recommendations - } - - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - - val document = app.get(data).document - val sources = ArrayList() - - document.select(".container1 > ul > li:not(.boxtab)").apmap { - val dataPost = it.attr("data-post") - val dataNume = it.attr("data-nume") - val dataType = it.attr("data-type") - - val iframe = app.post( - url = "$mainUrl/wp-admin/admin-ajax.php", - data = mapOf( - "action" to "player_ajax", - "post" to dataPost, - "nume" to dataNume, - "type" to dataType - ), - referer = data, - headers = mapOf("X-Requested-With" to "XMLHttpRequest") - ).document.select("iframe").attr("src") - - sources.add(fixUrl(iframe)) - } - - sources.apmap { - loadExtractor(it, "$mainUrl/", subtitleCallback, callback) - } - - return true - } -} diff --git a/NontonAnimeIDProvider/src/main/kotlin/com/lagradost/NontonAnimeIDProviderPlugin.kt b/NontonAnimeIDProvider/src/main/kotlin/com/lagradost/NontonAnimeIDProviderPlugin.kt deleted file mode 100644 index 996603b..0000000 --- a/NontonAnimeIDProvider/src/main/kotlin/com/lagradost/NontonAnimeIDProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class NontonAnimeIDProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(NontonAnimeIDProvider()) - } -} \ No newline at end of file diff --git a/OlgplyProvider/build.gradle.kts b/OlgplyProvider/build.gradle.kts index 846a41b..c488866 100644 --- a/OlgplyProvider/build.gradle.kts +++ b/OlgplyProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 3 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them description = "Uses TMDB" diff --git a/OploverzProvider/build.gradle.kts b/OploverzProvider/build.gradle.kts deleted file mode 100644 index 72cc16a..0000000 --- a/OploverzProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "Anime", - "OVA", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=65.108.132.145&sz=24" -} \ No newline at end of file diff --git a/OploverzProvider/src/main/AndroidManifest.xml b/OploverzProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/OploverzProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/OploverzProvider/src/main/kotlin/com/lagradost/OploverzProvider.kt b/OploverzProvider/src/main/kotlin/com/lagradost/OploverzProvider.kt deleted file mode 100644 index d739d09..0000000 --- a/OploverzProvider/src/main/kotlin/com/lagradost/OploverzProvider.kt +++ /dev/null @@ -1,203 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer -import com.lagradost.cloudstream3.utils.* -import org.jsoup.Jsoup -import org.jsoup.nodes.Element -import java.util.ArrayList - - -class OploverzProvider : MainAPI() { - override var mainUrl = "https://65.108.132.145" - override var name = "Oploverz" - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return when { - t.contains("TV") -> TvType.Anime - t.contains("Movie") -> TvType.AnimeMovie - else -> TvType.OVA - } - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Completed" -> ShowStatus.Completed - "Ongoing" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - override val mainPage = mainPageOf( - "&status=&type=&order=update" to "Episode Terbaru", - "&status=&type=&order=latest" to "Anime Terbaru", - "&sub=&order=popular" to "Popular Anime", - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val document = app.get("$mainUrl/anime/?page=$page${request.data}").document - val home = document.select("article[itemscope=itemscope]").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun getProperAnimeLink(uri: String): String { - - return if (uri.contains("/anime/")) { - uri - } else { - var title = uri.substringAfter("$mainUrl/") - title = when { - (title.contains("-episode")) && !(title.contains("-ova")) -> Regex("(.+)-episode").find( - title - )?.groupValues?.get(1).toString() - (title.contains("-ova")) -> Regex("(.+)-ova").find(title)?.groupValues?.get(1) - .toString() - (title.contains("-movie")) -> Regex("(.+)-subtitle").find(title)?.groupValues?.get(1) - .toString() - else -> Regex("(.+)-subtitle").find(title)?.groupValues?.get(1).toString() - .replace(Regex("-\\d+"), "") - } - - when { - title.contains("overlord") -> { - title = title.replace("s", "season-") - } - title.contains("kaguya-sama") -> { - title = title.replace("s3", "ultra-romantic") - } - } - - "$mainUrl/anime/$title" - } - - } - - private fun Element.toSearchResult(): AnimeSearchResponse? { - val href = getProperAnimeLink(this.selectFirst("a.tip")!!.attr("href")) - val title = this.selectFirst("h2[itemprop=headline]")?.text()?.trim() ?: return null - val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src")) - val type = getType(this.selectFirst(".eggtype, .typez")?.text()?.trim().toString()) - - return newAnimeSearchResponse(title, href, type) { - this.posterUrl = posterUrl - } - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = app.get(link).document - - return document.select("article[itemscope=itemscope]").map { - val title = it.selectFirst(".tt")?.ownText()?.trim().toString() - val poster = fixUrlNull(it.selectFirst("img")?.attr("src")) - val tvType = getType(it.selectFirst(".typez")?.text().toString()) - val href = fixUrl(it.selectFirst("a.tip")!!.attr("href")) - - newAnimeSearchResponse(title, href, tvType) { - this.posterUrl = poster - addDubStatus(dubExist = false, subExist = true) - } - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst("h1.entry-title")!!.text().trim() - val poster = document.select(".thumb > img").attr("src") - val tags = document.select(".genxed > a").map { it.text() } - - val year = Regex("\\d, ([0-9]*)").find( - document.selectFirst(".info-content > .spe > span > time")!!.text().trim() - )?.groupValues?.get(1).toString().toIntOrNull() - val status = getStatus( - document.select(".info-content > .spe > span:nth-child(1)") - .text().trim().replace("Status: ", "") - ) - val typeCheck = - when (document.select(".info-content > .spe > span:nth-child(5), .info-content > .spe > span") - .text().trim()) { - "OVA" -> "OVA" - "Movie" -> "Movie" - else -> "TV" - } - val type = getType(typeCheck) - val description = document.select(".entry-content > p").text().trim() - val trailer = document.selectFirst("a.trailerbutton")?.attr("href") - - val episodes = document.select(".eplister > ul > li").map { - val header = it.select(".epl-title").text() - val name = - Regex("(Episode\\s?[0-9]+)").find(header)?.groupValues?.getOrNull(0) ?: header - val link = fixUrl(it.select("a").attr("href")) - Episode(link, name) - }.reversed() - - val recommendations = - document.select(".listupd > article[itemscope=itemscope]").mapNotNull { rec -> - val epTitle = rec.selectFirst(".tt")!!.ownText().trim() - val epPoster = rec.selectFirst("img")!!.attr("src") - val epType = getType(rec.selectFirst(".typez")?.text().toString()) - val epHref = fixUrl(rec.selectFirst("a.tip")!!.attr("href")) - - newAnimeSearchResponse(epTitle, epHref, epType) { - this.posterUrl = epPoster - addDubStatus(dubExist = false, subExist = true) - } - } - - return newAnimeLoadResponse(title, url, type) { - engName = title - posterUrl = poster - this.year = year - addEpisodes(DubStatus.Subbed, episodes) - showStatus = status - plot = description - this.tags = tags - this.recommendations = recommendations - addTrailer(trailer) - } - - } - - data class Source( - @JsonProperty("play_url") val play_url: String, - @JsonProperty("format_id") val format_id: Int - ) - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - val document = app.get(data).document - val sources = document.select(".mobius > .mirror > option").mapNotNull { - fixUrl(Jsoup.parse(base64Decode(it.attr("value"))).select("iframe").attr("src")) - } - - sources.apmap { - loadExtractor(it, data, subtitleCallback, callback) - } - - return true - } - -} \ No newline at end of file diff --git a/OploverzProvider/src/main/kotlin/com/lagradost/OploverzProviderPlugin.kt b/OploverzProvider/src/main/kotlin/com/lagradost/OploverzProviderPlugin.kt deleted file mode 100644 index ff5fc69..0000000 --- a/OploverzProvider/src/main/kotlin/com/lagradost/OploverzProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class OploverzProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(OploverzProvider()) - } -} \ No newline at end of file diff --git a/OtakudesuProvider/build.gradle.kts b/OtakudesuProvider/build.gradle.kts deleted file mode 100644 index 89f0c33..0000000 --- a/OtakudesuProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "Anime", - "OVA", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=otakudesu.watch&sz=24" -} \ No newline at end of file diff --git a/OtakudesuProvider/src/main/AndroidManifest.xml b/OtakudesuProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/OtakudesuProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/OtakudesuProvider/src/main/kotlin/com/lagradost/OtakudesuProvider.kt b/OtakudesuProvider/src/main/kotlin/com/lagradost/OtakudesuProvider.kt deleted file mode 100644 index 3de0ce0..0000000 --- a/OtakudesuProvider/src/main/kotlin/com/lagradost/OtakudesuProvider.kt +++ /dev/null @@ -1,204 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.loadExtractor -import org.jsoup.Jsoup -import org.jsoup.nodes.Element -import java.util.ArrayList - -class OtakudesuProvider : MainAPI() { - override var mainUrl = "https://otakudesu.watch" - override var name = "Otakudesu" - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return if (t.contains("OVA") || t.contains("Special")) TvType.OVA - else if (t.contains("Movie")) TvType.AnimeMovie - else TvType.Anime - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Completed" -> ShowStatus.Completed - "Ongoing" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - override val mainPage = mainPageOf( - "$mainUrl/ongoing-anime/page/" to "Anime Ongoing", - "$mainUrl/complete-anime/page/" to "Anime Completed" - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val document = app.get(request.data + page).document - val home = document.select("div.venz > ul > li").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun Element.toSearchResult(): AnimeSearchResponse? { - val title = this.selectFirst("h2.jdlflm")?.text()?.trim() ?: return null - val href = this.selectFirst("a")!!.attr("href") - val posterUrl = this.select("div.thumbz > img").attr("src").toString() - val epNum = this.selectFirst("div.epz")?.ownText()?.replace(Regex("[^0-9]"), "")?.trim() - ?.toIntOrNull() - return newAnimeSearchResponse(title, href, TvType.Anime) { - this.posterUrl = posterUrl - addSub(epNum) - } - - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query&post_type=anime" - val document = app.get(link).document - - return document.select("ul.chivsrc > li").map { - val title = it.selectFirst("h2 > a")!!.ownText().trim() - val href = it.selectFirst("h2 > a")!!.attr("href") - val posterUrl = it.selectFirst("img")!!.attr("src").toString() - newAnimeSearchResponse(title, href, TvType.Anime) { - this.posterUrl = posterUrl - } - } - } - - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst("div.infozingle > p:nth-child(1) > span")?.ownText() - ?.replace(":", "")?.trim().toString() - val poster = document.selectFirst("div.fotoanime > img")?.attr("src") - val tags = document.select("div.infozingle > p:nth-child(11) > span > a").map { it.text() } - val type = getType( - document.selectFirst("div.infozingle > p:nth-child(5) > span")?.ownText() - ?.replace(":", "")?.trim().toString() - ) - val year = Regex("\\d, ([0-9]*)").find( - document.select("div.infozingle > p:nth-child(9) > span").text() - )?.groupValues?.get(1)?.toIntOrNull() - val status = getStatus( - document.selectFirst("div.infozingle > p:nth-child(6) > span")!!.ownText() - .replace(":", "") - .trim() - ) - val description = document.select("div.sinopc > p").text() - - val episodes = document.select("div.episodelist")[1].select("ul > li").mapNotNull { - val name = Regex("(Episode\\s?[0-9]+)").find( - it.selectFirst("a")?.text().toString() - )?.groupValues?.getOrNull(0) ?: it.selectFirst("a")?.text() - val link = fixUrl(it.selectFirst("a")!!.attr("href")) - Episode(link, name) - }.reversed() - - val recommendations = - document.select("div.isi-recommend-anime-series > div.isi-konten").map { - val recName = it.selectFirst("span.judul-anime > a")!!.text() - val recHref = it.selectFirst("a")!!.attr("href") - val recPosterUrl = it.selectFirst("a > img")?.attr("src").toString() - newAnimeSearchResponse(recName, recHref, TvType.Anime) { - this.posterUrl = recPosterUrl - } - } - - return newAnimeLoadResponse(title, url, type) { - engName = title - posterUrl = poster - this.year = year - addEpisodes(DubStatus.Subbed, episodes) - showStatus = status - plot = description - this.tags = tags - this.recommendations = recommendations - } - } - - - data class ResponseSources( - @JsonProperty("id") val id: String, - @JsonProperty("i") val i: String, - @JsonProperty("q") val q: String, - ) - - data class ResponseData( - @JsonProperty("data") val data: String - ) - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - - val document = app.get(data).document - val scriptData = document.select("script").last()?.data() - val token = scriptData?.substringAfter("{action:\"")?.substringBefore("\"}").toString() - - val nonce = app.post("$mainUrl/wp-admin/admin-ajax.php", data = mapOf("action" to token)) - .parsed().data - val action = scriptData?.substringAfter(",action:\"")?.substringBefore("\"}").toString() - - val mirrorData = document.select("div.mirrorstream > ul > li").mapNotNull { - base64Decode(it.select("a").attr("data-content")) - }.toString() - - tryParseJson>(mirrorData)?.apmap { res -> - val id = res.id - val i = res.i - val q = res.q - - var sources = Jsoup.parse( - base64Decode( - app.post( - "${mainUrl}/wp-admin/admin-ajax.php", data = mapOf( - "id" to id, - "i" to i, - "q" to q, - "nonce" to nonce, - "action" to action - ) - ).parsed().data - ) - ).select("iframe").attr("src") - - if (sources.startsWith("https://desustream.me")) { - if (!sources.contains("/arcg/") && !sources.contains("/odchan/") && !sources.contains( - "/desudrive/" - ) - ) { - sources = app.get(sources).document.select("iframe").attr("src") - } - if (sources.startsWith("https://yourupload.com")) { - sources = sources.replace("//", "//www.") - } - } - - loadExtractor(sources, data, subtitleCallback, callback) - - } - - return true - } - -} \ No newline at end of file diff --git a/OtakudesuProvider/src/main/kotlin/com/lagradost/OtakudesuProviderPlugin.kt b/OtakudesuProvider/src/main/kotlin/com/lagradost/OtakudesuProviderPlugin.kt deleted file mode 100644 index 4d4cd76..0000000 --- a/OtakudesuProvider/src/main/kotlin/com/lagradost/OtakudesuProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class OtakudesuProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(OtakudesuProvider()) - } -} \ No newline at end of file diff --git a/PelisflixProvider/build.gradle.kts b/PelisflixProvider/build.gradle.kts deleted file mode 100644 index 28248e9..0000000 --- a/PelisflixProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * 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=pelisflix.li&sz=24" -} \ No newline at end of file diff --git a/PelisflixProvider/src/main/AndroidManifest.xml b/PelisflixProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/PelisflixProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/PelisflixProvider/src/main/kotlin/com/lagradost/PelisflixProvider.kt b/PelisflixProvider/src/main/kotlin/com/lagradost/PelisflixProvider.kt deleted file mode 100644 index bf9f999..0000000 --- a/PelisflixProvider/src/main/kotlin/com/lagradost/PelisflixProvider.kt +++ /dev/null @@ -1,231 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addDuration -import com.lagradost.cloudstream3.mvvm.logError -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.loadExtractor - -class PelisflixProvider : MainAPI() { - override var mainUrl = "https://pelisflix.li" - override var name = "Pelisflix" - override var lang = "es" - override val hasMainPage = true - override val hasChromecastSupport = true - override val hasDownloadSupport = true - override val supportedTypes = setOf( - TvType.Movie, - TvType.TvSeries, - ) - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { - val items = ArrayList() - val urls = listOf( - Pair("$mainUrl/ver-peliculas-online-gratis-fullhdc3/", "Películas"), - Pair("$mainUrl/ver-series-online-gratis/", "Series"), - ) - for (i in urls) { - try { - val soup = app.get(i.first).document - val home = soup.select("article.TPost.B").map { - val title = it.selectFirst("h2.title")!!.text() - val link = it.selectFirst("a")!!.attr("href") - TvSeriesSearchResponse( - title, - link, - this.name, - TvType.Movie, - it.selectFirst("figure img")!!.attr("data-src"), - null, - null, - ) - } - - items.add(HomePageList(i.second, home)) - } catch (e: Exception) { - logError(e) - } - } - if (items.size <= 0) throw ErrorLoadingException() - return HomePageResponse(items) - } - - override suspend fun search(query: String): List { - val url = "$mainUrl/?s=$query" - val doc = app.get(url).document - return doc.select("article.TPost.B").map { - val href = it.selectFirst("a")!!.attr("href") - val poster = it.selectFirst("figure img")!!.attr("data-src") - val name = it.selectFirst("h2.title")!!.text() - val isMovie = href.contains("/pelicula/") - if (isMovie) { - MovieSearchResponse( - name, - href, - this.name, - TvType.Movie, - poster, - null - ) - } else { - TvSeriesSearchResponse( - name, - href, - this.name, - TvType.TvSeries, - poster, - null, - null - ) - } - }.toList() - } - - override suspend fun load(url: String): LoadResponse? { - val type = if (url.contains("/pelicula/")) TvType.Movie else TvType.TvSeries - - val document = app.get(url).document - - val title = document.selectFirst("h1.Title")!!.text() - val descRegex = Regex("(.Recuerda.*Pelisflix.+)") - val descRegex2 = Regex("(Actualmente.*.)") - val descRegex3 = Regex("(.*Director:.*)") - val descRegex4 = Regex("(.*Actores:.*)") - val descRegex5 = Regex("(Ver.*(\\)|)((\\d+).))") - val descipt = document.selectFirst("div.Description")!!.text().replace(descRegex, "") - .replace(descRegex2, "").replace(descRegex3, "") - .replace(descRegex4, "").replace(descRegex5, "") - val desc2Regex = Regex("(G(e|é)nero:.*..)") - val descipt2 = document.selectFirst("div.Description")!!.text().replace(desc2Regex, "") - val rating = - document.selectFirst("div.rating-content button.like-mov span.vot_cl")?.text() - ?.toFloatOrNull() - ?.times(0)?.toInt() - val year = document.selectFirst("span.Date")?.text() - val duration = - if (type == TvType.Movie) document.selectFirst(".Container .Container span.Time")!! - .text() else null - val postercss = document.selectFirst("head").toString() - val posterRegex = - Regex("(\"og:image\" content=\"https:\\/\\/seriesflix.video\\/wp-content\\/uploads\\/(\\d+)\\/(\\d+)\\/?.*.jpg)") - val poster = try { - posterRegex.findAll(postercss).map { - it.value.replace("\"og:image\" content=\"", "") - }.toList().first() - } catch (e: Exception) { - document.select(".TPostBg").attr("src") - } - if (type == TvType.TvSeries) { - val list = ArrayList>() - - document.select("main > section.SeasonBx > div > div.Title > a").forEach { element -> - val season = element.selectFirst("> span")?.text()?.toIntOrNull() - val href = element.attr("href") - if (season != null && season > 0 && !href.isNullOrBlank()) { - list.add(Pair(season, fixUrl(href))) - } - } - if (list.isEmpty()) throw ErrorLoadingException("No Seasons Found") - - val episodeList = ArrayList() - - for ((seasonInt, seasonUrl) in list) { - val seasonDocument = app.get(seasonUrl).document - val episodes = seasonDocument.select("table > tbody > tr") - if (episodes.isNotEmpty()) { - episodes.forEach { episode -> - val epNum = episode.selectFirst("> td > span.Num")?.text()?.toIntOrNull() - val epthumb = episode.selectFirst("img")?.attr("src") - val aName = episode.selectFirst("> td.MvTbTtl > a") - val name = aName!!.text() - val href = aName.attr("href") - val date = episode.selectFirst("> td.MvTbTtl > span")?.text() - episodeList.add( - newEpisode(href) { - this.name = name - this.season = seasonInt - this.episode = epNum - this.posterUrl = fixUrlNull(epthumb) - addDate(date) - } - ) - } - } - } - return TvSeriesLoadResponse( - title, - url, - this.name, - type, - episodeList, - fixUrlNull(poster), - year?.toIntOrNull(), - descipt2, - null, - rating - ) - } else { - return newMovieLoadResponse( - title, - url, - type, - url - ) { - posterUrl = fixUrlNull(poster) - this.year = year?.toIntOrNull() - this.plot = descipt - this.rating = rating - addDuration(duration) - } - } - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - app.get(data).document.select("li button.Button.sgty").forEach { - val movieID = it.attr("data-id") - val serverID = it.attr("data-key") - val type = if (data.contains("pelicula")) 1 else 2 - val url = - "$mainUrl/?trembed=$serverID&trid=$movieID&trtype=$type" //This is to get the POST key value - val doc1 = app.get(url).document - doc1.select("div.Video iframe").apmap { - val iframe = it.attr("src") - val postkey = iframe.replace("/stream/index.php?h=", "") // this obtains - // djNIdHNCR2lKTGpnc3YwK3pyRCs3L2xkQmljSUZ4ai9ibTcza0JRODNMcmFIZ0hPejdlYW0yanJIL2prQ1JCZA POST KEY - app.post( - "https://pelisflix.li/stream/r.php", - headers = mapOf( - "Host" to "pelisflix.li", - "User-Agent" to USER_AGENT, - "Accept" to "ext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", - "Accept-Language" to "en-US,en;q=0.5", - "Content-Type" to "application/x-www-form-urlencoded", - "Origin" to "null", - "DNT" to "1", - "Connection" to "keep-alive", - "Upgrade-Insecure-Requests" to "1", - "Sec-Fetch-Dest" to "iframe", - "Sec-Fetch-Mode" to "navigate", - "Sec-Fetch-Site" to "same-origin", - "Sec-Fetch-User" to "?1", - "Pragma" to "no-cache", - "Cache-Control" to "no-cache", - "TE" to "trailers" - ), - params = mapOf(Pair("h", postkey)), - data = mapOf(Pair("h", postkey)), - allowRedirects = false - ).okhttpResponse.headers.values("location").apmap { link -> - val url1 = link.replace("#bu", "") - loadExtractor(url1, data, subtitleCallback, callback) - } - } - } - return true - } -} \ No newline at end of file diff --git a/PelisflixProvider/src/main/kotlin/com/lagradost/PelisflixProviderPlugin.kt b/PelisflixProvider/src/main/kotlin/com/lagradost/PelisflixProviderPlugin.kt deleted file mode 100644 index 4c8de08..0000000 --- a/PelisflixProvider/src/main/kotlin/com/lagradost/PelisflixProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class PelisflixProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(PelisflixProvider()) - } -} \ No newline at end of file diff --git a/PhimmoichillProvider/build.gradle.kts b/PhimmoichillProvider/build.gradle.kts deleted file mode 100644 index 6f18e50..0000000 --- a/PhimmoichillProvider/build.gradle.kts +++ /dev/null @@ -1,27 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AsianDrama", - "Anime", - "TvSeries", - "Movie", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=phimmoichill.net&sz=24" -} \ No newline at end of file diff --git a/PhimmoichillProvider/src/main/AndroidManifest.xml b/PhimmoichillProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/PhimmoichillProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/PhimmoichillProvider/src/main/kotlin/com/lagradost/PhimmoichillProvider.kt b/PhimmoichillProvider/src/main/kotlin/com/lagradost/PhimmoichillProvider.kt deleted file mode 100644 index ed7af66..0000000 --- a/PhimmoichillProvider/src/main/kotlin/com/lagradost/PhimmoichillProvider.kt +++ /dev/null @@ -1,222 +0,0 @@ -package com.lagradost - -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.nodes.Element -import java.net.URLDecoder -import java.util.ArrayList - -class PhimmoichillProvider : MainAPI() { - override var mainUrl = "https://phimmoichill.net" - override var name = "Phimmoichill" - override val hasMainPage = true - override var lang = "vi" - override val hasDownloadSupport = true - override val supportedTypes = setOf( - TvType.Movie, - TvType.TvSeries, - TvType.Anime, - TvType.AsianDrama - ) - - override val mainPage = mainPageOf( - "$mainUrl/genre/phim-chieu-rap/page-" to "Phim Chiếu Rạp", - "$mainUrl/list/phim-le/page-" to "Phim Lẻ", - "$mainUrl/list/phim-bo/page-" to "Phim Bộ", - "$mainUrl/genre/phim-hoat-hinh/page-" to "Phim Hoạt Hình", - "$mainUrl/country/phim-han-quoc/page-" to "Phim Hàn Quốc", - "$mainUrl/country/phim-trung-quoc/page-" to "Phim Trung Quốc", - "$mainUrl/country/phim-thai-lan/page-" to "Phim Thái Lan", - ) - - override suspend fun getMainPage( - page: Int, - request: MainPageRequest - ): HomePageResponse { - val document = app.get(request.data + page).document - val home = document.select("li.item").mapNotNull { - it.toSearchResult() - } - return newHomePageResponse(request.name, home) - } - - private fun decode(input: String): String? = URLDecoder.decode(input, "utf-8") - - private fun Element.toSearchResult(): SearchResponse { - val title = this.selectFirst("p,h3")?.text()?.trim().toString() - val href = fixUrl(this.selectFirst("a")!!.attr("href")) - val posterUrl = decode(this.selectFirst("img")!!.attr("src").substringAfter("url=")) - val temp = this.select("span.label").text() - return if (temp.contains(Regex("\\d"))) { - val episode = Regex("(\\((\\d+))|(\\s(\\d+))").find(temp)?.groupValues?.map { num -> - num.replace(Regex("\\(|\\s"), "") - }?.distinct()?.firstOrNull()?.toIntOrNull() - newAnimeSearchResponse(title, href, TvType.TvSeries) { - this.posterUrl = posterUrl - addSub(episode) - } - } else { - val quality = - temp.replace(Regex("(-.*)|(\\|.*)|(?i)(VietSub.*)|(?i)(Thuyết.*)"), "").trim() - newMovieSearchResponse(title, href, TvType.Movie) { - this.posterUrl = posterUrl - addQuality(quality) - } - } - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/tim-kiem/$query" - val document = app.get(link).document - - return document.select("ul.list-film li").map { - it.toSearchResult() - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst("h1[itemprop=name]")?.text()?.trim().toString() - val link = document.select("ul.list-button li:last-child a").attr("href") - val poster = document.selectFirst("div.image img[itemprop=image]")?.attr("src") - val tags = document.select("ul.entry-meta.block-film li:nth-child(4) a").map { it.text() } - val year = document.select("ul.entry-meta.block-film li:nth-child(2) a").text().trim() - .toIntOrNull() - val tvType = if (document.select("div.latest-episode").isNotEmpty() - ) TvType.TvSeries else TvType.Movie - val description = document.select("div#film-content-wrapper").text().trim() - val trailer = - document.select("div#trailer script").last()?.data()?.substringAfter("file: \"") - ?.substringBefore("\",") - val rating = - document.select("ul.entry-meta.block-film li:nth-child(7) span").text().toRatingInt() - val actors = document.select("ul.entry-meta.block-film li:last-child a").map { it.text() } - val recommendations = document.select("ul#list-film-realted li.item").map { - it.toSearchResult() - } - - return if (tvType == TvType.TvSeries) { - val docEpisodes = app.get(link).document - val episodes = docEpisodes.select("ul#list_episodes > li").map { - val href = it.select("a").attr("href") - val episode = - it.select("a").text().replace(Regex("[^0-9]"), "").trim().toIntOrNull() - val name = "Episode $episode" - Episode( - data = href, - name = name, - episode = episode, - ) - } - 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, link) { - 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 key = document.select("div#content script").mapNotNull { script -> - if (script.data().contains("filmInfo.episodeID =")) { - val id = script.data().substringAfter("filmInfo.episodeID = parseInt('") - .substringBefore("');") - app.post( - url = "$mainUrl/pmplayer.php", - data = mapOf("qcao" to id), - referer = data, - headers = mapOf("X-Requested-With" to "XMLHttpRequest") - ).text.substringAfterLast("iniPlayers(\"").substringBefore("\",") - } else { - null - } - }.first() - - listOf( - Pair("https://so-trym.topphimmoi.org/hlspm/$key", "PMFAST"), - Pair("https://dash.megacdn.xyz/hlspm/$key", "PMHLS"), - Pair("https://dash.megacdn.xyz/dast/$key/index.m3u8", "PMBK") - ).apmap { (link, source) -> - safeApiCall { - if (source == "PMBK") { - callback.invoke( - ExtractorLink( - source, - source, - link, - referer = "$mainUrl/", - quality = Qualities.P1080.value, - isM3u8 = true - ) - ) - } else { - val playList = app.get(link, referer = "$mainUrl/") - .parsedSafe()?.main?.segments?.map { segment -> - PlayListItem( - segment.link, - (segment.du.toFloat() * 1_000_000).toLong() - ) - } - - callback.invoke( - ExtractorLinkPlayList( - source, - source, - playList ?: return@safeApiCall, - referer = "$mainUrl/", - quality = Qualities.P1080.value, - headers = mapOf( -// "If-None-Match" to "*", - "Origin" to mainUrl, - ) - ) - ) - } - } - } - return true - } - - data class Segment( - @JsonProperty("du") val du: String, - @JsonProperty("link") val link: String, - ) - - data class DataM3u( - @JsonProperty("segments") val segments: List?, - ) - - data class ResponseM3u( - @JsonProperty("2048p") val main: DataM3u?, - ) - -} \ No newline at end of file diff --git a/PhimmoichillProvider/src/main/kotlin/com/lagradost/PhimmoichillProviderPlugin.kt b/PhimmoichillProvider/src/main/kotlin/com/lagradost/PhimmoichillProviderPlugin.kt deleted file mode 100644 index 64c2a13..0000000 --- a/PhimmoichillProvider/src/main/kotlin/com/lagradost/PhimmoichillProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class PhimmoichillProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(PhimmoichillProvider()) - } -} \ No newline at end of file diff --git a/PinoyHDXyzProvider/build.gradle.kts b/PinoyHDXyzProvider/build.gradle.kts deleted file mode 100644 index 3f2e020..0000000 --- a/PinoyHDXyzProvider/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AsianDrama", - "Movie", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=www.pinoy-hd.xyz&sz=24" -} \ No newline at end of file diff --git a/PinoyHDXyzProvider/src/main/AndroidManifest.xml b/PinoyHDXyzProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/PinoyHDXyzProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/PinoyHDXyzProvider/src/main/kotlin/com/lagradost/PinoyHDXyzProvider.kt b/PinoyHDXyzProvider/src/main/kotlin/com/lagradost/PinoyHDXyzProvider.kt deleted file mode 100644 index 02fd29d..0000000 --- a/PinoyHDXyzProvider/src/main/kotlin/com/lagradost/PinoyHDXyzProvider.kt +++ /dev/null @@ -1,237 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.utils.AppUtils.parseJson -import com.lagradost.cloudstream3.utils.AppUtils.toJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.loadExtractor - -class PinoyHDXyzProvider : MainAPI() { - override var name = "Pinoy-HD" - override var mainUrl = "https://www.pinoy-hd.xyz" - override var lang = "tl" - override val supportedTypes = setOf(TvType.AsianDrama) - override val hasDownloadSupport = true - override val hasMainPage = true - override val hasQuickSearch = false - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { - val all = ArrayList() - val document = app.get(mainUrl, referer = mainUrl).document - val mainbody = document.getElementsByTag("body") - - mainbody.select("div.section-cotent.col-md-12.bordert").forEach { row -> - val title = row?.select("div.title-section.tt")?.text() ?: "" - val elements = row?.select("li.img_frame.preview-tumb7")?.mapNotNull { - // Get inner div from article - val innerBody = it?.selectFirst("a") ?: return@mapNotNull null - // Fetch details - val name = it.text().trim() - if (name.isBlank()) { - return@mapNotNull null - } - - val link = innerBody.attr("href") ?: return@mapNotNull null - val image = fixUrlNull(innerBody.select("img").attr("src")) - //Log.i(this.name, "Result => (innerBody, image) ${innerBody} / ${image}") - // Get Year from Link - val rex = Regex("_(\\d+)_") - val year = rex.find(link)?.value?.replace("_", "")?.toIntOrNull() - //Log.i(this.name, "Result => (yearRes, year) ${yearRes} / ${year}") - MovieSearchResponse( - name = name, - url = link, - apiName = this.name, - type = TvType.Movie, - posterUrl = image, - year = year - ) - }?.distinctBy { c -> c.url } ?: listOf() - // Add to Homepage - if (elements.isNotEmpty()) { - all.add( - HomePageList( - title, elements - ) - ) - } - } - return HomePageResponse(all) - } - - override suspend fun search(query: String): List { - val url = "$mainUrl/search/?q=${query.replace(" ", "+")}" - val document = app.get(url).document.select("div.portfolio-thumb") - return document.mapNotNull { - if (it == null) { - return@mapNotNull null - } - val link = it.selectFirst("a")?.attr("href") ?: return@mapNotNull null - val title = it.text() ?: "" - val year = null - val image = null // site provides no image on search page - - MovieSearchResponse( - name = title, - url = link, - apiName = this.name, - type = TvType.Movie, - posterUrl = image, - year = year - ) - }.distinctBy { c -> c.url } - } - - override suspend fun load(url: String): LoadResponse { - val doc = app.get(url).document - val body = doc.getElementsByTag("body") - val inner = body.select("div.info") - - // Video links - val listOfLinks: MutableList = mutableListOf() - - // Video details - var title = "" - var year: Int? = null - var tags: List? = null - val poster = fixUrlNull(inner.select("div.portfolio-tumb.ph-link > img").attr("src")) - //Log.i(this.name, "Result => (imgLinkCode) ${imgLinkCode}") - inner.select("table").select("tr").forEach { - val td = it?.select("td") ?: return@forEach - val caption = td[0].text().lowercase() - //Log.i(this.name, "Result => (caption) $caption") - when (caption) { - "name" -> { - title = td[1].text() - } - "year" -> { - var yearRes = td[1].toString() - year = if (yearRes.isNotBlank()) { - if (yearRes.contains("var year =")) { - yearRes = - yearRes.substring(yearRes.indexOf("var year =") + "var year =".length) - //Log.i(this.name, "Result => (yearRes) $yearRes") - yearRes = yearRes.substring(0, yearRes.indexOf(';')) - .trim().removeSurrounding("'") - } - yearRes.toIntOrNull() - } else { - null - } - } - "genre" -> { - tags = td[1].select("a").mapNotNull { tag -> - tag?.text()?.trim() ?: return@mapNotNull null - }.filter { a -> a.isNotBlank() } - } - } - } - - var descript = body.select("div.eText").text() - if (!descript.isNullOrEmpty()) { - try { - descript = "(undefined_x_Polus+[.\\d+])".toRegex().replace(descript, "") - descript = "(_x_Polus+[.\\d+])".toRegex().replace(descript, "") - descript = descript.trim().removeSuffix("undefined").trim() - } catch (e: java.lang.Exception) { - } - } - // Add links hidden in description - listOfLinks.addAll(fetchUrls(descript)) - listOfLinks.forEach { link -> - //Log.i(this.name, "Result => (hidden link) $link") - descript = descript.replace(link, "") - } - - // Try looking for episodes, for series - val episodeList = ArrayList() - val bodyText = body.select("div.section-cotent1.col-md-12").select("section") - .select("script").toString() - //Log.i(this.name, "Result => (bodyText) ${bodyText}") - - "(?<=ses=\\(')(.*)(?='\\).split)".toRegex().find(bodyText)?.groupValues?.get(0).let { - if (!it.isNullOrEmpty()) { - var count = 0 - it.split(", ").forEach { ep -> - count++ - val listEpStream = listOf(ep.trim()).toJson() - //Log.i(this.name, "Result => (ep $count) $listEpStream") - episodeList.add( - Episode( - name = null, - season = null, - episode = count, - data = listEpStream, - posterUrl = null, - date = null - ) - ) - } - } - } - if (episodeList.size > 0) { - return TvSeriesLoadResponse( - name = title, - url = url, - apiName = this.name, - type = TvType.AsianDrama, - episodes = episodeList, - posterUrl = poster, - year = year, - plot = descript, - tags = tags - ) - } - - // Video links for Movie - body.select("div.tabcontent > iframe").forEach { - val linkMain = it?.attr("src") - if (!linkMain.isNullOrEmpty()) { - listOfLinks.add(linkMain) - //Log.i(this.name, "Result => (linkMain) $linkMain") - } - } - body.select("div.tabcontent.hide > iframe").forEach { - val linkMain = it?.attr("src") - if (!linkMain.isNullOrEmpty()) { - listOfLinks.add(linkMain) - //Log.i(this.name, "Result => (linkMain hide) $linkMain") - } - } - - val extraLinks = body.select("div.tabcontent.hide").text() - listOfLinks.addAll(fetchUrls(extraLinks)) - - val streamLinks = listOfLinks.distinct().toJson() - //Log.i(this.name, "Result => (streamLinks) streamLinks") - return MovieLoadResponse( - name = title, - url = url, - apiName = this.name, - type = TvType.Movie, - dataUrl = streamLinks, - posterUrl = poster, - year = year, - plot = descript, - tags = tags - ) - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - var count = 0 - parseJson>(data).forEach { item -> - val url = item.trim() - if (url.isNotBlank()) { - if (loadExtractor(url, mainUrl, subtitleCallback, callback)) { - count++ - } - } - } - return count > 0 - } -} \ No newline at end of file diff --git a/PinoyHDXyzProvider/src/main/kotlin/com/lagradost/PinoyHDXyzProviderPlugin.kt b/PinoyHDXyzProvider/src/main/kotlin/com/lagradost/PinoyHDXyzProviderPlugin.kt deleted file mode 100644 index 61752a6..0000000 --- a/PinoyHDXyzProvider/src/main/kotlin/com/lagradost/PinoyHDXyzProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class PinoyHDXyzProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(PinoyHDXyzProvider()) - } -} \ No newline at end of file diff --git a/PinoyMovies/build.gradle.kts b/PinoyMovies/build.gradle.kts deleted file mode 100644 index 353fc70..0000000 --- a/PinoyMovies/build.gradle.kts +++ /dev/null @@ -1,23 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - description = "Includes PinoyMoviePediaProvider and PinoyMoviesEsProvider" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AsianDrama" - ) - - } \ No newline at end of file diff --git a/PinoyMovies/src/main/AndroidManifest.xml b/PinoyMovies/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/PinoyMovies/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviePediaProvider.kt b/PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviePediaProvider.kt deleted file mode 100644 index 8448701..0000000 --- a/PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviePediaProvider.kt +++ /dev/null @@ -1,238 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -//import com.lagradost.cloudstream3.extractors.FEmbed -import com.lagradost.cloudstream3.utils.AppUtils.toJson -import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.loadExtractor - -class PinoyMoviePediaProvider : MainAPI() { - override var name = "Pinoy Moviepedia" - override var mainUrl = "https://pinoymoviepedia.ru" - override var lang = "tl" - override val supportedTypes = setOf(TvType.AsianDrama) - override val hasDownloadSupport = true - override val hasMainPage = true - override val hasQuickSearch = false - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { - val all = ArrayList() - val document = app.get(mainUrl).document - val mainbody = document.getElementsByTag("body") - // All rows will be hardcoded bc of the nature of the site - val rows: List> = listOf( - Pair("Latest Movies", "featured-titles"), - Pair("Movies", "dt-movies"), - Pair("Digitally Restored", "genre_digitally-restored"), - Pair("Action", "genre_action"), - Pair("Romance", "genre_romance"), - Pair("Comedy", "genre_comedy"), - Pair("Family", "genre_family") - //Pair("Adult +18", "genre_pinay-sexy-movies") - ) - rows.forEach { item -> - val title = item.first - val inner = mainbody?.select("div#${item.second} > article") - - val elements: List = inner?.mapNotNull { - if (it == null) { return@mapNotNull null } - - // Get inner div from article - val urlTitle = it.select("div.data") ?: return@mapNotNull null - // Fetch details - val link = fixUrlNull(urlTitle.select("a")?.attr("href")) ?: return@mapNotNull null - val image = it.select("div.poster > img")?.attr("src") - - // Get Title and Year - val titleYear = it.select("div.data.dfeatur") - var name = titleYear?.select("h3")?.text() ?: "" - var year = titleYear?.select("span")?.text()?.toIntOrNull() - - if (name.isEmpty()) { - name = urlTitle.select("h3")?.text() ?: "" - year = titleYear?.select("span")?.text()?.takeLast(4)?.toIntOrNull() - } - // Get year from name - if (year == null) { - val rex = Regex("\\((\\d+)") - year = rex.find(name)?.value?.replace("(", "")?.toIntOrNull() - } - //Get quality - val qual = getQualityFromString(it.selectFirst("span.quality")?.text()) - - MovieSearchResponse( - name = name, - url = link, - apiName = this.name, - TvType.Movie, - posterUrl = image, - year = year, - quality = qual - ) - }?.distinctBy { c -> c.url } ?: listOf() - // Add - all.add( - HomePageList( - title, elements - ) - ) - } - return HomePageResponse(all.filter { a -> a.list.isNotEmpty() }) - } - - override suspend fun search(query: String): List { - val url = "$mainUrl/?s=${query}" - val document = app.get(url).document.selectFirst("div.search-page") - ?.select("div.result-item") - - return document?.mapNotNull { - val inner = it.select("article") ?: return@mapNotNull null - val details = inner.select("div.details") ?: return@mapNotNull null - val link = fixUrlNull(details.select("div.title > a")?.attr("href")) ?: return@mapNotNull null - - val title = details.select("div.title")?.text() ?: "" - val year = details.select("div.meta > span.year")?.text()?.toIntOrNull() - val image = inner.select("div.image > div > a > img")?.attr("src") - val qual = getQualityFromString(it.selectFirst("span.quality")?.text()) - - MovieSearchResponse( - name = title, - url = link, - apiName = this.name, - TvType.Movie, - posterUrl = image, - year = year, - quality = qual - ) - }?.distinctBy { c -> c.url } ?: listOf() - } - - override suspend fun load(url: String): LoadResponse { - val doc = app.get(url).document - val body = doc.getElementsByTag("body") - val inner = body?.select("div.sheader") - // Identify if movie or series - val isTvSeries = doc.select("title")?.text()?.lowercase()?.contains("full episode -") ?: false - - // Video details - val data = inner?.select("div.data") - val poster = inner?.select("div.poster > img")?.attr("src") - val title = data?.select("h1")?.firstOrNull()?.text()?.trim() ?: "" - val descript = body?.select("div#info > div.wp-content p")?.firstOrNull()?.text() - val rex = Regex("\\((\\d+)") - val yearRes = rex.find(title)?.value ?: "" - //Log.i(this.name, "Result => (yearRes) ${yearRes}") - val year = yearRes.replace("(", "").toIntOrNull() - val tags = data?.select("div.sgeneros > a")?.mapNotNull { tag -> - tag?.text()?.trim() ?: return@mapNotNull null - }?.toList() - val recList = body?.select("div#single_relacionados > article")?.mapNotNull { - val a = it.select("a") ?: return@mapNotNull null - val aUrl = a.attr("href") ?: return@mapNotNull null - val aImg = a.select("img")?.attr("src") - val aName = a.select("img")?.attr("alt") ?: return@mapNotNull null - val aYear = try { - aName.trim().takeLast(5).removeSuffix(")").toIntOrNull() - } catch (e: Exception) { null } - - MovieSearchResponse( - url = aUrl, - name = aName, - type = TvType.Movie, - posterUrl = aImg, - year = aYear, - apiName = this.name - ) - } - - // Video links - val playcontainer = body?.select("div#playcontainer") - val listOfLinks: MutableList = mutableListOf() - playcontainer?.select("iframe")?.forEach { item -> - val lnk = item?.attr("src")?.trim() ?: "" - //Log.i(this.name, "Result => (lnk) $lnk") - if (lnk.isNotEmpty()) { - listOfLinks.add(lnk) - } - } - - // Parse episodes if series - if (isTvSeries) { - val episodeList = ArrayList() - val epLinks = playcontainer?.select("div > div > div.source-box") - //Log.i(this.name, "Result => (epList) ${epList}") - body?.select("div#playeroptions > ul > li")?.forEach { ep -> - val epTitle = ep.select("span.title")?.text() - if (!epTitle.isNullOrEmpty()) { - val epNum = epTitle.lowercase().replace("episode", "").trim().toIntOrNull() - //Log.i(this.name, "Result => (epNum) ${epNum}") - val href = when (epNum != null && !epLinks.isNullOrEmpty()) { - true -> epLinks.select("div#source-player-$epNum") - ?.select("iframe")?.attr("src") ?: "" - false -> "" - } - val streamEpLink = listOf(href.trim()).toJson() - //Log.i(this.name, "Result => (streamEpLink $epNum) $streamEpLink") - episodeList.add( - Episode( - name = null, - season = null, - episode = epNum, - data = streamEpLink, - posterUrl = poster, - date = null - ) - ) - } - } - return TvSeriesLoadResponse( - name = title, - url = url, - apiName = this.name, - type = TvType.AsianDrama, - episodes = episodeList, - posterUrl = poster, - year = year, - plot = descript, - tags = tags, - recommendations = recList - ) - } - val streamlinks = listOfLinks.distinct().toJson() - return MovieLoadResponse( - name = title, - url = url, - apiName = this.name, - type = TvType.Movie, - dataUrl = streamlinks, - posterUrl = poster, - year = year, - plot = descript, - tags = tags, - recommendations = recList - ) - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - // parse movie servers - var count = 0 - tryParseJson>(data)?.apmap { link -> - count++ - if (link.contains("fembed.com")) { - val extractor = Diasfem() - extractor.getUrl(data).forEach { - callback.invoke(it) - } - } else { - loadExtractor(link, mainUrl, subtitleCallback, callback) - } - } - return count > 0 - } -} \ No newline at end of file diff --git a/PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviePediaProviderPlugin.kt b/PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviePediaProviderPlugin.kt deleted file mode 100644 index 5d2efde..0000000 --- a/PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviePediaProviderPlugin.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class PinoyMoviePediaProviderPlugin : Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(PinoyMoviePediaProvider()) - registerMainAPI(PinoyMoviesEsProvider()) - registerExtractorAPI(Diasfem()) - registerExtractorAPI(XStreamCdn()) - } -} \ No newline at end of file diff --git a/PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviesEsProvider.kt b/PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviesEsProvider.kt deleted file mode 100644 index f614269..0000000 --- a/PinoyMovies/src/main/kotlin/com/lagradost/PinoyMoviesEsProvider.kt +++ /dev/null @@ -1,251 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.* -//import com.lagradost.cloudstream3.extractors.FEmbed -//import com.lagradost.cloudstream3.extractors.helper.VstreamhubHelper -import com.lagradost.cloudstream3.network.DdosGuardKiller -import com.lagradost.cloudstream3.utils.AppUtils.toJson -import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.loadExtractor -import org.jsoup.select.Elements - -class PinoyMoviesEsProvider : MainAPI() { - override var name = "Pinoy Movies" - override var mainUrl = "https://pinoymovies.es" - override var lang = "tl" - override val supportedTypes = setOf(TvType.AsianDrama) - override val hasDownloadSupport = false - override val hasMainPage = true - override val hasQuickSearch = false - - data class EmbedUrl( - @JsonProperty("embed_url") val embed_url: String, - @JsonProperty("type") val type: String - ) - - private fun getRowElements( - mainbody: Elements, - rows: List>, - sep: String - ): MutableList { - val all = mutableListOf() - for (item in rows) { - val title = item.first - val elements = mainbody.select("div${sep}${item.second} > article")?.mapNotNull { - // Get inner div from article - var urlTitle = it?.select("div.data.dfeatur") - if (urlTitle.isNullOrEmpty()) { - urlTitle = it?.select("div.data") - } - if (urlTitle.isNullOrEmpty()) { - return@mapNotNull null - } - // Fetch details - val link = fixUrlNull(urlTitle.select("a")?.attr("href")) - if (link.isNullOrBlank()) { - return@mapNotNull null - } - - val image = it?.select("div.poster > img")?.attr("data-src") - - // Get Title and Year - val name = urlTitle.select("h3")?.text() - ?: urlTitle.select("h2")?.text() - ?: urlTitle.select("h1")?.text() - if (name.isNullOrBlank()) { - return@mapNotNull null - } - - var year = urlTitle.select("span")?.text()?.toIntOrNull() - - if (year == null) { - // Get year from name - val rex = Regex("\\((\\d+)") - year = rex.find(name)?.value?.replace("(", "")?.toIntOrNull() - } - //Log.i(this.name, "ApiError -> ${it.selectFirst("span.quality")?.text()}") - val searchQual = getQualityFromString(it.selectFirst("span.quality")?.text()) - - MovieSearchResponse( - name = name, - url = link, - apiName = this.name, - type = TvType.Movie, - posterUrl = image, - year = year, - quality = searchQual - ) - }?.distinctBy { c -> c.url } ?: listOf() - //Add to list of homepages - if (!elements.isNullOrEmpty()) { - all.add( - HomePageList( - title, elements - ) - ) - } - } - return all - } - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { - val all = ArrayList() - val document = app.get(mainUrl).document - val mainbody = document.getElementsByTag("body") - if (mainbody != null) { - // All rows will be hardcoded bc of the nature of the site - val homepage1 = getRowElements( - mainbody, listOf( - Pair("Suggestion", "items.featured"), - Pair("All Movies", "items.full") - ), "." - ) - if (homepage1.isNotEmpty()) { - all.addAll(homepage1) - } - //2nd rows - val homepage2 = getRowElements( - mainbody, listOf( - Pair("Action", "genre_action"), - Pair("Comedy", "genre_comedy"), - Pair("Romance", "genre_romance"), - Pair("Horror", "genre_horror") - //Pair("Rated-R", "genre_rated-r") - ), "#" - ) - if (homepage2.isNotEmpty()) { - all.addAll(homepage2) - } - } - return HomePageResponse(all) - } - - override suspend fun search(query: String): List { - val url = "$mainUrl/?s=${query.replace(" ", "+")}" - val document = app.get(url, interceptor = DdosGuardKiller(true)) - .document.select("div#archive-content > article") - - return document?.mapNotNull { - // Fetch details - val urlTitle = it?.select("div.data") ?: return@mapNotNull null - val link = urlTitle.select("a")?.attr("href") ?: return@mapNotNull null - val title = urlTitle.text()?.trim() ?: "" - val year = urlTitle.select("span.year")?.text()?.toIntOrNull() - val image = it.select("div.poster > img")?.attr("src") - val searchQual = getQualityFromString(it.selectFirst("span.quality")?.text()) - - MovieSearchResponse( - name = title, - url = link, - apiName = this.name, - type = TvType.Movie, - posterUrl = image, - year = year, - quality = searchQual - ) - }?.distinctBy { it.url } ?: listOf() - } - - override suspend fun load(url: String): LoadResponse { - val doc = app.get(url).document - val body = doc.getElementsByTag("body") - val inner = body?.select("div.sheader") - - // Video details - val data = inner?.select("div.sheader > div.data") - val title = data?.select("h1")?.firstOrNull()?.text() ?: "" - val year = data?.select("span.date")?.text()?.takeLast(4)?.toIntOrNull() - - val descript = body?.select("div#info > div.wp-content")?.text() - val poster = body?.select("div.poster > img")?.attr("src") - val tags = data?.select("div.sgeneros > a")?.mapNotNull { tag -> - tag?.text() ?: return@mapNotNull null - }?.toList() - val recList = body?.select("div#single_relacionados > article")?.mapNotNull { - val a = it.select("a") ?: return@mapNotNull null - val aUrl = a.attr("href") ?: return@mapNotNull null - val aImg = a.select("img")?.attr("data-src") - val aName = a.select("img")?.attr("alt") ?: return@mapNotNull null - val aYear = try { - aName.trim().takeLast(5).removeSuffix(")").toIntOrNull() - } catch (e: Exception) { - null - } - MovieSearchResponse( - url = aUrl, - name = aName, - type = TvType.Movie, - posterUrl = aImg, - year = aYear, - apiName = this.name - ) - } - - // Video links - val listOfLinks: MutableList = mutableListOf() - val postlist = body?.select("div#playeroptions > ul > li")?.mapNotNull { - it?.attr("data-post") ?: return@mapNotNull null - }?.filter { it.isNotBlank() }?.distinct() ?: listOf() - - postlist.apmap { datapost -> - //Log.i(this.name, "Result => (datapost) ${datapost}") - val content = mapOf( - Pair("action", "doo_player_ajax"), - Pair("post", datapost), - Pair("nume", "1"), - Pair("type", "movie") - ) - val innerPage = app.post( - "https://pinoymovies.es/wp-admin/admin-ajax.php ", - referer = url, data = content - ).document.select("body")?.text()?.trim() - if (!innerPage.isNullOrBlank()) { - tryParseJson(innerPage)?.let { - listOfLinks.add(it.embed_url) - } - } - } - return MovieLoadResponse( - name = title, - url = url, - apiName = this.name, - type = TvType.Movie, - dataUrl = listOfLinks.toJson(), - posterUrl = poster, - year = year, - plot = descript, - tags = tags, - recommendations = recList - ) - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - // parse movie servers - var count = 0 - tryParseJson>(data)?.forEach { link -> - //Log.i(this.name, "Result => (link) $link") - if (link.startsWith("https://vstreamhub.com")) { - VstreamhubHelper.getUrls(link, subtitleCallback, callback) - count++ - } else if (link.contains("fembed.com")) { - val extractor = Diasfem() - extractor.getUrl(data).forEach { - callback.invoke(it) - count++ - } - } else { - if (loadExtractor(link, mainUrl, subtitleCallback, callback)) { - count++ - } - } - } - return count > 0 - } -} diff --git a/PinoyMovies/src/main/kotlin/com/lagradost/VstreamhubHelper.kt b/PinoyMovies/src/main/kotlin/com/lagradost/VstreamhubHelper.kt deleted file mode 100644 index e9cf8a5..0000000 --- a/PinoyMovies/src/main/kotlin/com/lagradost/VstreamhubHelper.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.SubtitleFile -import com.lagradost.cloudstream3.app -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.Qualities -import com.lagradost.cloudstream3.utils.loadExtractor - -class VstreamhubHelper { - companion object { - private val baseUrl: String = "https://vstreamhub.com" - private val baseName: String = "Vstreamhub" - - suspend fun getUrls( - url: String, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ) { - if (url.startsWith(baseUrl)) { - // Fetch links - val doc = app.get(url).document.select("script") - doc?.forEach { - val innerText = it?.toString() - if (!innerText.isNullOrEmpty()) { - if (innerText.contains("file:")) { - val startString = "file: " - val aa = innerText.substring(innerText.indexOf(startString)) - val linkUrl = - aa.substring(startString.length + 1, aa.indexOf("\",")).trim() - //Log.i(baseName, "Result => (linkUrl) ${linkUrl}") - val exlink = ExtractorLink( - name = "$baseName m3u8", - source = baseName, - url = linkUrl, - quality = Qualities.Unknown.value, - referer = url, - isM3u8 = true - ) - callback.invoke(exlink) - } - if (innerText.contains("playerInstance")) { - val aa = - innerText.substring(innerText.indexOf("playerInstance.addButton")) - val startString = "window.open([" - val bb = aa.substring(aa.indexOf(startString)) - val datavid = bb.substring(startString.length, bb.indexOf("]")) - .removeSurrounding("\"") - if (datavid.isNotBlank()) { - loadExtractor(datavid, url, subtitleCallback, callback) - //Log.i(baseName, "Result => (datavid) ${datavid}") - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/PinoyMovies/src/main/kotlin/com/lagradost/XStreamCdn.kt b/PinoyMovies/src/main/kotlin/com/lagradost/XStreamCdn.kt deleted file mode 100644 index 2abc2e3..0000000 --- a/PinoyMovies/src/main/kotlin/com/lagradost/XStreamCdn.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.app -import com.lagradost.cloudstream3.utils.AppUtils -import com.lagradost.cloudstream3.utils.ExtractorApi -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.getQualityFromName - -class Diasfem: XStreamCdn() { - override val name: String = "Diasfem" - override val mainUrl: String = "https://diasfem.com" - override var domainUrl: String = "diasfem.com" -} - -open class XStreamCdn : ExtractorApi() { - override val name: String = "XStreamCdn" - override val mainUrl: String = "https://embedsito.com" - override val requiresReferer = false - open var domainUrl: String = "embedsito.com" - - private data class ResponseData( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String, - //val type: String // Mp4 - ) - - private data class ResponseJson( - @JsonProperty("success") val success: Boolean, - @JsonProperty("data") val data: List? - ) - - override fun getExtractorUrl(id: String): String { - return "$domainUrl/api/source/$id" - } - - override suspend fun getUrl(url: String, referer: String?): List { - val headers = mapOf( - "Referer" to url, - "User-Agent" to "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0", - ) - val id = url.trimEnd('/').split("/").last() - val newUrl = "https://${domainUrl}/api/source/${id}" - val extractedLinksList: MutableList = mutableListOf() - with(app.post(newUrl, headers = headers)) { - if (this.code != 200) return listOf() - val text = this.text - if (text.isEmpty()) return listOf() - if (text == """{"success":false,"data":"Video not found or has been removed"}""") return listOf() - AppUtils.parseJson(text)?.let { - if (it.success && it.data != null) { - it.data.forEach { data -> - extractedLinksList.add( - ExtractorLink( - name, - name = name, - data.file, - url, - getQualityFromName(data.label), - ) - ) - } - } - } - } - return extractedLinksList - } -} \ No newline at end of file diff --git a/RebahinProvider/build.gradle.kts b/RebahinProvider/build.gradle.kts deleted file mode 100644 index c6caa9c..0000000 --- a/RebahinProvider/build.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AsianDrama", - "Anime", - "TvSeries", - "Movie", - ) - - - iconUrl = "https://www.google.com/s2/favicons?domain=104.237.198.194&sz=24" -} \ No newline at end of file diff --git a/RebahinProvider/src/main/AndroidManifest.xml b/RebahinProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/RebahinProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/RebahinProvider/src/main/kotlin/com/lagradost/RebahinProvider.kt b/RebahinProvider/src/main/kotlin/com/lagradost/RebahinProvider.kt deleted file mode 100644 index 7aab55d..0000000 --- a/RebahinProvider/src/main/kotlin/com/lagradost/RebahinProvider.kt +++ /dev/null @@ -1,324 +0,0 @@ -package com.lagradost - -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.logError -import com.lagradost.cloudstream3.mvvm.safeApiCall -import com.lagradost.cloudstream3.network.WebViewResolver -import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.getQualityFromName -import com.lagradost.cloudstream3.utils.loadExtractor -import org.jsoup.nodes.Element -import java.net.URI - -class RebahinProvider : MainAPI() { - override var mainUrl = "http://104.237.198.194" - override var name = "Rebahin" - override val hasMainPage = true - override var lang = "id" - override val hasDownloadSupport = true - override val supportedTypes = setOf( - TvType.Movie, - TvType.TvSeries, - TvType.Anime, - TvType.AsianDrama - ) - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { - val urls = listOf( - Pair("Featured", "xtab1"), - Pair("Film Terbaru", "xtab2"), - Pair("Romance", "xtab3"), - Pair("Drama", "xtab4"), - Pair("Action", "xtab5"), - Pair("Scifi", "xtab6"), - Pair("Tv Series Terbaru", "stab1"), - Pair("Anime Series", "stab2"), - Pair("Drakor Series", "stab3"), - Pair("West Series", "stab4"), - Pair("China Series", "stab5"), - Pair("Japan Series", "stab6"), - ) - - val items = ArrayList() - - for ((header, tab) in urls) { - try { - val home = - app.get("$mainUrl/wp-content/themes/indoxxi/ajax-top-$tab.php").document.select( - "div.ml-item" - ).map { - it.toSearchResult() - } - items.add(HomePageList(header, home)) - } catch (e: Exception) { - logError(e) - } - } - - if (items.size <= 0) throw ErrorLoadingException() - return HomePageResponse(items) - } - - private fun Element.toSearchResult(): SearchResponse { - val title = this.selectFirst("span.mli-info > h2")!!.text().trim() - val href = this.selectFirst("a")!!.attr("href") - val type = - if (this.select("span.mli-quality").isNotEmpty()) TvType.Movie else TvType.TvSeries - return if (type == TvType.Movie) { - val posterUrl = this.select("img").attr("src") - val quality = getQualityFromString(this.select("span.mli-quality").text().trim()) - newMovieSearchResponse(title, href, TvType.Movie) { - this.posterUrl = posterUrl - this.quality = quality - } - } else { - val posterUrl = - this.select("img").attr("src").ifEmpty { this.select("img").attr("data-original") } - val episode = - this.select("div.mli-eps > span").text().replace(Regex("[^0-9]"), "").toIntOrNull() - newAnimeSearchResponse(title, href, TvType.TvSeries) { - this.posterUrl = posterUrl - addSub(episode) - } - } - } - - override suspend fun search(query: String): List { - val link = "$mainUrl/?s=$query" - val document = app.get(link).document - - return document.select("div.ml-item").map { - it.toSearchResult() - } - } - - override suspend fun load(url: String): LoadResponse { - val document = app.get(url).document - - val title = document.selectFirst("h3[itemprop=name]")!!.ownText().trim() - val poster = document.select(".mvic-desc > div.thumb.mvic-thumb").attr("style") - .substringAfter("url(").substringBeforeLast(")") - val tags = document.select("span[itemprop=genre]").map { it.text() } - - val year = Regex("([0-9]{4}?)-").find( - document.selectFirst(".mvici-right > p:nth-child(3)")!!.ownText().trim() - )?.groupValues?.get(1).toString().toIntOrNull() - val tvType = if (url.contains("/series/")) TvType.TvSeries else TvType.Movie - val description = document.select("span[itemprop=reviewBody] > p").text().trim() - val trailer = fixUrlNull(document.selectFirst("div.modal-body-trailer iframe")?.attr("src")) - val rating = document.selectFirst("span[itemprop=ratingValue]")?.text()?.toRatingInt() - val duration = document.selectFirst(".mvici-right > p:nth-child(1)")!! - .ownText().replace(Regex("[^0-9]"), "").toIntOrNull() - val actors = document.select("span[itemprop=actor] > a").map { it.select("span").text() } - - val baseLink = fixUrl(document.select("div#mv-info > a").attr("href").toString()) - - return if (tvType == TvType.TvSeries) { - val episodes = app.get(baseLink).document.select("div#list-eps > a").map { - Pair(it.text(), it.attr("data-iframe")) - }.groupBy { it.first }.map { eps -> - Episode( - data = eps.value.map { fixUrl(base64Decode(it.second)) }.toString(), - name = eps.key, - episode = eps.key.filter { it.isDigit() }.toIntOrNull() - ) - - } - newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) { - this.posterUrl = poster - this.year = year - this.plot = description - this.tags = tags - this.rating = rating - this.duration = duration - addActors(actors) - addTrailer(trailer) - } - } else { - val links = - app.get(baseLink).document.select("div#server-list div.server-wrapper div[id*=episode]") - .map { - fixUrl(base64Decode(it.attr("data-iframe"))) - }.toString() - newMovieLoadResponse(title, url, TvType.Movie, links) { - this.posterUrl = poster - this.year = year - this.plot = description - this.tags = tags - this.rating = rating - this.duration = duration - addActors(actors) - addTrailer(trailer) - } - } - } - - private suspend fun invokeLokalSource( - url: String, - name: String, - ref: String, - subCallback: (SubtitleFile) -> Unit, - sourceCallback: (ExtractorLink) -> Unit - ) { - val document = app.get( - url, - allowRedirects = false, - referer = mainUrl, - headers = mapOf("Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8") - ).document - - document.select("script").map { script -> - if (script.data().contains("sources: [")) { - val source = tryParseJson( - script.data().substringAfter("sources: [").substringBefore("],") - ) - val m3uData = app.get(source!!.file, referer = ref).text - val quality = Regex("\\d{3,4}\\.m3u8").findAll(m3uData).map { it.value }.toList() - - quality.forEach { - sourceCallback.invoke( - ExtractorLink( - source = name, - name = name, - url = source.file.replace("video.m3u8", it), - referer = ref, - quality = getQualityFromName("${it.replace(".m3u8", "")}p"), - isM3u8 = true - ) - ) - } - - val trackJson = script.data().substringAfter("tracks: [").substringBefore("],") - val track = tryParseJson>("[$trackJson]") - track?.map { - subCallback.invoke( - SubtitleFile( - "Indonesian", - (if (it.file.contains(".srt")) it.file else null)!! - ) - ) - } - } - } - } - - private suspend fun invokeKotakAjairSource( - url: String, - subCallback: (SubtitleFile) -> Unit, - sourceCallback: (ExtractorLink) -> Unit - ) { - val domainUrl = "https://kotakajair.xyz" - val id = url.trimEnd('/').split("/").last() - val sources = app.post( - url = "$domainUrl/api/source/$id", - data = mapOf("r" to mainUrl, "d" to URI(url).host) - ).parsed() - - sources.data?.map { - sourceCallback.invoke( - ExtractorLink( - name, - "KotakAjair", - fixUrl(it.file), - referer = url, - quality = getQualityFromName(it.label) - ) - ) - } - val userData = sources.player.poster_file.split("/")[2] - sources.captions?.map { - subCallback.invoke( - SubtitleFile( - if (it.language.lowercase().contains("eng")) it.language else "Indonesian", - "$domainUrl/asset/userdata/$userData/caption/${it.hash}/${it.id}.srt" - ) - ) - } - - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - - data.removeSurrounding("[", "]").split(",").map { it.trim() }.apmap { link -> - safeApiCall { - when { - link.startsWith("http://172.96.161.72") -> invokeLokalSource( - link, - this.name, - "http://172.96.161.72/", - subtitleCallback, - callback - ) - link.startsWith("https://kotakajair.xyz") -> invokeKotakAjairSource( - link, - subtitleCallback, - callback - ) - else -> { - loadExtractor(link, "$mainUrl/", subtitleCallback, callback) - if (link.startsWith("https://sbfull.com")) { - val response = app.get( - link, interceptor = WebViewResolver( - Regex("""\.srt""") - ) - ) - subtitleCallback.invoke( - SubtitleFile( - "Indonesian", - response.url - ) - ) - } - } - } - } - } - - return true - } - - private data class ResponseLocal( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String, - @JsonProperty("type") val type: String? - ) - - private data class Tracks( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String?, - @JsonProperty("kind") val kind: String? - ) - - private data class Captions( - @JsonProperty("id") val id: String, - @JsonProperty("hash") val hash: String, - @JsonProperty("language") val language: String, - ) - - private data class Data( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String, - ) - - private data class Player( - @JsonProperty("poster_file") val poster_file: String, - ) - - private data class ResponseKotakAjair( - @JsonProperty("success") val success: Boolean, - @JsonProperty("player") val player: Player, - @JsonProperty("data") val data: List?, - @JsonProperty("captions") val captions: List? - ) - -} - diff --git a/RebahinProvider/src/main/kotlin/com/lagradost/RebahinProviderPlugin.kt b/RebahinProvider/src/main/kotlin/com/lagradost/RebahinProviderPlugin.kt deleted file mode 100644 index 6fe23e9..0000000 --- a/RebahinProvider/src/main/kotlin/com/lagradost/RebahinProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class RebahinProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(RebahinProvider()) - } -} \ No newline at end of file diff --git a/SflixProvider/build.gradle.kts b/SflixProvider/build.gradle.kts index a36cc5d..6893230 100644 --- a/SflixProvider/build.gradle.kts +++ b/SflixProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 2 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them description = "Also includes Dopebox, Solarmovie, Zoro and 2embed" diff --git a/SoaptwoDayProvider/build.gradle.kts b/SoaptwoDayProvider/build.gradle.kts index abcbcfe..8f7834f 100644 --- a/SoaptwoDayProvider/build.gradle.kts +++ b/SoaptwoDayProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/SuperStream/build.gradle.kts b/SuperStream/build.gradle.kts index 5593518..6beb9c1 100644 --- a/SuperStream/build.gradle.kts +++ b/SuperStream/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/TenshiProvider/build.gradle.kts b/TenshiProvider/build.gradle.kts index d958ae3..99cf589 100644 --- a/TenshiProvider/build.gradle.kts +++ b/TenshiProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/TheFlixToProvider/build.gradle.kts b/TheFlixToProvider/build.gradle.kts index defd7e1..9905d5b 100644 --- a/TheFlixToProvider/build.gradle.kts +++ b/TheFlixToProvider/build.gradle.kts @@ -3,6 +3,7 @@ version = 1 cloudstream { + language = "en" // All of these properties are optional, you can safely remove them // description = "Lorem Ipsum" diff --git a/TocanimeProvider/build.gradle.kts b/TocanimeProvider/build.gradle.kts deleted file mode 100644 index 9de3b4a..0000000 --- a/TocanimeProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "AnimeMovie", - "Anime", - "OVA", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=tocanime.co&sz=24" -} \ No newline at end of file diff --git a/TocanimeProvider/src/main/AndroidManifest.xml b/TocanimeProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/TocanimeProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/TocanimeProvider/src/main/kotlin/com/lagradost/TocanimeProvider.kt b/TocanimeProvider/src/main/kotlin/com/lagradost/TocanimeProvider.kt deleted file mode 100644 index bc67cba..0000000 --- a/TocanimeProvider/src/main/kotlin/com/lagradost/TocanimeProvider.kt +++ /dev/null @@ -1,178 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.Qualities -import org.jsoup.nodes.Element -import java.util.* - -class TocanimeProvider : MainAPI() { - override var mainUrl = "https://tocanime.co" - override var name = "Tocanime" - override val hasMainPage = true - override var lang = "vi" - override val hasDownloadSupport = true - - override val supportedTypes = setOf( - TvType.Anime, - TvType.AnimeMovie, - TvType.OVA - ) - - companion object { - fun getType(t: String): TvType { - return when { - t.contains("OVA") || t.contains("Special") -> TvType.OVA - t.contains("Movie") -> TvType.AnimeMovie - else -> TvType.Anime - } - } - - fun getStatus(t: String): ShowStatus { - return when (t) { - "Đã hoàn thành" -> ShowStatus.Completed - "Chưa hoàn thành" -> ShowStatus.Ongoing - else -> ShowStatus.Completed - } - } - } - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { - val document = app.get(mainUrl).document - - val homePageList = ArrayList() - - document.select("div#playlists > div").forEach { block -> - val header = block.selectFirst("h2")?.text()?.trim() ?: "" - val items = block.select("div.col-lg-3.col-md-4.col-6").map { - it.toSearchResult() - } - if (items.isNotEmpty()) homePageList.add(HomePageList(header, items)) - } - - return HomePageResponse(homePageList) - } - - private fun Element.toSearchResult(): AnimeSearchResponse { - val title = this.selectFirst("h3 a")?.text()?.trim() ?: "" - val href = fixUrl(this.selectFirst("h3 a")!!.attr("href")) - val posterUrl = fixUrlNull(this.selectFirst("div.card-item-img")?.attr("data-original")) - val epNum = this.selectFirst("div.card-item-badget.rtl")?.text()?.let { eps -> - val num = eps.filter { it.isDigit() }.toIntOrNull() - if(eps.contains("Preview")) { - num?.minus(1) - } else { - num - } - } - return newAnimeSearchResponse(title, href, TvType.Anime) { - this.posterUrl = posterUrl - addSub(epNum) - } - - } - - override suspend fun search(query: String): List { - val document = app.get("$mainUrl/content/search?t=kw&q=$query").document - - return document.select("div.col-lg-3.col-md-4.col-6").map { - it.toSearchResult() - } - - } - - override suspend fun load(url: String): LoadResponse? { - val document = app.get(url).document - - val title = document.selectFirst("h1.title")?.text() ?: return null - val type = - if (document.select("div.me-list.scroller a").size == 1) TvType.AnimeMovie else TvType.Anime - val episodes = document.select("div.me-list.scroller a").mapNotNull { - Episode(fixUrl(it.attr("href")), it.text()) - }.reversed() - val trailer = - document.selectFirst("div#trailer script")?.data()?.substringAfter("