From b909d89792757f64f77f2fe3d04a2092c561f31f Mon Sep 17 00:00:00 2001 From: yoyzo <122361785+yoyzo@users.noreply.github.com> Date: Tue, 10 Jan 2023 14:42:08 +0300 Subject: [PATCH] Build 649a4deb278a18aa079f1b569f693a1b661f2594 --- .github/workflows/build.yml | 60 ++++ .gitignore | 12 + AkwamProvider.cs3 | Bin 0 -> 13712 bytes AkwamProvider/build.gradle.kts | 14 + AkwamProvider/src/main/AndroidManifest.xml | 2 + .../src/main/kotlin/com/akwam/AkwamPlugin.kt | 11 + .../main/kotlin/com/akwam/AkwamProvider.kt | 225 ++++++++++++ Anime4upPack.cs3 | Bin 0 -> 15389 bytes Anime4upPack/build.gradle.kts | 14 + Anime4upPack/src/main/AndroidManifest.xml | 2 + .../kotlin/com/anime4up/Anime4upPlugin.kt | 13 + .../kotlin/com/anime4up/Anime4upProvider.kt | 167 +++++++++ AnimeBlkomProvider.cs3 | Bin 0 -> 13332 bytes AnimeBlkomProvider/build.gradle.kts | 14 + .../src/main/AndroidManifest.xml | 2 + .../kotlin/com/animeblkom/AnimeBlkomPlugin.kt | 11 + .../com/animeblkom/AnimeBlkomProvider.kt | 164 +++++++++ AnimeiatProvider.cs3 | Bin 0 -> 20627 bytes AnimeiatProvider/build.gradle.kts | 14 + AnimeiatProvider/src/main/AndroidManifest.xml | 2 + .../kotlin/com/animeiat/AnimeiatPlugin.kt | 11 + .../kotlin/com/animeiat/AnimeiatProvider.kt | 172 +++++++++ ArabSeedProvider.cs3 | Bin 0 -> 16392 bytes ArabSeedProvider/build.gradle.kts | 14 + ArabSeedProvider/src/main/AndroidManifest.xml | 2 + .../kotlin/com/arabseed/ArabSeedPlugin.kt | 11 + .../kotlin/com/arabseed/ArabSeedProvider.kt | 217 ++++++++++++ CimaNowProvider.cs3 | Bin 0 -> 14700 bytes CimaNowProvider/build.gradle.kts | 14 + CimaNowProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/cimanow/CimaNowPlugin.kt | 11 + .../kotlin/com/cimanow/CimaNowProvider.kt | 164 +++++++++ EgyBestProvider/build.gradle.kts | 14 + EgyBestProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/egybest/EgyBestPlugin.kt | 11 + .../kotlin/com/egybest/EgyBestProvider.kt | 275 +++++++++++++++ EgyDeadProvider.cs3 | Bin 0 -> 13531 bytes EgyDeadProvider/build.gradle.kts | 14 + EgyDeadProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/egydead/EgyDeadPlugin.kt | 11 + .../kotlin/com/egydead/EgyDeadProvider.kt | 180 ++++++++++ Extractors.cs3 | Bin 0 -> 19922 bytes FajerShowProvider.cs3 | Bin 0 -> 16944 bytes FajerShowProvider/build.gradle.kts | 14 + .../src/main/AndroidManifest.xml | 2 + .../kotlin/com/fajershow/FajerShowPlugin.kt | 11 + .../kotlin/com/fajershow/FajerShowProvider.kt | 247 +++++++++++++ FaselHDProvider.cs3 | Bin 0 -> 15953 bytes FaselHDProvider/build.gradle.kts | 14 + FaselHDProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/faselhd/FaselHDPlugin.kt | 11 + .../kotlin/com/faselhd/FaselHDProvider.kt | 203 +++++++++++ FushaarProvider.cs3 | Bin 0 -> 11561 bytes FushaarProvider/build.gradle.kts | 12 + FushaarProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/fushaar/FushaarPlugin.kt | 11 + .../kotlin/com/fushaar/FushaarProvider.kt | 137 ++++++++ GateAnimeProvider.cs3 | Bin 0 -> 11621 bytes GateAnimeProvider/build.gradle.kts | 14 + .../src/main/AndroidManifest.xml | 2 + .../kotlin/com/gateanime/GateAnimePlugin.kt | 11 + .../kotlin/com/gateanime/GateAnimeProvider.kt | 139 ++++++++ MovizlandProvider.cs3 | Bin 0 -> 18060 bytes MovizlandProvider/build.gradle.kts | 14 + .../src/main/AndroidManifest.xml | 2 + .../kotlin/com/movizland/MovizlandPlugin.kt | 11 + .../kotlin/com/movizland/MovizlandProvider.kt | 223 ++++++++++++ MyCimaProvider.cs3 | Bin 0 -> 19536 bytes MyCimaProvider/build.gradle.kts | 14 + MyCimaProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/mycima/MyCimaPlugin.kt | 11 + .../main/kotlin/com/mycima/MyCimaProvider.kt | 327 ++++++++++++++++++ Shahid4uProvider.cs3 | Bin 0 -> 15333 bytes Shahid4uProvider/build.gradle.kts | 14 + Shahid4uProvider/src/main/AndroidManifest.xml | 2 + .../kotlin/com/shahid4u/JWPlayerExtractor.kt | 67 ++++ .../kotlin/com/shahid4u/Shahid4uPlugin.kt | 14 + .../kotlin/com/shahid4u/Shahid4uProvider.kt | 177 ++++++++++ build.gradle.kts | 87 +++++ gradle.properties | 19 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++ gradlew.bat | 84 +++++ plugins.json | 302 ++++++++++++++++ repo.json | 8 + settings.gradle.kts | 13 + 87 files changed, 4255 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 AkwamProvider.cs3 create mode 100644 AkwamProvider/build.gradle.kts create mode 100644 AkwamProvider/src/main/AndroidManifest.xml create mode 100644 AkwamProvider/src/main/kotlin/com/akwam/AkwamPlugin.kt create mode 100644 AkwamProvider/src/main/kotlin/com/akwam/AkwamProvider.kt create mode 100644 Anime4upPack.cs3 create mode 100644 Anime4upPack/build.gradle.kts create mode 100644 Anime4upPack/src/main/AndroidManifest.xml create mode 100644 Anime4upPack/src/main/kotlin/com/anime4up/Anime4upPlugin.kt create mode 100644 Anime4upPack/src/main/kotlin/com/anime4up/Anime4upProvider.kt create mode 100644 AnimeBlkomProvider.cs3 create mode 100644 AnimeBlkomProvider/build.gradle.kts create mode 100644 AnimeBlkomProvider/src/main/AndroidManifest.xml create mode 100644 AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomPlugin.kt create mode 100644 AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomProvider.kt create mode 100644 AnimeiatProvider.cs3 create mode 100644 AnimeiatProvider/build.gradle.kts create mode 100644 AnimeiatProvider/src/main/AndroidManifest.xml create mode 100644 AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatPlugin.kt create mode 100644 AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatProvider.kt create mode 100644 ArabSeedProvider.cs3 create mode 100644 ArabSeedProvider/build.gradle.kts create mode 100644 ArabSeedProvider/src/main/AndroidManifest.xml create mode 100644 ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedPlugin.kt create mode 100644 ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedProvider.kt create mode 100644 CimaNowProvider.cs3 create mode 100644 CimaNowProvider/build.gradle.kts create mode 100644 CimaNowProvider/src/main/AndroidManifest.xml create mode 100644 CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowPlugin.kt create mode 100644 CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowProvider.kt create mode 100644 EgyBestProvider/build.gradle.kts create mode 100644 EgyBestProvider/src/main/AndroidManifest.xml create mode 100644 EgyBestProvider/src/main/kotlin/com/egybest/EgyBestPlugin.kt create mode 100644 EgyBestProvider/src/main/kotlin/com/egybest/EgyBestProvider.kt create mode 100644 EgyDeadProvider.cs3 create mode 100644 EgyDeadProvider/build.gradle.kts create mode 100644 EgyDeadProvider/src/main/AndroidManifest.xml create mode 100644 EgyDeadProvider/src/main/kotlin/com/egydead/EgyDeadPlugin.kt create mode 100644 EgyDeadProvider/src/main/kotlin/com/egydead/EgyDeadProvider.kt create mode 100644 Extractors.cs3 create mode 100644 FajerShowProvider.cs3 create mode 100644 FajerShowProvider/build.gradle.kts create mode 100644 FajerShowProvider/src/main/AndroidManifest.xml create mode 100644 FajerShowProvider/src/main/kotlin/com/fajershow/FajerShowPlugin.kt create mode 100644 FajerShowProvider/src/main/kotlin/com/fajershow/FajerShowProvider.kt create mode 100644 FaselHDProvider.cs3 create mode 100644 FaselHDProvider/build.gradle.kts create mode 100644 FaselHDProvider/src/main/AndroidManifest.xml create mode 100644 FaselHDProvider/src/main/kotlin/com/faselhd/FaselHDPlugin.kt create mode 100644 FaselHDProvider/src/main/kotlin/com/faselhd/FaselHDProvider.kt create mode 100644 FushaarProvider.cs3 create mode 100644 FushaarProvider/build.gradle.kts create mode 100644 FushaarProvider/src/main/AndroidManifest.xml create mode 100644 FushaarProvider/src/main/kotlin/com/fushaar/FushaarPlugin.kt create mode 100644 FushaarProvider/src/main/kotlin/com/fushaar/FushaarProvider.kt create mode 100644 GateAnimeProvider.cs3 create mode 100644 GateAnimeProvider/build.gradle.kts create mode 100644 GateAnimeProvider/src/main/AndroidManifest.xml create mode 100644 GateAnimeProvider/src/main/kotlin/com/gateanime/GateAnimePlugin.kt create mode 100644 GateAnimeProvider/src/main/kotlin/com/gateanime/GateAnimeProvider.kt create mode 100644 MovizlandProvider.cs3 create mode 100644 MovizlandProvider/build.gradle.kts create mode 100644 MovizlandProvider/src/main/AndroidManifest.xml create mode 100644 MovizlandProvider/src/main/kotlin/com/movizland/MovizlandPlugin.kt create mode 100644 MovizlandProvider/src/main/kotlin/com/movizland/MovizlandProvider.kt create mode 100644 MyCimaProvider.cs3 create mode 100644 MyCimaProvider/build.gradle.kts create mode 100644 MyCimaProvider/src/main/AndroidManifest.xml create mode 100644 MyCimaProvider/src/main/kotlin/com/mycima/MyCimaPlugin.kt create mode 100644 MyCimaProvider/src/main/kotlin/com/mycima/MyCimaProvider.kt create mode 100644 Shahid4uProvider.cs3 create mode 100644 Shahid4uProvider/build.gradle.kts create mode 100644 Shahid4uProvider/src/main/AndroidManifest.xml create mode 100644 Shahid4uProvider/src/main/kotlin/com/shahid4u/JWPlayerExtractor.kt create mode 100644 Shahid4uProvider/src/main/kotlin/com/shahid4u/Shahid4uPlugin.kt create mode 100644 Shahid4uProvider/src/main/kotlin/com/shahid4u/Shahid4uProvider.kt create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 plugins.json create mode 100644 repo.json create mode 100644 settings.gradle.kts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..38a09a3 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,60 @@ +name: Build + +# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#concurrency +concurrency: + group: "build" + cancel-in-progress: true + +on: + push: + branches: + # choose your default branch + - master + # - main + paths-ignore: + - '*.md' + - '*.html' + - '*.js' + - '*.css' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@master + with: + path: "src" + + - name: Checkout builds + uses: actions/checkout@master + with: + ref: "builds" + path: "builds" + + - name: Clean old builds + run: rm $GITHUB_WORKSPACE/builds/*.cs3 || true + + - name: Setup JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + + - name: Setup Android SDK + uses: android-actions/setup-android@v2 + + - name: Build Plugins + run: | + cd $GITHUB_WORKSPACE/src + chmod +x gradlew + ./gradlew make makePluginsJson + cp **/build/*.cs3 $GITHUB_WORKSPACE/builds + cp build/plugins.json $GITHUB_WORKSPACE/builds + - name: Push builds + run: | + cd $GITHUB_WORKSPACE/builds + git config --local user.email "actions@github.com" + git config --local user.name "GitHub Actions" + git add . + git commit --amend -m "Build $GITHUB_SHA" || exit 0 # do not error if nothing to commit + git push --force diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..41fd579 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +*.iml +.gradle +/local.properties +/.idea +.DS_Store +/build +**/build +/captures +.externalNativeBuild +.cxx +local.properties +.vscode \ No newline at end of file diff --git a/AkwamProvider.cs3 b/AkwamProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..5e573a607949185800357326ad9e199e2e19e356 GIT binary patch literal 13712 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 + \ No newline at end of file diff --git a/AkwamProvider/src/main/kotlin/com/akwam/AkwamPlugin.kt b/AkwamProvider/src/main/kotlin/com/akwam/AkwamPlugin.kt new file mode 100644 index 0000000..4e8b42e --- /dev/null +++ b/AkwamProvider/src/main/kotlin/com/akwam/AkwamPlugin.kt @@ -0,0 +1,11 @@ +package com.akwam +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class AkwamPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(Akwam()) + } +} \ No newline at end of file diff --git a/AkwamProvider/src/main/kotlin/com/akwam/AkwamProvider.kt b/AkwamProvider/src/main/kotlin/com/akwam/AkwamProvider.kt new file mode 100644 index 0000000..6c2b2a7 --- /dev/null +++ b/AkwamProvider/src/main/kotlin/com/akwam/AkwamProvider.kt @@ -0,0 +1,225 @@ +package com.akwam + + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addActors +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities +import org.jsoup.nodes.Element + +class Akwam : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://akwam.to" + override var name = "Akwam" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie, TvType.Anime, TvType.Cartoon) + + private fun Element.toSearchResponse(): SearchResponse? { + val url = select("a.box").attr("href") ?: return null + if (url.contains("/games/") || url.contains("/programs/")) return null + val poster = select("picture > img") + val title = poster.attr("alt") + val posterUrl = poster.attr("data-src") + val year = select(".badge-secondary").text().toIntOrNull() + + // If you need to differentiate use the url. + return MovieSearchResponse( + title, + url, + this@Akwam.name, + TvType.TvSeries, + posterUrl, + year, + null, + ) + } + override val mainPage = mainPageOf( + "$mainUrl/movies?page=" to "Movies", + "$mainUrl/series?page=" to "Series", + "$mainUrl/shows?page=" to "Shows" + ) + + override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { + val doc = app.get(request.data + page).document + val list = doc.select("div.col-lg-auto.col-md-4.col-6.mb-12").mapNotNull { element -> + element.toSearchResponse() + } + return newHomePageResponse(request.name, list) + } + + override suspend fun search(query: String): List { + val url = "$mainUrl/search?q=$query" + val doc = app.get(url).document + return doc.select("div.col-lg-auto").mapNotNull { + it.toSearchResponse() + } + } + + private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + private fun Element.toEpisode(): Episode { + val a = select("a.text-white") + val url = a.attr("href") + val title = a.text() + val thumbUrl = select("picture > img").attr("src") + val date = select("p.entry-date").text() + return newEpisode(url) { + name = title + episode = title.getIntFromText() + posterUrl = thumbUrl + addDate(date) + } + } + + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + val mesEl = doc.select("#downloads > h2 > span").isNotEmpty() + val mesSt = if(mesEl) true else false + val isMovie = mesSt//url.contains("/movie/") + val title = doc.select("h1.entry-title").text() + val posterUrl = doc.select("picture > img").attr("src") + + val year = + doc.select("div.font-size-16.text-white.mt-2").firstOrNull { + it.text().contains("السنة") + }?.text()?.getIntFromText() + + // A bit iffy to parse twice like this, but it'll do. + val duration = + doc.select("div.font-size-16.text-white.mt-2").firstOrNull { + it.text().contains("مدة الفيلم") + }?.text()?.getIntFromText() + + val synopsis = doc.select("div.widget-body p:first-child").text() + + val rating = doc.select("span.mx-2").text().split("/").lastOrNull()?.toRatingInt() + + val tags = doc.select("div.font-size-16.d-flex.align-items-center.mt-3 > a").map { + it.text() + } + + val actors = doc.select("div.widget-body > div > div.entry-box > a").mapNotNull { + val name = it?.selectFirst("div > .entry-title")?.text() ?: return@mapNotNull null + val image = it.selectFirst("div > img")?.attr("src") ?: return@mapNotNull null + Actor(name, image) + } + + + + val recommendations = + doc.select("div > div.widget-body > div.row > div > div.entry-box").mapNotNull { + val recTitle = it?.selectFirst("div.entry-body > .entry-title > .text-white") + ?: return@mapNotNull null + val href = recTitle.attr("href") ?: return@mapNotNull null + val name = recTitle.text() ?: return@mapNotNull null + val poster = it.selectFirst(".entry-image > a > picture > img")?.attr("data-src") + ?: return@mapNotNull null + MovieSearchResponse(name, href, this.name, TvType.Movie, fixUrl(poster)) + } + + return if (isMovie) { + newMovieLoadResponse( + title, + url, + TvType.Movie, + url + ) { + this.posterUrl = posterUrl + this.year = year + this.plot = synopsis + this.rating = rating + this.tags = tags + this.duration = duration + this.recommendations = recommendations + addActors(actors) + } + } else { + val episodes = doc.select("div.bg-primary2.p-4.col-lg-4.col-md-6.col-12").map { + it.toEpisode() + }.let { + val isReversed = (it.lastOrNull()?.episode ?: 1) < (it.firstOrNull()?.episode ?: 0) + if (isReversed) + it.reversed() + else it + } + + newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) { + this.duration = duration + this.posterUrl = posterUrl + this.tags = tags.filterNotNull() + this.rating = rating + this.year = year + this.plot = synopsis + this.recommendations = recommendations + addActors(actors) + } + } + } + + +// // Maybe possible to not use the url shortener but cba investigating that. +// private suspend fun skipUrlShortener(url: String): AppResponse { +// return app.get(app.get(url).document.select("a.download-link").attr("href")) +// } + + private fun getQualityFromId(id: Int?): Qualities { + return when (id) { + 2 -> Qualities.P360 // Extrapolated + 3 -> Qualities.P480 + 4 -> Qualities.P720 + 5 -> Qualities.P1080 + else -> Qualities.Unknown + } + } + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val doc = app.get(data).document + + val links = doc.select("div.tab-content.quality").map { element -> + val quality = getQualityFromId(element.attr("id").getIntFromText()) + element.select(".col-lg-6 > a:contains(تحميل)").map { linkElement -> + if (linkElement.attr("href").contains("/download/")) { + Pair( + linkElement.attr("href"), + quality, + ) + } else { + val url = "$mainUrl/download${ + linkElement.attr("href").split("/link")[1] + }${data.split("/movie|/episode|/shows|/show/episode".toRegex())[1]}" + Pair( + url, + quality, + ) + // just in case if they add the shorts urls again + } + } + }.flatten() + + links.map { + val linkDoc = app.get(it.first).document + val button = linkDoc.select("div.btn-loader > a") + val url = button.attr("href") + + callback.invoke( + ExtractorLink( + this.name, + this.name, + url, + this.mainUrl, + it.second.value + ) + ) + } + return true + } +} diff --git a/Anime4upPack.cs3 b/Anime4upPack.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..4fd6849bb776f89630e196a48b477cb1752ab4f5 GIT binary patch literal 15389 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 literal 0 HcmV?d00001 diff --git a/Anime4upPack/build.gradle.kts b/Anime4upPack/build.gradle.kts new file mode 100644 index 0000000..c7425b6 --- /dev/null +++ b/Anime4upPack/build.gradle.kts @@ -0,0 +1,14 @@ +version = 1 + +cloudstream { + description = "This pack contains Anime4up and Witanime" + authors = listOf( "ImZaw" ) + + language = "ar" + + status = 1 + + tvTypes = listOf( "Anime", "AnimeMovie", "Others" ) + + iconUrl = "https://www.google.com/s2/favicons?domain=anime4up.tv&sz=%size%" +} \ No newline at end of file diff --git a/Anime4upPack/src/main/AndroidManifest.xml b/Anime4upPack/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d2fc28b --- /dev/null +++ b/Anime4upPack/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upPlugin.kt b/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upPlugin.kt new file mode 100644 index 0000000..bad110a --- /dev/null +++ b/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upPlugin.kt @@ -0,0 +1,13 @@ +package com.anime4up + +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class Anime4upPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(Anime4up()) + registerMainAPI(WitAnime()) + } +} \ No newline at end of file diff --git a/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upProvider.kt b/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upProvider.kt new file mode 100644 index 0000000..1275417 --- /dev/null +++ b/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upProvider.kt @@ -0,0 +1,167 @@ +package com.anime4up + +import com.fasterxml.jackson.annotation.JsonProperty +import com.lagradost.cloudstream3.utils.AppUtils.parseJson +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId +import com.lagradost.cloudstream3.utils.ExtractorLink +import okio.ByteString.Companion.decodeBase64 +import com.lagradost.cloudstream3.utils.loadExtractor +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import java.net.URL + +private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() +} +class WitAnime : Anime4up() { + override var name = "WitAnime" + override var mainUrl = "https://witanime.com" +} +open class Anime4up : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://anime4up.tv" + override var name = "Anime4up" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = + setOf(TvType.Anime, TvType.AnimeMovie, TvType.OVA, TvType.Others ) + + + private fun Element.toSearchResponse(): SearchResponse { + val imgElement = select("div.hover > img") + val url = select("div.hover > a").attr("href") + .replace("-%d8%a7%d9%84%d8%ad%d9%84%d9%82%d8%a9-.*".toRegex(), "") + .replace("episode", "anime") + val title = imgElement.attr("alt") + val posterUrl = imgElement.attr("src") + val typeText = select("div.anime-card-type > a").text() + val type = + if (typeText.contains("TV|Special".toRegex())) TvType.Anime + else if(typeText.contains("OVA|ONA".toRegex())) TvType.OVA + else if(typeText.contains("Movie")) TvType.AnimeMovie + else TvType.Others + return newAnimeSearchResponse( + title, + url, + type, + ) { + this.posterUrl = posterUrl + } + } + + override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { + val doc = app.get("$mainUrl/").document + val homeList = doc.select(".page-content-container") + .mapNotNull { + val title = it.select("div.main-didget-head h3").text() + val list = + it.select("div.anime-card-container, div.episodes-card-container").map { + anime -> anime.toSearchResponse() + }.distinct() + HomePageList(title, list, isHorizontalImages = title.contains("حلقات")) + } + return newHomePageResponse(homeList, hasNext = false) + } + + override suspend fun search(query: String): List { + return app.get("$mainUrl/?search_param=animes&s=$query").document + .select("div.row.display-flex > div").mapNotNull { + it.toSearchResponse() + } + } + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + + val title = doc.select("h1.anime-details-title").text() + val poster = doc.select("div.anime-thumbnail img").attr("src") + val description = doc.select("p.anime-story").text() + val year = doc.select("div.anime-info:contains(بداية العرض)").text().replace("بداية العرض: ", "").toIntOrNull() + + val typeText = doc.select(".anime-info:contains(النوع) a").text() + val type = + if (typeText.contains("TV|Special".toRegex())) TvType.Anime + else if(typeText.contains("OVA|ONA".toRegex())) TvType.OVA + else if(typeText.contains("Movie")) TvType.AnimeMovie + else TvType.Others + + val malId = doc.select("a.anime-mal").attr("href").replace(".*e\\/|\\/.*".toRegex(),"").toIntOrNull() + + val episodes = doc.select("div#DivEpisodesList > div").apmap { + val episodeElement = it.select("h3 a") + val episodeUrl = episodeElement.attr("href") + val episodeTitle = episodeElement.text() + val posterUrl = it.select(".hover img").attr("src") + Episode( + episodeUrl, + episodeTitle, + episode = episodeTitle.getIntFromText(), + posterUrl = posterUrl + ) + } + return newAnimeLoadResponse(title, url, type) { + this.apiName = this@Anime4up.name + addMalId(malId) + engName = title + posterUrl = poster + this.year = year + addEpisodes(if(title.contains("مدبلج")) DubStatus.Dubbed else DubStatus.Subbed, episodes) + plot = description + this.rating = rating + + } + } + data class sources ( + @JsonProperty("hd" ) var hd : Map? = null, + @JsonProperty("fhd" ) var fhd : Map? = null, + @JsonProperty("sd" ) var sd : Map? = null + ) + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val doc = app.get(data).document + if(data.contains("anime4up")) { + val watchJSON = parseJson(doc.select("input[name=\"wl\"]").attr("value").decodeBase64()?.utf8() ?: "") + watchJSON.let { source -> + source.fhd?.apmap { + loadExtractor(it.value, data, subtitleCallback, callback) + } + source.hd?.apmap { + loadExtractor(it.value, data, subtitleCallback, callback) + } + source.sd?.apmap { + loadExtractor(it.value, data, subtitleCallback, callback) + } + } + val moshahdaID = doc.select("input[name=\"moshahda\"]").attr("value").decodeBase64()?.utf8() ?: "" + if(moshahdaID.isNotEmpty()) { + mapOf( + "Original" to "download_o", + "720" to "download_x", + "480" to "download_h", + "360" to "download_n", + "240" to "download_l" + ).apmap { (quality, qualityCode) -> + callback.invoke( + ExtractorLink( + this.name, + this.name + " Moshahda", + "https://moshahda.net/$moshahdaID.html?${qualityCode}", + "https://moshahda.net", + quality.toIntOrNull() ?: 1080 + ) + ) } + } + } else if(data.contains("witanime")) { // witanime + doc.select("ul#episode-servers li a").apmap { + loadExtractor(it.attr("data-ep-url"), data, subtitleCallback, callback) + } + } + return true + } +} diff --git a/AnimeBlkomProvider.cs3 b/AnimeBlkomProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..99ac72b2be9fe9b9f6973c674f4e26ea758f29fe GIT binary patch literal 13332 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 + \ No newline at end of file diff --git a/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomPlugin.kt b/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomPlugin.kt new file mode 100644 index 0000000..5278e84 --- /dev/null +++ b/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomPlugin.kt @@ -0,0 +1,11 @@ +package com.animeblkom +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class AnimeBlkomPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(AnimeBlkom()) + } +} \ No newline at end of file diff --git a/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomProvider.kt b/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomProvider.kt new file mode 100644 index 0000000..2da8483 --- /dev/null +++ b/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomProvider.kt @@ -0,0 +1,164 @@ +package com.animeblkom + + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities +import com.lagradost.cloudstream3.utils.loadExtractor +import org.jsoup.nodes.Element + +class AnimeBlkom : MainAPI() { + override var mainUrl = "https://animeblkom.net" + override var name = "AnimeBlkom" + override var lang = "ar" + override val hasMainPage = true + + override val supportedTypes = setOf( + TvType.Anime, + TvType.AnimeMovie, + TvType.OVA, + ) + + private fun Element.toSearchResponse(): SearchResponse { + val url = select("div.poster a").attr("href") + val name = select("div.name a").text() + val poster = mainUrl + select("div.poster img").attr("data-original") + val year = select("div[title=\"سنة الانتاج\"]").text().toIntOrNull() + val episodesNumber = select("div[title=\"عدد الحلقات\"]").text().toIntOrNull() + val tvType = select("div[title=\"النوع\"]").text().let { if(it.contains("فيلم|خاصة".toRegex())) TvType.AnimeMovie else if(it.contains("أوفا|أونا".toRegex())) TvType.OVA else TvType.Anime } + return newAnimeSearchResponse( + name, + url, + tvType, + ) { + addDubStatus(false, episodesNumber) + this.year = year + this.posterUrl = poster + } + } + override val mainPage = mainPageOf( + "$mainUrl/anime-list?sort_by=rate&page=" to "Most rated", + "$mainUrl/anime-list?sort_by=created_at&page=" to "Recently added", + "$mainUrl/anime-list?states=finished&page=" to "Completed" + ) + override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { + val doc = app.get(request.data + page).document + val list = doc.select("div.content-inner") + .mapNotNull { element -> + element.toSearchResponse() + } + return newHomePageResponse(request.name, list) + } + + override suspend fun search(query: String): List { + val q = query.replace(" ","+") + return app.get("$mainUrl/search?query=$q").document.select("div.content.ratable").map { + it.toSearchResponse() + } + } + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + + val title = doc.select("span h1").text().replace("\\(.*".toRegex(),"") + val poster = mainUrl + doc.select("div.poster img").attr("data-original") + val description = doc.select(".story p").text() + val genre = doc.select("p.genres a").map { + it.text() + } + val year = doc.select(".info-table div:contains(تاريخ الانتاج) span.info").text().split("-")[0].toIntOrNull() + val status = doc.select(".info-table div:contains(حالة الأنمي) span.info").text().let { if(it.contains("مستمر")) ShowStatus.Ongoing else ShowStatus.Completed } + val nativeName = doc.select("span[title=\"الاسم باليابانية\"]").text().replace(".*:".toRegex(),"") + val type = doc.select("h1 small").text().let { + if (it.contains("movie")) TvType.AnimeMovie + if (it.contains("ova|ona".toRegex())) TvType.OVA + else TvType.Anime + } + + val malId = doc.select("a.blue.cta:contains(المزيد من المعلومات)").attr("href").replace(".*e\\/|\\/.*".toRegex(),"").toInt() + val episodes = arrayListOf() + val episodeElements = doc.select(".episode-link") + if(episodeElements.isEmpty()) { + episodes.add(Episode( + url, + "Watch", + )) + } else { + episodeElements.map { + val a = it.select("a") + episodes.add(Episode( + mainUrl + a.attr("href"), + a.text().replace(":"," "), + episode = a.select("span").not(".pull-left").last()?.text()?.toIntOrNull() + )) + } + } + return newAnimeLoadResponse(title, url, type) { + addMalId(malId) + japName = nativeName + engName = title + posterUrl = poster + this.year = year + addEpisodes(DubStatus.Subbed, episodes) // TODO CHECK + plot = description + tags = genre + + showStatus = status + } + } + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val doc = app.get(data).document + doc.select("div.item a[data-src]").map { + it.attr("data-src").let { url -> + if(url.startsWith("https://animetitans.net/")) { + val iframe = app.get(url).document + callback.invoke( + ExtractorLink( + this.name, + "Animetitans " + it.text(), + iframe.select("script").last()?.data()?.substringAfter("source: \"")?.substringBefore("\"").toString(), + this.mainUrl, + Qualities.Unknown.value, + isM3u8 = true + ) + ) + } else if(it.text() == "Blkom") { + val iframe = app.get(url).document + iframe.select("source").forEach { source -> + callback.invoke( + ExtractorLink( + this.name, + it.text(), + source.attr("src"), + this.mainUrl, + source.attr("res").toInt() + ) + ) + } + } else { + var sourceUrl = url + if(it.text().contains("Google")) sourceUrl = "http://gdriveplayer.to/embed2.php?link=$url" + loadExtractor(sourceUrl, mainUrl, subtitleCallback, callback) + } + } + } + doc.select(".panel .panel-body a").apmap { + println(it.text()) + callback.invoke( + ExtractorLink( + this.name, + it.attr("title") + " " + it.select("small").text() + " Download Source", + it.attr("href"), + this.mainUrl, + it.text().replace("p.*| ".toRegex(),"").toInt(), + ) + ) + } + return true + } +} \ No newline at end of file diff --git a/AnimeiatProvider.cs3 b/AnimeiatProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..3364c0ea1a553a11cd730180692e4440728c8b8a GIT binary patch literal 20627 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 + \ No newline at end of file diff --git a/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatPlugin.kt b/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatPlugin.kt new file mode 100644 index 0000000..fa3c66f --- /dev/null +++ b/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatPlugin.kt @@ -0,0 +1,11 @@ +package com.animeiat +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class AnimeiatPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(Animeiat()) + } +} \ No newline at end of file diff --git a/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatProvider.kt b/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatProvider.kt new file mode 100644 index 0000000..230bfa3 --- /dev/null +++ b/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatProvider.kt @@ -0,0 +1,172 @@ +package com.animeiat + + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.loadExtractor +import com.fasterxml.jackson.annotation.JsonProperty +import com.lagradost.cloudstream3.utils.AppUtils.parseJson +import com.lagradost.nicehttp.Requests + +class Animeiat : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://api.animeiat.co/v1" + val pageUrl = "https://www.animeiat.tv" + override var name = "Animeiat" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = + setOf(TvType.Anime, TvType.AnimeMovie) + + data class Data ( + @JsonProperty("anime_name" ) var animeName : String? = null, + @JsonProperty("title" ) var title : String? = null, + @JsonProperty("slug" ) var slug : String? = null, + @JsonProperty("story" ) var story : String? = null, + @JsonProperty("other_names" ) var otherNames : String? = null, + @JsonProperty("total_episodes" ) var totalEpisodes : Int? = null, + @JsonProperty("number" ) var number : Int? = null, + @JsonProperty("age" ) var age : String? = null, + @JsonProperty("type" ) var type : String? = null, + @JsonProperty("status" ) var status : String? = null, + @JsonProperty("poster_path" ) var posterPath : String? = null, + ) + data class All ( + @JsonProperty("data" ) var data : ArrayList = arrayListOf(), + ) + + override val mainPage = mainPageOf( + "$mainUrl/home/sticky-episodes?page=" to "Episodes (H)", + "$mainUrl/anime?status=completed&page=" to "Completed", + "$mainUrl/anime?status=ongoing&page=" to "Ongoing", + ) + + override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { + val json = parseJson(app.get(request.data + page).text) + val list = json.data.map { + newAnimeSearchResponse( + it.animeName ?: it.title.toString(), + mainUrl + "/anime/" + it.slug.toString().replace("-episode.*".toRegex(),""), + if (it.type == "movie") TvType.AnimeMovie else if (it.type == "tv") TvType.Anime else TvType.OVA, + ) { + addDubStatus(false, it.totalEpisodes ?: it.number) + this.otherName = it.otherNames?.split("\n")?.last() + this.posterUrl = "https://api.animeiat.co/storage/" + it.posterPath + } + } + return if(request.name.contains("(H)")) HomePageResponse( + arrayListOf(HomePageList(request.name.replace(" (H)",""), list, request.name.contains("(H)"))) + ) else newHomePageResponse(request.name, list) + } + + override suspend fun search(query: String): List { + val json = parseJson(app.get("$mainUrl/anime?q=$query").text) + return json.data.map { + newAnimeSearchResponse( + it.animeName.toString(), + mainUrl + "/anime/" + it.slug.toString(), + if(it.type == "movie") TvType.AnimeMovie else if(it.type == "tv") TvType.Anime else TvType.OVA, + ) { + addDubStatus(false, it.totalEpisodes) + this.otherName = it.otherNames?.split("\n")?.last() + this.posterUrl = "https://api.animeiat.co/storage/" + it.posterPath + } + } + + } + + data class Year ( + @JsonProperty("name" ) var name : String? = null, + + ) + data class Genres ( + @JsonProperty("name" ) var name : String? = null, + ) + data class LoadData ( + @JsonProperty("anime_name" ) var animeName : String? = null, + @JsonProperty("slug" ) var slug : String? = null, + @JsonProperty("story" ) var story : String? = null, + @JsonProperty("other_names" ) var otherNames : String? = null, + @JsonProperty("age" ) var age : String? = null, + @JsonProperty("type" ) var type : String? = null, + @JsonProperty("status" ) var status : String? = null, + @JsonProperty("poster_path" ) var posterPath : String? = null, + @JsonProperty("year" ) var year : Year? = Year(), + @JsonProperty("genres" ) var genres : ArrayList = arrayListOf(), + + ) + data class Load ( + + @JsonProperty("data" ) var data : LoadData? = LoadData() + + ) + data class Meta ( + @JsonProperty("last_page" ) var lastPage : Int? = null, + ) + data class EpisodeData ( + @JsonProperty("title" ) var title : String? = null, + @JsonProperty("slug" ) var slug : String? = null, + @JsonProperty("number" ) var number : Int? = null, + @JsonProperty("video_id" ) var videoId : Int? = null, + @JsonProperty("poster_path" ) var posterPath : String? = null, + ) + data class Episodes ( + @JsonProperty("data" ) var data : ArrayList = arrayListOf(), + @JsonProperty("meta" ) var meta : Meta = Meta() + ) + override suspend fun load(url: String): LoadResponse { + val loadSession = Requests() + val request = loadSession.get(url.replace(pageUrl, mainUrl)).text + val json = parseJson(request) + val episodes = arrayListOf() + (1..parseJson(loadSession.get("$url/episodes").text).meta.lastPage!!).map { pageNumber -> + parseJson(loadSession.get("$url/episodes?page=$pageNumber").text).data.map { + episodes.add( + Episode( + "$pageUrl/watch/"+json.data?.slug, + it.title, + null, + it.number, + "https://api.animeiat.co/storage/" + it.posterPath, + + ) + ) + } + } + return newAnimeLoadResponse(json.data?.animeName.toString(), "$pageUrl/watch/"+json.data?.slug, if(json.data?.type == "movie") TvType.AnimeMovie else if(json.data?.type == "tv") TvType.Anime else TvType.OVA) { + japName = json.data?.otherNames?.replace("\\n.*".toRegex(), "") + engName = json.data?.animeName + posterUrl = "https://api.animeiat.co/storage/" + json.data?.posterPath + this.year = json.data?.year?.name?.toIntOrNull() + addEpisodes(DubStatus.Subbed, episodes) + plot = json.data?.story + tags = json.data?.genres?.map { it.name.toString() } + this.showStatus = if(json.data?.status == "completed") ShowStatus.Completed else ShowStatus.Ongoing + } + } + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val url = if(data.contains("-episode")) data else "$data-episode-1" + val doc = app.get(url).document + val script = doc.select("body > script").first()?.html() + val id = script?.replace(".*4\",slug:\"|\",duration:.*".toRegex(),"") + val player = app.get("$pageUrl/player/$id").document + player.select("source").map { + callback.invoke( + ExtractorLink( + this.name, + this.name, + it.attr("src"), + pageUrl, + it.attr("size").toInt(), + ) + ) + } + return true + } +} \ No newline at end of file diff --git a/ArabSeedProvider.cs3 b/ArabSeedProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..7f974f2e82a0b248c4091bbc3d30f44fa2c7fd37 GIT binary patch literal 16392 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 literal 0 HcmV?d00001 diff --git a/ArabSeedProvider/build.gradle.kts b/ArabSeedProvider/build.gradle.kts new file mode 100644 index 0000000..2b9098c --- /dev/null +++ b/ArabSeedProvider/build.gradle.kts @@ -0,0 +1,14 @@ +version = 2 + +cloudstream { + description = "" + authors = listOf( "ImZaw" ) + + language = "ar" + + status = 1 + + tvTypes = listOf( "TvSeries" , "Movie" ) + + iconUrl = "https://www.google.com/s2/favicons?domain=arabseed.ink&sz=%size%" +} diff --git a/ArabSeedProvider/src/main/AndroidManifest.xml b/ArabSeedProvider/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2a12952 --- /dev/null +++ b/ArabSeedProvider/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedPlugin.kt b/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedPlugin.kt new file mode 100644 index 0000000..1a2210d --- /dev/null +++ b/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedPlugin.kt @@ -0,0 +1,11 @@ +package com.arabseed +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class ArabSeedPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(ArabSeed()) + } +} \ No newline at end of file diff --git a/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedProvider.kt b/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedProvider.kt new file mode 100644 index 0000000..40f16ab --- /dev/null +++ b/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedProvider.kt @@ -0,0 +1,217 @@ +package com.arabseed + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.loadExtractor +import org.jsoup.nodes.Element + +class ArabSeed : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://m5.arabseed.ink" + override var name = "ArabSeed" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie) + + private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + + private fun Element.toSearchResponse(): SearchResponse? { + val title = select("h4").text() + val posterUrl = select("img.imgOptimzer").attr("data-image").ifEmpty { select("div.Poster img").attr("data-src") } + val tvType = if (select("span.category").text().contains("مسلسلات")) TvType.TvSeries else TvType.Movie + return MovieSearchResponse( + title, + select("a").attr("href"), + this@ArabSeed.name, + tvType, + posterUrl, + ) + } + + override val mainPage = mainPageOf( + "$mainUrl/movies/?offset=" to "Movies", + "$mainUrl/series/?offset=" to "Series", + ) + + override suspend fun getMainPage( + page: Int, + request: MainPageRequest + ): HomePageResponse { + val document = app.get(request.data + page, timeout = 120).document + val home = document.select("ul.Blocks-UL > div").mapNotNull { + it.toSearchResponse() + } + return newHomePageResponse(request.name, home) + } + + override suspend fun search(query: String): List { + val list = arrayListOf() + arrayListOf( + mainUrl to "series", + mainUrl to "movies" + ).apmap { (url, type) -> + val doc = app.post( + "$url/wp-content/themes/Elshaikh2021/Ajaxat/SearchingTwo.php", + data = mapOf("search" to query, "type" to type), + referer = mainUrl + ).document + doc.select("ul.Blocks-UL > div").mapNotNull { + it.toSearchResponse()?.let { it1 -> list.add(it1) } + } + } + return list + } + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url, timeout = 120).document + val title = doc.select("h1.Title").text().ifEmpty { doc.select("div.Title").text() } + val isMovie = title.contains("فيلم") + + val posterUrl = doc.select("div.Poster > img").let{ it.attr("data-src").ifEmpty { it.attr("src") } } + val rating = doc.select("div.RatingImdb em").text().getIntFromText() + val synopsis = doc.select("p.descrip").last()?.text() + val year = doc.select("li:contains(السنه) a").text().getIntFromText() + val tags = doc.select("li:contains(النوع) > a, li:contains(التصنيف) > a")?.map { it.text() } + + val actors = doc.select("div.WorkTeamIteM").mapNotNull { + val name = it.selectFirst("h4 > em")?.text() ?: return@mapNotNull null + val image = it.selectFirst("div.Icon img")?.attr("src") ?: return@mapNotNull null + val roleString = it.select("h4 > span").text() + val mainActor = Actor(name, image) + ActorData(actor = mainActor, roleString = roleString) + } + + val recommendations = doc.select("ul.Blocks-UL > div").mapNotNull { element -> + element.toSearchResponse() + } + + return if (isMovie) { + newMovieLoadResponse( + title, + url, + TvType.Movie, + url + ) { + this.posterUrl = posterUrl + this.recommendations = recommendations + this.plot = synopsis + this.tags = tags + this.actors = actors + this.rating = rating + this.year = year + } + } else { + val seasonList = doc.select("div.SeasonsListHolder ul > li") + val episodes = arrayListOf() + if(seasonList.isNotEmpty()) { + seasonList.apmap { season -> + app.post( + "$mainUrl/wp-content/themes/Elshaikh2021/Ajaxat/Single/Episodes.php", + data = mapOf("season" to season.attr("data-season"), "post_id" to season.attr("data-id")) + ).document.select("a").apmap { + episodes.add(Episode( + it.attr("href"), + it.text(), + season.attr("data-season")[0].toString().toIntOrNull(), + it.text().getIntFromText() + )) + } + } + } else { + doc.select("div.ContainerEpisodesList > a").apmap { + episodes.add(Episode( + it.attr("href"), + it.text(), + 0, + it.text().getIntFromText() + )) + } + } + newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes.distinct().sortedBy { it.episode }) { + this.posterUrl = posterUrl + this.tags = tags + this.plot = synopsis + this.actors = actors + this.recommendations = recommendations + this.rating = rating + this.year = year + } + } + } + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val doc = app.get(data).document + val watchUrl = doc.select("a.watchBTn").attr("href") + val watchDoc = app.get(watchUrl, headers = mapOf("Referer" to mainUrl)).document + val indexOperators = arrayListOf() + val list: List = watchDoc.select("ul > li[data-link], ul > h3").mapIndexed { index, element -> + if(element.`is`("h3")) { + indexOperators.add(index) + element + } else element + } + var watchLinks: List>>; + if(indexOperators.isNotEmpty()) { + watchLinks = indexOperators.mapIndexed { index, it -> + var endIndex = list.size + if (index != indexOperators.size - 1) endIndex = (indexOperators[index + 1]) - 1 + list[it].text().getIntFromText() as Int to list.subList(it + 1, endIndex) as List + } + } else { + watchLinks = arrayListOf(0 to list) + } + watchLinks.apmap { (quality, links) -> + links.apmap { + val iframeUrl = it.attr("data-link") + println(iframeUrl) + if(it.text().contains("عرب سيد")) { + val sourceElement = app.get(iframeUrl).document.select("source") + callback.invoke( + ExtractorLink( + this.name, + "ArabSeed", + sourceElement.attr("src"), + data, + if(quality != 0) quality else it.text().replace(".*- ".toRegex(), "").replace("\\D".toRegex(),"").toInt(), + !sourceElement.attr("type").contains("mp4") + ) + ) + } else if (iframeUrl.contains("voe.sx")) { + val doc = app.get(iframeUrl).document + val script = doc.select("script").map { it.data() }.first { it.contains("sources") } + val m3u8 = script.substringAfter("'hls': '").substringBefore("'") + val mp4 = script.substringAfter("'mp4': '").substringBefore("'") + val voeSxquality = script.substringAfter("'video_height': ").substringBefore(",").toInt() + callback.invoke( + ExtractorLink( + this.name, + "Voe.sx m3u8", + m3u8, + data, + voeSxquality, + true + ) + ) + callback.invoke( + ExtractorLink( + this.name, + "Voe.sx mp4", + mp4, + data, + voeSxquality, + ) + ) + } else loadExtractor(iframeUrl, data, subtitleCallback, callback) + } + } + return true + } +} \ No newline at end of file diff --git a/CimaNowProvider.cs3 b/CimaNowProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..2914345c19abd9ba43fea085f484ff681d6da5a0 GIT binary patch literal 14700 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 literal 0 HcmV?d00001 diff --git a/CimaNowProvider/build.gradle.kts b/CimaNowProvider/build.gradle.kts new file mode 100644 index 0000000..8ef9f8f --- /dev/null +++ b/CimaNowProvider/build.gradle.kts @@ -0,0 +1,14 @@ +version = 1 + +cloudstream { + description = "" + authors = listOf( "ImZaw" ) + + language = "ar" + + status = 1 + + tvTypes = listOf( "TvSeries" , "Movie" ) + + iconUrl = "https://www.google.com/s2/favicons?domain=cimanow.cc&sz=%size%" +} \ No newline at end of file diff --git a/CimaNowProvider/src/main/AndroidManifest.xml b/CimaNowProvider/src/main/AndroidManifest.xml new file mode 100644 index 0000000..95a9f4b --- /dev/null +++ b/CimaNowProvider/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowPlugin.kt b/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowPlugin.kt new file mode 100644 index 0000000..ddb39b4 --- /dev/null +++ b/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowPlugin.kt @@ -0,0 +1,11 @@ +package com.cimanow +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class CimaNowPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(CimaNow()) + } +} \ No newline at end of file diff --git a/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowProvider.kt b/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowProvider.kt new file mode 100644 index 0000000..d9c45b7 --- /dev/null +++ b/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowProvider.kt @@ -0,0 +1,164 @@ +package com.cimanow + + +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 + +class CimaNow : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://cimanow.cc" + override var name = "CimaNow" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie) + + private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + private fun Element.toSearchResponse(): SearchResponse? { + val url = this.attr("href") + val posterUrl = select("img")?.attr("data-src") + var title = select("li[aria-label=\"title\"]").html().replace(" .*|\\\\n".toRegex(), "").replace(" ", "") + val year = select("li[aria-label=\"year\"]").text().toIntOrNull() + val tvType = if (url.contains("فيلم|مسرحية|حفلات".toRegex())) TvType.Movie else TvType.TvSeries + val quality = select("li[aria-label=\"ribbon\"]").first()?.text()?.replace(" |-|1080|720".toRegex(), "") + val dubEl = select("li[aria-label=\"ribbon\"]:nth-child(2)").isNotEmpty() + val dubStatus = if(dubEl) select("li[aria-label=\"ribbon\"]:nth-child(2)").text().contains("مدبلج") + else select("li[aria-label=\"ribbon\"]:nth-child(1)").text().contains("مدبلج") + if(dubStatus) title = "$title (مدبلج)" + return MovieSearchResponse( + "$title ${select("li[aria-label=\"ribbon\"]:contains(الموسم)").text()}", + url, + this@CimaNow.name, + tvType, + posterUrl, + year, + null, + quality = getQualityFromString(quality) + ) + } + + override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { + + val doc = app.get("$mainUrl/home", headers = mapOf("user-agent" to "MONKE")).document + val pages = doc.select("section").not("section:contains(أختر وجهتك المفضلة)").not("section:contains(تم اضافته حديثاً)").apmap { + val name = it.select("span").html().replace(".*| { + val result = arrayListOf() + val doc = app.get("$mainUrl/page/1/?s=$query").document + val paginationElement = doc.select("ul[aria-label=\"pagination\"]") + doc.select("section article a").map { + val postUrl = it.attr("href") + if(it.select("li[aria-label=\"episode\"]").isNotEmpty()) return@map + if(postUrl.contains("$mainUrl/expired-download/|$mainUrl/افلام-اون-لاين/".toRegex())) return@map + result.add(it.toSearchResponse()!!) + } + if(paginationElement.isNotEmpty()) { + val max = paginationElement.select("li").not("li.active").last()?.text()?.toIntOrNull() + if (max != null) { + if(max > 5) return result.distinct().sortedBy { it.name } + (2..max!!).toList().apmap { + app.get("$mainUrl/page/$it/?s=$query\"").document.select("section article a").map { element -> + val postUrl = element.attr("href") + if(element.select("li[aria-label=\"episode\"]").isNotEmpty()) return@map + if(postUrl.contains("$mainUrl/expired-download/|$mainUrl/افلام-اون-لاين/".toRegex())) return@map + result.add(element.toSearchResponse()!!) + } + } + } + } + return result.distinct().sortedBy { it.name } + } + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + val posterUrl = doc.select("body > script:nth-child(3)").html().replace(".*,\"image\":\"|\".*".toRegex(),"").ifEmpty { doc.select("meta[property=\"og:image\"]").attr("content") } + val year = doc.select("article ul:nth-child(1) li a").last()?.text()?.toIntOrNull() + val title = doc.select("title").text().split(" | ")[0] + val isMovie = title.contains("فيلم|حفلات|مسرحية".toRegex()) + val youtubeTrailer = doc.select("iframe")?.attr("src") + + val synopsis = doc.select("ul#details li:contains(لمحة) p").text() + + val tags = doc.select("article ul").first()?.select("li")?.map { it.text() } + + val recommendations = doc.select("ul#related li").map { element -> + MovieSearchResponse( + apiName = this@CimaNow.name, + url = element.select("a").attr("href"), + name = element.select("img:nth-child(2)").attr("alt"), + posterUrl = element.select("img:nth-child(2)").attr("src") + ) + } + + return if (isMovie) { + newMovieLoadResponse( + title, + url, + TvType.Movie, + "$url/watching" + ) { + this.posterUrl = posterUrl + this.year = year + this.recommendations = recommendations + this.plot = synopsis + this.tags = tags + addTrailer(youtubeTrailer) + } + } else { + val episodes = doc.select("ul#eps li").map { episode -> + Episode( + episode.select("a").attr("href")+"/watching", + episode.select("a img:nth-child(2)").attr("alt"), + doc.select("span[aria-label=\"season-title\"]").html().replace("

.*|\n".toRegex(), "").getIntFromText(), + episode.select("a em").text().toIntOrNull(), + episode.select("a img:nth-child(2)").attr("src") + ) + } + newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes.distinct().sortedBy { it.episode }) { + this.posterUrl = posterUrl + this.tags = tags + this.year = year + this.plot = synopsis + this.recommendations = recommendations + addTrailer(youtubeTrailer) + } + } + } + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + app.get("$data").document.select("ul#download [aria-label=\"quality\"]").forEach { + val name = if(it.select("span").text().contains("فائق السرعة")) "Fast Servers" else "Servers" + it.select("a").forEach { media -> + callback.invoke( + ExtractorLink( + source = this.name, + name = name, + url = media.attr("href"), + referer = this.mainUrl, + quality = media.text().getIntFromText() ?: Qualities.Unknown.value + ) + ) + } + } + return true + } +} \ No newline at end of file diff --git a/EgyBestProvider/build.gradle.kts b/EgyBestProvider/build.gradle.kts new file mode 100644 index 0000000..c702710 --- /dev/null +++ b/EgyBestProvider/build.gradle.kts @@ -0,0 +1,14 @@ +version = 7 + +cloudstream { + description = "Egybest is broken" + authors = listOf( "ImZaw" ) + + language = "ar" + + status = 0 + + tvTypes = listOf( "TvSeries" , "Movie" , "Anime" ) + + iconUrl = "https://www.google.com/s2/favicons?domain=www.egy.best&sz=%size%" +} diff --git a/EgyBestProvider/src/main/AndroidManifest.xml b/EgyBestProvider/src/main/AndroidManifest.xml new file mode 100644 index 0000000..09206f7 --- /dev/null +++ b/EgyBestProvider/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestPlugin.kt b/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestPlugin.kt new file mode 100644 index 0000000..f417ab6 --- /dev/null +++ b/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestPlugin.kt @@ -0,0 +1,11 @@ +package com.egybest +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class EgyBestPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(EgyBest()) + } +} \ No newline at end of file diff --git a/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestProvider.kt b/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestProvider.kt new file mode 100644 index 0000000..295e5c7 --- /dev/null +++ b/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestProvider.kt @@ -0,0 +1,275 @@ +package com.egybest + + +import android.annotation.TargetApi +import android.os.Build +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.M3u8Helper +import com.lagradost.nicehttp.Requests +import com.lagradost.nicehttp.Session +import okhttp3.HttpUrl.Companion.toHttpUrl +import org.jsoup.nodes.Element +import java.util.Base64 +import org.mozilla.javascript.Context +import org.mozilla.javascript.Scriptable + +fun String.runJS(variableName: String): String { + val rhino = Context.enter() + rhino.initSafeStandardObjects() + rhino.optimizationLevel = -1 + val scope: Scriptable = rhino.initSafeStandardObjects() + val script = this + val result: String + try { + var js = "" + for (i in script.indices) { + js += script[i] + } + rhino.evaluateString(scope, js, "JavaScript", 1, null) + result = Context.toString(scope.get(variableName, scope)) + } finally { + Context.exit() + } + return result +} + +class EgyBest : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://egybest.org" + override var name = "EgyBest" + var pssid = "" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie, TvType.Anime) + + private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + private fun Element.toSearchResponse(): SearchResponse? { + val url = this.attr("href") ?: return null + val posterUrl = select("img")?.attr("src") + var title = select("span.title").text() + val year = title.getYearFromTitle() + val isMovie = Regex(".*/movie/.*|.*/masrahiya/.*").matches(url) + val tvType = if (isMovie) TvType.Movie else TvType.TvSeries + title = if (year !== null) title else title.split(" (")[0].trim() + val quality = select("span.ribbon span").text().replace("-", "") + // If you need to differentiate use the url. + return MovieSearchResponse( + title, + mainUrl + url, + this@EgyBest.name, + tvType, + posterUrl, + year, + null, + quality = getQualityFromString(quality) + ) + } + + override val mainPage = mainPageOf( + "$mainUrl/trending/?page=" to "الأفلام الأكثر مشاهدة", + "$mainUrl/movies/?page=" to "أفلام جديدة", + "$mainUrl/tv/?page=" to "مسلسلات جديدة ", + "$mainUrl/tv/korean?page=" to "الدراما الكورية ", + "$mainUrl/animes/popular?page=" to "مسلسلات الانمي", + "$mainUrl/wwe/?page=" to "عروض المصارعة ", + "$mainUrl/movies/latest-bluray-2020-2019?page=" to "أفلام جديدة BluRay", + "$mainUrl/masrahiyat/?page=" to "مسرحيات ", + "$mainUrl/movies/latest?page=" to "أحدث الاضافات", + "$mainUrl/movies/comedy?page=" to "أفلام كوميدية", + "$mainUrl/explore/?q=superhero/" to "أفلام سوبر هيرو", + "$mainUrl/movies/animation?page=" to "أفلام انمي و كرتون", + "$mainUrl/movies/romance?page=" to "أفلام رومانسية", + "$mainUrl/movies/drama?page=" to "أفلام دراما", + "$mainUrl/movies/horror?page=" to "أفلام رعب", + "$mainUrl/movies/documentary?page=" to "أفلام وثائقية", + "$mainUrl/World-War-Movies/?page=" to "أفلام عن الحرب العالمية ☢", + "$mainUrl/End-Of-The-World-Movies/?page=" to "أفلام عن نهاية العالم", + "$mainUrl/movies/arab?page=" to "أفلام عربية ", + ) + + override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { + val doc = app.get(request.data + page).document + val list = doc.select(".movie") + .mapNotNull { element -> + element.toSearchResponse() + } + return newHomePageResponse(request.name, list) + } + + override suspend fun search(query: String): List { + val result = arrayListOf() + listOf("$mainUrl/explore/?q=$query").apmap { url -> + val d = app.get(url).document + d.select("div.movies a").not("a.auto.load.btn.b").mapNotNull { + it.toSearchResponse()?.let { it1 -> result.add(it1) } + } + } + return result.distinct().sortedBy { it.name } + } + + private fun String.getYearFromTitle(): Int? { + return Regex("""\(\d{4}\)""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + val isMovie = Regex(".*/movie/.*|.*/masrahiya/.*").matches(url) + val posterUrl = doc.select("div.movie_img a img")?.attr("src") + val year = doc.select("div.movie_title h1 a")?.text()?.toIntOrNull() + val title = doc.select("div.movie_title h1 span").text() + val youtubeTrailer = doc.select("div.play")?.attr("url") + + val synopsis = doc.select("div.mbox").firstOrNull { + it.text().contains("القصة") + }?.text()?.replace("القصة ", "") + + val tags = doc.select("table.movieTable tbody tr").firstOrNull { + it.text().contains("النوع") + }?.select("a")?.map { it.text() } + + val actors = doc.select("div.cast_list .cast_item").mapNotNull { + val name = it.selectFirst("div > a > img")?.attr("alt") ?: return@mapNotNull null + val image = it.selectFirst("div > a > img")?.attr("src") ?: return@mapNotNull null + val roleString = it.selectFirst("div > span")!!.text() + val mainActor = Actor(name, image) + ActorData(actor = mainActor, roleString = roleString) + } + + return if (isMovie) { + val recommendations = doc.select(".movies_small .movie").mapNotNull { element -> + element.toSearchResponse() + } + + newMovieLoadResponse( + title, + url, + TvType.Movie, + url + ) { + this.posterUrl = posterUrl + this.year = year + this.recommendations = recommendations + this.plot = synopsis + this.tags = tags + this.actors = actors + addTrailer(youtubeTrailer) + } + } else { + val episodes = ArrayList() + doc.select("#mainLoad > div:nth-child(2) > div.h_scroll > div a").map { + it.attr("href") + }.apmap { + val d = app.get(it).document + val season = Regex("season-(.....)").find(it)?.groupValues?.getOrNull(1)?.getIntFromText() + if(d.select("tr.published").isNotEmpty()) { + d.select("tr.published").map { element -> + val ep = Regex("ep-(.....)").find(element.select(".ep_title a").attr("href"))?.groupValues?.getOrNull(1)?.getIntFromText() + episodes.add( + Episode( + mainUrl + element.select(".ep_title a").attr("href"), + name = element.select("td.ep_title").html().replace(".*|".toRegex(), ""), + season, + ep, + rating = element.select("td.tam:not(.date, .ep_len)").text().getIntFromText() + ) + ) + } + } else { + d.select("#mainLoad > div:nth-child(3) > div.movies_small a").map { eit -> + val ep = Regex("ep-(.....)").find(eit.attr("href"))?.groupValues?.getOrNull(1)?.getIntFromText() + episodes.add( + Episode( + mainUrl + eit.attr("href"), + eit.select("span.title").text(), + season, + ep, + ) + ) + } + } + } + newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes.distinct().sortedBy { it.episode }) { + this.posterUrl = posterUrl + this.tags = tags + this.year = year + this.plot = synopsis + this.actors = actors + addTrailer(youtubeTrailer) + } + } + } + + @TargetApi(Build.VERSION_CODES.O) + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val baseURL = data.split("/")[0] + "//" + data.split("/")[2] + val client = Requests().baseClient + val session = Session(client) + println(baseURL) + println(data) + val doc = session.get(data).document + + val vidstreamURL = baseURL + doc.select("iframe.auto-size").attr("src") + + val videoSoup = session.get(vidstreamURL, cookies = mapOf( + "PSSID" to this@EgyBest.pssid, + )).document + videoSoup.select("source").firstOrNull { it.hasAttr("src") }?.attr("src")?.let { + M3u8Helper.generateM3u8( + this.name, + it, + referer = mainUrl, + headers = mapOf("range" to "bytes=0-") + ).forEach(callback) + } ?: run { + var jsCode = videoSoup.select("script")[1].html() + val function = videoSoup.select("script")[2].attr("onload") + val verificationToken = Regex("\\{'[0-9a-zA-Z_]*':'ok'\\}").findAll(jsCode).first().value.replace("\\{'|':.*".toRegex(), "") + val encodedAdLinkVar = Regex("\\([0-9a-zA-Z_]{2,12}\\[Math").findAll(jsCode).first().value.replace("\\(|\\[M.*".toRegex(),"") + val encodingArraysRegEx = Regex(",[0-9a-zA-Z_]{2,12}=\\[]").findAll(jsCode).toList() + val firstEncodingArray = encodingArraysRegEx[1].value.replace(",|=.*".toRegex(),"") + val secondEncodingArray = encodingArraysRegEx[2].value.replace(",|=.*".toRegex(),"") + + jsCode = jsCode.replace("^