diff --git a/AA_BLANK/build.gradle.kts b/EjaTv/build.gradle.kts similarity index 100% rename from AA_BLANK/build.gradle.kts rename to EjaTv/build.gradle.kts diff --git a/AA_BLANK/src/main/AndroidManifest.xml b/EjaTv/src/main/AndroidManifest.xml similarity index 100% rename from AA_BLANK/src/main/AndroidManifest.xml rename to EjaTv/src/main/AndroidManifest.xml diff --git a/EjaTv/src/main/kotlin/com/lagradost/EjaTv.kt b/EjaTv/src/main/kotlin/com/lagradost/EjaTv.kt new file mode 100644 index 0000000..d017ef5 --- /dev/null +++ b/EjaTv/src/main/kotlin/com/lagradost/EjaTv.kt @@ -0,0 +1,120 @@ +package com.lagradost + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.utils.AppUtils.parseJson +import com.lagradost.cloudstream3.utils.AppUtils.toJson +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities +import org.jsoup.nodes.Element + +class EjaTv : MainAPI() { + override var mainUrl = "https://eja.tv" + override var name = "Eja.tv" + + // Universal language? + override var lang = "en" + override val hasDownloadSupport = false + + override val hasMainPage = true + override val supportedTypes = setOf( + TvType.Live + ) + + private fun Element.toSearchResponse(): LiveSearchResponse? { + val link = this.select("div.alternative a").last() ?: return null + val href = fixUrl(link.attr("href")) + val img = this.selectFirst("div.thumb img") + val lang = this.selectFirst(".card-title > a")?.attr("href")?.removePrefix("?country=") + ?.replace("int", "eu") //international -> European Union 🇪🇺 + return LiveSearchResponse( + // Kinda hack way to get the title + img?.attr("alt")?.replaceFirst("Watch ", "") ?: return null, + href, + this@EjaTv.name, + TvType.Live, + fixUrl(img.attr("src")), + lang = lang + ) + } + + override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { + // Maybe this based on app language or as setting? + val language = "English" + val dataMap = mapOf( + "News" to mapOf("language" to language, "category" to "News"), + "Sports" to mapOf("language" to language, "category" to "Sports"), + "Entertainment" to mapOf("language" to language, "category" to "Entertainment") + ) + return HomePageResponse(dataMap.apmap { (title, data) -> + val document = app.post(mainUrl, data = data).document + val shows = document.select("div.card-body").mapNotNull { + it.toSearchResponse() + } + HomePageList( + title, + shows, + isHorizontalImages = true + ) + }) + } + + override suspend fun search(query: String): List { + return app.post( + mainUrl, data = mapOf("search" to query) + ).document.select("div.card-body").mapNotNull { + it.toSearchResponse() + } + } + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + val sections = + doc.select("li.list-group-item.d-flex.justify-content-between.align-items-center") + + val link = fixUrl(sections.last()!!.select("a").attr("href")) + + val title = doc.select("h5.text-center").text() + val poster = fixUrl(doc.select("p.text-center img").attr("src")) + + val summary = sections.subList(0, 3).joinToString("
") { + val innerText = it.ownText().trim() + val outerText = it.select("a").text().trim() + "$innerText: $outerText" + } + + return LiveStreamLoadResponse( + title, + url, + this.name, + LoadData(link, title).toJson(), + poster, + plot = summary + ) + } + + data class LoadData( + val url: String, + val title: String + ) + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val loadData = parseJson(data) + + callback.invoke( + ExtractorLink( + this.name, + loadData.title, + loadData.url, + "", + Qualities.Unknown.value, + isM3u8 = true + ) + ) + return true + } +} \ No newline at end of file diff --git a/EjaTv/src/main/kotlin/com/lagradost/EjaTvPlugin.kt b/EjaTv/src/main/kotlin/com/lagradost/EjaTvPlugin.kt new file mode 100644 index 0000000..644a44d --- /dev/null +++ b/EjaTv/src/main/kotlin/com/lagradost/EjaTvPlugin.kt @@ -0,0 +1,14 @@ + +package com.lagradost + +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class EjaTvPlugin: Plugin() { + override fun load(context: Context) { + // All providers should be added in this manner. Please don't edit the providers list directly. + registerMainAPI(EjaTv()) + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index c43f610..ad92eb9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -97,5 +97,6 @@ include( "JKAnimeProvider", "AnimekisaProvider", "AnimeIndoProvider", - "KuronimeProvider" + "KuronimeProvider", + "EjaTv", )