From 9ea7b9e5cd152bfd011f3aced6aeb7b728c6eb6f 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 a27d8587c01f4c78bff897c70dcb52c62e29bd27 --- .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 -> 20624 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 -> 19921 bytes FajerShowProvider.cs3 | Bin 0 -> 16939 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 -> 16194 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 -> 19538 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..94cf1288b14541e428b7804a097a93c5c4b0d3ec GIT binary patch literal 15389 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 QFJV4Tj}M(J_@Af$1B*OX3IG5A 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 zcmZ{LbxfSWw>FDAh2mODaV-@0qD6~aad$7aI24EC?(XikxO;J1ps+ZLFU2mu@B8Q8 zo7|a9W+s!9^E`9TBZtoH$%dsamJ;+sfl@V7(1{V+U&sb5}Pu z8&^jM#c@IGV2*cEbKPBQ1$k~nhlLD+PGF=MDE;K<7X}}kT)NHp^Ub^;6%1$Jm^DyH zp9Ccf2jsXJNqXF2g96{qO*uNlBt0={xvAxMnWqIEQ96U;Ttg*#hIVaK8T! zEVB~1zKfi2a7NZ}a2Rh`Ozn(aUCmwD%*;KTebIoKTFDpf+Xc#*<~l!F^deY?obfIi zy2fG?zho}(IpZyBCeS%#j<)QU)zj)FG&U6%{bp;zY?>`8{?5=;%$n34+Mh(-RGegP zG0xeAh@J#MS1S<$C+~{~K5Regv;NE~;_AKMeR7``zTddb@;UF`hA`~ao8B$mDUkvn zX8ipw<{}`XXCim``SB>cerv9)7Z?9PGM3nb5hW3aE9claW1{ppxWfGk52#?Ca5kjw zX}KoC8zhuD=h+1*$)B@&a^dHziZ?sBI)LVkk{sOITTHsugz~LK|iqJRc@G ziW0mB;2vOzWLFuH5tuDT>Iny96tfLa0r-OWoamv{;LqSF5C$j;G!w85?~knRwt}XP zpbw%mV*ico055`=g**+%4(Nq50Qg~9rM}aEixFd^90Y&!gyVNWo z5M!^y;6r{wfWo~w;0A|*a^WC6FtR#yVt8!8GMppIIf4i_5X}?K6N>|RmMV`@8_NzM z0kj?%hrkZ!kECfAh6C@2AcFG*2V(|r2Y!a<0(HLmn*oR-zre93N{C`2bdE3p(X(Y z1DOLDek0Z(IKaOE+AutE-heW^L6ri3f$D+TyJAs+ByEV{@U3w7@Ki{YC^_&-2s7}8 zDAVwwNCtox)D@3D_COvZjCTO(Kzt`MC>mH0L;|J9(hAZK zv`P47gjT=>5+$Mt5)juDn-Aj&-;)5wm3J;)1-}+h4dUYfd^Ma@XmH{LCP})2^ZDhni2QZ!yR~^9$HYUPj;C~Xv5Kalf5YU4S zM1hGwIicuKGO%NSJNwdy?`SN56ad9r=uzrW+Te*%=mI`D;d^p9kvZ`?i9(6rDC0v3 z-oW=F^uimwC0p4e$Ez4E809!X7$gqnfLeepzzA=dupD@Szz$$X=tX`(K3s{m6XXAm z(gfH93A_QpB8Ha^coxHi(LpDZCASe?5Zch!M~OKAS#S<;Tku`U7e1hvH+EA%Lxe5l zx2Pa@QNU2Z6d=LC^+3S@55NWTIieE41K}R-0S21YLuc18Nbr;d;=XFt+ys9Rb_OJqSP|7%$id^a?)>XZc3%6}t=li4aBs^$%G7 zE5zkh68_E4od_s*l?gIL(8a_I5Jexyp+*7C1pN!JhVsSEa_Y=v1|oxr|1!>6ILMT5 zvz+|>SFI{a>s6B&|HKN8lYLQwF3Y|6>L0ZKx{jL=;P)>Pd!>bre0rULf5-(H=GyaS zrFITj_mHA|d%X5M=_OJ1YjvprrM+_n`)*6%xut!)5opNp_i0-a7I@NEemaxzo z%;o*&7j;SoVNdl1KLJ)}D9c5eA0$-$o5=+syiT36&-pAy}A#6E&fZzIO|3JRQu^wJ@DlkNq`+6YKaa@ML&Kr&sWmQ zfjs+5UDb+1L_b}ePM`cCgeq=62ncpeao6j`J})O2qC7Z$>Ma&zhn&4Qj$M0Ak9$!y z{7aQE4A$BiWjkC9;v_Y)5MV6}K1W+?+q|NN~s%h8T#j{kwn zzr2V$h^<67-2t~LJt!#SOvg;{mjYRXuM&>D0OL_o5!$!J1SO1&T6)&9RYPWbYBFb= zCC6lM&2+~^m&~MfGq23a*23PlmVk`C`iU1ojsfB5g?IKuUlefDw^)zD^Mu_{tZCZDSiNb4@|~!_w}P)mi4Hnha*~z9|Yzq;Q$7MgH>$f8d(XDeg%o{AP2!YQ~?b zuwJfLbS7I%bi^Z0@rU6rwyq3yJX zx#O4I_wJ^M{ zZ237?rB+%0b!03*PvYOtD{Ld}6x@WLmAaDBMZ>I*Ij^ZC{Zc1+2^n4mt}M-Z+yk$g`4G2RukA6C zW+UO)KpL`V$K?pbum9$3!U zYsqy`JeckQpCZ#F66~XI%D*%z5vNPz%wKB=fN!|SS%J^!cA4QAO(xX+pbGlN1VO!x=B|Y(Mn;IpN z8p%o}`;7O@vq398zwiK*`cpmDNF5uLw#0_zk&YhmkYi2a|?{{_6Q58DFZ8?^P1=afVRsFEeGN5F~F@>kQv(>sx$n`xva~ zavT?>^<|Xk^T!cnCTBhswVzvEAOmIGn4}J?qN)&SLV^X^_Au!#Y|`?&1=-?6X`sUu zVu>EkJJ+_sAI$v@t5-B571mZAOtv0Q@g$-oGEamHxk4E-Gujon-qR4Zm#pWR=A*i% za%Rf~SKmQK-$5qdB0dOBu~o#(I$-5>E9?0oR(R0no%us{6Y}Nkhys<9sj}!e+sL%B zIjvbJ7EQ7IT(GfRo0`>PdCYO;+*c}1pCT49?jb-Vi|((Dp~KV#)xy@fCLg%28NMOB zz)wm%N;J4D5sBSu?A-7So%&Fbz3S22&)1tH;BqhFT;uO4%55lKQ@@li2yU?w7i?M% z_gpehQ_q*l%7=Thfw9ifX5_p&xxq72;%gA6W3F@7*_L%-?6?Ir^<(b{IoyQkZL;2a z!p@^`Q(+giK!yW<{70oR^6kdF7rQ5?h=&H%Pa)2&tc6GJ*e*CRR%tY+q_kyHnWnwC z%5Xi+EGMEF@+*#h8`^PfM=g!L2=*oC8io5#sB_&Ta#1mm$RBF+n+Z@!U zpgr?67PBtJW@`BA_}xkHltm^tEbHer!>J655~AiP4}sUZe^I*Rdgn&Wu7hDT zdC#lRlAXu}bPjKan+?_)=Nu=CVR&CZ^wl6HJJaX=5^1H1f}wgyEq=V(zR04q(om@; z+FA4OhbC2(iQypNxhp#VnaB|Pjc&*(aVjI%IinJV2(43(P^ogc2>nbUX|o@eNX38* zD;1##=>Xn~W%?e94)2 zLbdq4a+5nVHmM8qP5Dwc?8}B`anP|H_w3Gw8?&em={c&JxtlW~PB}Vv#SF_ky^nl( z4~yuLpl?qZ!7#sp(PNGJi9h;`YBlH$0=`A~8U@1!28FtX=`DYZCKl^>cj4^_c6?Nf zP<&I>R-!KyDK||oi76{b4*G1^A(c_?f_Rh~rRkvG#jy zZ5jcZIFDMu%mBVlw}8$BtJ#uIliB+?o(c^;$ulwyrnxFzerfe!KYM(Bk#6`FWhh@U z*??a&60I!@#o@ELcC(*6y_XaCN?YyRuf|cn-NSfjZP8&;ZoHeUOO0F8i+tGB55nOU zS%NTer~^}PT@Yg;2%mLTzjvYVNBufXysb7RN+RjUzIJ1GN6h7;sR9X6WA9ts{BbGL ze&91p*ZO$U7SLPf)afyB?mc}jaOyBw-${MyfZFMS)@dpNQfy_KKVO3HB&&NY9B=>0 z%W9jnwBVBz9_jU60t)D!MPX8J(A*`z6A;>&ucCMBd*5#+lzAH*TGbg~K0(+}g*~Ag zVve=YuunWz;L38sQg~;{A+Kb+|MA8q$GurE#GMyCPLNKBtykAy`M~CuWpmul?`4OxCJ{9ZNNs2FFkv%s^^#iRAFNxO#1kM+c~SW|Ec@ow&0!+HsV zgxmNHFWEhJQiH2uV-&+KZjXhGwQ1&d-*fauVVkpHTbOUkv0vyzd0@7U!t0ea*}=Uy zSIc7*X?$af&8AQL;65WEmw`!N)q9HOL9ahUkqSt6;kXaY?=FeaHU)B9F0)952@AI! zC9?0r(zmx{bEK6oCtuLKZ_qlc*DYqtSQVDcc`6oUxIKqCv8sFRjeWF@aMo%2DN93G zdB~={bC-N$fA&mGNM$w%ck7Mlh(U05vRLfOW<=-;E(<@BUa&?FGsO);T z{qZMbEN<}%vfPAWsVaNxl7B+|uMw5KxZ!D{c5vT z7e_BLl6zRSj(=b)k+VM|Uj0!Bl&B|+)b^PT7In=0f^aE(?pWue=!~ZHw5+X}>4EdD1}xZ(?96W~m2#8!O`4abp%PDC)q z}8+;C17D6fE^=VJi^iowKS9+ZcCIek7zgx6^Z;MFc zh7q+^v*J5{^b-(|B8=~4AUnarkx$YD54Np0Cf(L!o9YO+{{e2wn{8SR2t;?x{lc=@koT{$ZGb@^6zlkJph=#%ts4!=nrve(nO=+fvo z(tA=zuGo6vs)b-&er-u9MJ5}tB_fu(jH0*02=hoRWXRh;W;sOPk)!j3+hiG|pFLw# z_s>_z>Z2TN%Mz&UkrJ+L^wh6r?4F$E|H?&ZjKeZQd05=NRPls;*la}fg+Wj7LjEO5 zEk$@AnnQFRO!!vjo3>p)u(AS$wd-G3CZ8cm8~*3{K%si0*UvvmwHgGgV_l+WR65aR};z=Ko^u1N7tTHW~T;L8St7EN=&f(hlR>?sZ64-}?Hb;e;Dc2{r2L7HyILXZT>d&(Aj|4WLmK*DB zFL;!#bBPrylLq}$+kaLo<)2x2O^dlp(X@23=GC1|Yw&pwxOe@mSxj*WxhT1NjDQ24 zb1-Jn2%UOn&y*{j@>05C832`$$Spc-l;I!Rqhe{(W@Q>y-`ZseK*x{|VXbJ)tn za9p%MVI?f%D|7l1UwWpssDnG@urO)&Pb$++4$G&h;bOPwGeQrQ;`9h&A(kcDgUZm6 zxd2b;py%lkOZcts6;k!l(hWKxAI5{+ZPj?geKl2`^nPWO$T|dql^t4Z6s9_aHS?+P zL-C47mJ2{_c8Gn5A*Dpo=74Fn239}ip4kR9Yr#JazeqA#Kk0g862@wQ(}Ow7pNg~6 zar#G^#!L|`kZEtWT(6O@g;yGCc zgOWa)M08KEEzTa#l9|eGf|k2%tndoLmus-6^=~KB_VcyOYO*>Y2Jb~X=*Z-Czn84f z|Kg+c!J~axn^yXLd5O~Xb2Y&dDu-`P^ z(j(O6bRbs`N~s^^nYErMQ0Ft)(24Sq`8*-~Al2K6ul~2PAxAngcI`>bMhSDH$0u(8R5tEOUpmE~ z!53UIf4g;a^r~Ih``Q<~AleV@%_EKj1}2dEBf*DmvK&{r4cCU&Lp;C9g!_G|`JPpX z>g$%ZNNQwTW=MDARjTV%3jdXs%N3aXq1N^4fd6WH|8MnGyYTy&sTa5h{ar6zl%^m#03Tvhes9H^?oghA!J&Sg$+$x*{r8+3|^3 zO{Z#LJ-$xwh*nnw36>?)FUzm%}=qvUB&HMBf*DA$Q z?V-YDOf!u3JY8uS(D~6a;6`I zlG|q;g}SYrC3e8#J?(PKsVo|cL`e?1)sva1#XoD)BAF-4#n#hKPSsZ+ibxF= z>GB>G0$LfoPf|eG{%Bi0DaDVX)Jg)`vgCJ$taO1Igq0H)nxR-)pkFxU%oo3;sw*^! z)cs~4C34166-!prip@3{(0m)5^0n(U91VAnFU;vr0ea33i2NzOr63Gg)gqs~4wFT& znUYC%&@`-C>XS&KS_rNf_T39+u)JibQdn-uZ=Kl6XEWY1X?_Vi4B9Nvs7z7a=OwQH zS>asopi`o|RjXNFVbZ)4T`;KeNFztD@KD#lTvIu<7?s}pr=UQdspEyqOf`TP5=(&Q6P~B-krU{9sxC)-Jw=Nwjpv=#%E=QngS> zyj7J(YbDzkO#g;Mw(hUBe{65e|GD^v_Ndk_oZKSsN75CyM3zj(0Bei|6$c!+u%dc2 zos}2hpVVsq=B99NS(6E12Cuh=epz&GoX6SilGrZ_&s-kr4#?DQb%yNv4HHYxu%vlK zVQU*nGE1YH@Y=ejHSohhW)wrHCY6AopSg=88_y9J|b|Y&Rqeki} zJ6Q-8zoG{0R}>@RdGA_hatn{Tx?PPaz6xs>9Gw=oXS}XTBei}y#Agbq*j{2yLU{90 zrMbQ2vo=Q6E0*^5yI9*XT|>SanY;Ot)Dr`d2jH;=!h=c0kYtoKVdB&8ip-jVO2Tud zxB-o}c$SJ7c7a7CHAVroOdE;GVU!Y{!r_zvJj=}vMgI9FJgl`_x^5lEo%)no+Qojd zDs^=-8+D2e!hF7N^$V!DQ`&UOgk-$q3<17l+n&iD4L3UGSGp z+8%o09&$IchiMS}^r>0?<{wQ72JJmTKhn>;+#%v9*%sDnDq_%L1bV6}Rb3G1lsRtr{F z0kW;crTus_&Wrc^NX~9aM-_pJ+0+lUQw4Ux3Uk$m&hI8_byiRyJ79cw)eE3*3Hb4epr$HoaJTN!6B$0?O3MyV(Z1=< z%zMQO2SI+JTnt^$h&m3y1BurxuD96hsrkD0`p@7E`IM19zPl!RNZ)RkBoUNk;|W)N zDh&76cCjq>`_>xHMey4F`PvTucgmX4N z{|E^*2U9Y$ZZ@YD{@Ys#lcgQPnQszpajtGOadS*bYiKo^HkSf==K9s`ej&4!tnEBs z!3q!O{8z?KSv()<_1HeGxBQ*&bUpi>#5-?5z3*Zm5-oE5pr_OsC!?dn#AKk4`c(eLcxq1(M$6!yuk9Wy;WM?gZ$!>e&XP8vFIBWu z6s$FuDyyS%11dRNix$iHd<(G5c@Mh)tqqH3nkuPF7S1PmDXja-q9&gYiH?unr+Y2( ziD`T%Vpz%+{BUgtw!QKuuyA#-ZCR{R@B5Wg`FXn>__GE2#Kz{{IoHhOR!{l|hZIh~ zWB*9)B*!ZuTZHETDh4<1HpS5_vRBosK9^pz~v^nD==q(Dp*?k?|^m*$S3mGiiIKl$`9zfX`S8=WCPso&xI}xgA#z zc>KjmYOxlc6<<;lp27W*4_{XXS$-r;j70!T7;pudEG*z$Gj9=eIe8sxQq6q$wtYD6 z6oj})Xu9wCIKvm?Rkf7O-ER@JWa1=)6Xymco%j+X>FK=35|gJbb`$#m#QCXm2cy4C z-<7-Hc0P=Vs4ptdb-V=D|HZe-kd+$wT-;Yb_V?6NATd&^bS+pX6MM+Q!nDi@?8M1M zqKr6_Q2wbxVQ{`L2B|NMrHi3PImV4Qk7m?0?Wq4k+In&#~8@Dgi<0{an zAyGOxVH-j}@TsDuqmYlS@mvF8UHw?Vw+xxYy%7WzH}{O%!?BePQVHjyOk6EVu&tTN-eX}p!Gco^w|e()O>_ZH|D!A*%e=PtRG;U^91(o7 zRHm9d5(~D#%;MNu>Xu0I%EAbTs z9vWrzteUm@Nb%wEm;N(C=AFzP_FcRK&(RhKSuT0l9(lBKlT+A^;a8*ew5s)p=%njjf(%x1NJfcpdcot+!t&PFnBdd1gg90)PfoA}p|g z!6MnzG&du|SI| zmCseF-nd>Nj?q^~=sA|6Xt%0UNa{mu_tI`_KGyqEZj;pvw z)A4|RQ8TsM^71pe)&f7-S<`D(!Qrc0S@eH%8{KbJPo!=kv3aSQKgtG6R_BcCH7qSJ zguHz%K&QnA7}oaRl!hi*nbtiYL;qmNXlCj~=vV>~LfPi6&znzB9@#mORBg#L#rLFc z>u4z=EMpxf-b&+Dq(;V!h&$BUt+9K$FU83_{&me zNXN<*i097M`P)V^tKFyk=P$P;TkY0@Gfrx&$dvfXGKfp z>#2O$@MOp!JqT8gj(8Y@+zdR^7bI?|nfi_lo9x~RwhsH**}ey|jiZOQ6+$I++1oLS z5WYDZ8GQ$SjY8#uifKr?W61k=vw%rNr`W+wW6a8HUKUW_;Q4fgNzj%@y0<^8jOieAl6 zy-gOk{^p9Xt?UJA=Pi&zOckya6DxyJvI``tkFu%iNt0feIO5t!=efid#wdc8R!Ov)+iPj=^WVm;UA_`$SMZhW%f=}!(hdwZkL z-8@~s&w0LmooT+AY43dooIXt0x9}o=4Ge9b@%bX1-U8}7+#z1p9sQCS-^z;6d?&W^ zz8(JdS~}!m26~Exa5vlVU9GIrR0H+Ldc}9G(r*L$ci**a9~G|J0%9dUbyH)l0^Jk}U~xa)f5Sf2gROc^V+=1|^?! zP}cJ68A5-}RT7{pDD=^hjb1nF=*aMHXqaYsKh3#$H_g^}BU{qhT)w$w-oRgi&~RR7 zG@w&L*6>~S?=`htO*I;go#T5T3Z$5P@1!viDQsK?mRry4%oi_|@u4L%Y4f@0e3*49 zFz%E})>(NAOL~1OF?Mse!_FXJDx^!4#(x{`$fqE^USjYrJ}9Xp&am!2z4h-}JgCJP_#h=nnn%wD=g;6};UrHvCbM?Vehk=lqeg|R$EHU(GtE#`6;hmKAp_QRYl8d8nhI+;5OuxK)lXi!i0={70(hFCz~-8FCnstf(VGyJ{pv!_G#S zk}?hUKfe8BQZc!$4)mDZKc-Nlh`5wAeyI2J&KMWxJttplXP)mZbbN)@?DX|eWd7rc z2k`gWMyalzCH#=JizsR2wae!YKw@rkQSDSXl~Y8=x>PMhoP?gmsL!mx3tT&7C+i`gU`7xy0-e+_F?mP(KKr zUe0_$p2(%$doLds39~%!QE1ul{=_4-RK5{y*`AFumX@Gan^~K3!+0sAl`im=MV!5+B``)BHd$ZNgAg#*2grW;?j z$#x&zj!x`fWC&(XczYf$(l@!41k}m?e4m;=0tI&`4PH1Ec(sCQ?R%P9(%m%j=q9do zzr5@sm_teU@C$6F@qe)*X3k`Fe|9>+#T{^vN^s>3^uhmJ#vm+AGJ}GcJYuXY@Lth; z-lvXgpC%M|tDTcWp%~@s^(>A_lX@{V#v5+Wn!2MjQL0PUxSq}|%nN5_QacMf5pM`j z4XOS+PA*3qcdlR;J4|nh+u?Rio1gG4fhIA8>Qo_usPf!(i(Z!+_gO545s@J3!JCxv zrF{B|)>$%yOyXUd3_l^gVwZ2UzW;N{xvi}yZ~dCB=3?|n?BbV2Bg?E<&x)KDX4gSn(~9cDDK5 zA;F`&$NY??z-)EznfqE$oKwH#bm9r?H+Q)pfXxc739b)hQxLJ$g9MR9_9^nevv}7% z2AQ{;lvN7;5%z=jZzkYKwm+V=U^yD1)>%TVft;iV-8}S)zC`0mtlXmeco|<&xROPMyM%=FF|VSzVQTmrt(|Ec)0VKIY6=6X z^$nIe+JbIRVaWRGJvDl7W~k+gEx611V)1(2C(2{guKZX?gK>@Y433FxQseH$D>>P7 zU`shNccd%MXM2YN@%|IXp>LekZnf1{22!ir_wTBabMCMYLR-HKcZ=0v@ca{Vb>bZK#}lRNZ}%DSz4=URY+N))1r|^}fbhJt4UvL% z@BM`^izt1!+ScFxF8&WF$Tu^@(=@OmwvmY!WGu_C~IDgMfm0+u(bU%hdPJsP$ zDi^Cz&7VEi9$lB#y^MlqFJ24NMW!BwFkFMInJL>YGUrARXCu?*qdg}0tgCj_kLj?K zj(qQI=N7|_Q}F!vJyrL`RBR@F?#))R$3oqG(&3KawVJs^t0-fLviGv*#U-{SSM-lz z3NQP(cRfs#&b4V1UB+$4g`qEov+p(T3bD~H;u?eJKbLXPo#}5)JK+RleVtq<*qUzV zIk3kt9Ox3>K~31|e23a~wzJ8y(bvD+07b>{Xn?x208wUq9owS31iLOUm7xV(n1!dq zCih!`?&tbQxmZ5ho;3GgFNo&sgV+mZy6Xb(bD;Pby(lI32C?7FuUQPGR%>hyD;6Jl zE_@Ga$GugDIu<$0R)`C3bqF&3-x9}4w3lLU8bwP%by#HW0$Nt zLK;F}duTzjduzAeW9uh6W46pIsR;MAX0$Ukk}55-FNqC7RC56_MAmhw8w(&UZ#V*R zg;A#udzXZkW2~%YkY;2}7iF4bn-IdvspOv$M|Vcw#?lE@(^XT?qEU8m-kKhmUW+Lgxauv1q#E>rujp zeO%a0+2MLOCVC~R3Au%qI~x|;uMzaCEtYE$-{c3u8PT@!s^IJ1b|%Bxp6#NX=Yxxn zkYlk9vNqKN!`^MXz1Zgmp7VGwL7cQ(CCbrdp8-H)Pu0trtSCD0J|O+|5y8TD$*QMk zw~X;5zQH{&RcfjuPUiZ#w>Y3z(57YVVFVpkix1sq2j9*Cb(8@YD7_|s{=OpJ=oMOs z){^m>r(X)qSW91hx^CDu_Sh5>#@4?IeITbVR>*(4?^KS>1WL~@n@HZzEbQG-u3EI% z*W7ch*3kLiXT4@_Uc_c@llH_PETY;(ZnVDm`u(m+o>Rt~PzLXyUpK zdEElvI$z)KaV5BP$EKy{+Ka+{8JhG{ADr}q{(R_-M;)Bpo|+kbx%}DQb(+Trxs^I- zX71tTw(z^aVAuM1i~UVF!P{K*#blB^5r!?cMa2L5bpK=+9uM2H&%u@(_kVp^O?wbd z5z+^ETSoh*asb&Z{2Yl>*;CxmN`GrPZ%3tX4?UPg`)5+w5pqqSU}rp3qf9+5qD%pE zut)valAEOG4X4RwTo~{1M;pF8zG7VRkH1h!0M8p=XWq3+-My0Ty2d}h{%VV9e1*J| zkU1WG@(=q1_v&DNEvTBlp7s7kxK$2h7xmgJsSC=Ipe%%a@DzS}^tcUJrGF7_tXL + \ 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..5b485254ed8a167e1436b9a335b454a3683aa09f GIT binary patch literal 20624 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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("^