From b35055be1e29e89bf51b1c32302c0cc3e908b634 Mon Sep 17 00:00:00 2001 From: CakesTwix Date: Sun, 6 Aug 2023 21:39:20 +0300 Subject: [PATCH] =?UTF-8?q?hentaiukr:=20=F0=9F=8D=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HentaiUkrProvider/build.gradle.kts | 28 ++++ .../src/main/AndroidManifest.xml | 2 + .../kotlin/com/lagradost/HentaiUkrPlugin.kt | 13 ++ .../kotlin/com/lagradost/HentaiUkrProvider.kt | 124 ++++++++++++++++++ .../com/lagradost/models/ObjectsModel.kt | 82 ++++++++++++ 5 files changed, 249 insertions(+) create mode 100644 HentaiUkrProvider/build.gradle.kts create mode 100644 HentaiUkrProvider/src/main/AndroidManifest.xml create mode 100644 HentaiUkrProvider/src/main/kotlin/com/lagradost/HentaiUkrPlugin.kt create mode 100644 HentaiUkrProvider/src/main/kotlin/com/lagradost/HentaiUkrProvider.kt create mode 100644 HentaiUkrProvider/src/main/kotlin/com/lagradost/models/ObjectsModel.kt diff --git a/HentaiUkrProvider/build.gradle.kts b/HentaiUkrProvider/build.gradle.kts new file mode 100644 index 0000000..f676d6f --- /dev/null +++ b/HentaiUkrProvider/build.gradle.kts @@ -0,0 +1,28 @@ +// use an integer for version numbers +version = 1 + +dependencies{ + implementation("com.google.code.gson:gson:2.9.0") +} + +cloudstream { + language = "uk" + // All of these properties are optional, you can safely remove them + + description = "Сайт виконаний на некомерційній основі з вірою у Українську спільноту." + authors = listOf("CakesTwix") + + /** + * Status int as the following: + * 0: Down + * 1: Ok + * 2: Slow + * 3: Beta only + * */ + status = 1 // will be 3 if unspecified + tvTypes = listOf( + "NSFW", + ) + + iconUrl = "https://www.google.com/s2/favicons?domain=hentaiukr.com&sz=%size%" +} diff --git a/HentaiUkrProvider/src/main/AndroidManifest.xml b/HentaiUkrProvider/src/main/AndroidManifest.xml new file mode 100644 index 0000000..29aec9d --- /dev/null +++ b/HentaiUkrProvider/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/HentaiUkrProvider/src/main/kotlin/com/lagradost/HentaiUkrPlugin.kt b/HentaiUkrProvider/src/main/kotlin/com/lagradost/HentaiUkrPlugin.kt new file mode 100644 index 0000000..6d45b5e --- /dev/null +++ b/HentaiUkrProvider/src/main/kotlin/com/lagradost/HentaiUkrPlugin.kt @@ -0,0 +1,13 @@ +package com.lagradost + +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class HentaiUkrProviderPlugin: Plugin() { + override fun load(context: Context) { + // All providers should be added in this manner. Please don't edit the providers list directly. + registerMainAPI(HentaiUkrProvider()) + } +} diff --git a/HentaiUkrProvider/src/main/kotlin/com/lagradost/HentaiUkrProvider.kt b/HentaiUkrProvider/src/main/kotlin/com/lagradost/HentaiUkrProvider.kt new file mode 100644 index 0000000..e76bf92 --- /dev/null +++ b/HentaiUkrProvider/src/main/kotlin/com/lagradost/HentaiUkrProvider.kt @@ -0,0 +1,124 @@ +package com.lagradost + +import android.util.Log +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.lagradost.cloudstream3.Episode +import com.lagradost.cloudstream3.HomePageResponse +import com.lagradost.cloudstream3.LoadResponse +import com.lagradost.cloudstream3.MainAPI +import com.lagradost.cloudstream3.MainPageRequest +import com.lagradost.cloudstream3.SearchResponse +import com.lagradost.cloudstream3.SubtitleFile +import com.lagradost.cloudstream3.TvType +import com.lagradost.cloudstream3.addEpisodes +import com.lagradost.cloudstream3.app +import com.lagradost.cloudstream3.mainPageOf +import com.lagradost.cloudstream3.newAnimeLoadResponse +import com.lagradost.cloudstream3.newAnimeSearchResponse +import com.lagradost.cloudstream3.newHomePageResponse +import com.lagradost.cloudstream3.newMovieLoadResponse +import com.lagradost.cloudstream3.newTvSeriesLoadResponse +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities +import com.lagradost.models.CfgModel +import com.lagradost.models.ObjectsModel + +class HentaiUkrProvider : MainAPI() { + + // Basic Info + override var mainUrl = "https://hentaiukr.com" + override var name = "HentaiUkr 18+" + override val hasMainPage = true + override var lang = "uk" + override val hasDownloadSupport = true + override val supportedTypes = setOf( + TvType.NSFW, + ) + + private val listCfgJSONModel = object : TypeToken>() { }.type + + // Sections + override val mainPage = mainPageOf( + "https://hentaiukr.com/search/objects.json" to "\uD83D\uDD1E Хентай", + ) + + // Done + override suspend fun getMainPage( + page: Int, + request: MainPageRequest + ): HomePageResponse { + val document = app.get(request.data).text + // Log.d("CakesTwix-Debug", document) + val parsedJSON = Gson().fromJson(document, ObjectsModel::class.java).video + + + val homeList = parsedJSON.map { + newAnimeSearchResponse(it.name, "$mainUrl${it.url}", TvType.NSFW) { + this.posterUrl = "$mainUrl${it.thumb}" + this.otherName = it.orig_name + } + } + // Log.d("CakesTwix-Debug", "$cdnUrl${parsedJSON.data[1].posterId}") + return newHomePageResponse(request.name, homeList) + } + + override suspend fun search(query: String): List { + return emptyList() + } + + // Detailed information + override suspend fun load(url: String): LoadResponse { + val parsedJSON = Gson().fromJson>(app.get(url + "plur.cfg.json").text, listCfgJSONModel) + val document = app.get(url).document + + + //Log.d("CakesTwix-Debug", document.select("div[id*=year]").text().substringAfterLast(": ")) + val episodes = mutableListOf() + parsedJSON.forEachIndexed { index, cfgModel -> + episodes.add( + Episode( + "$url, $index", + "Серія ${index + 1}", + episode = index + 1, + posterUrl = "$mainUrl${cfgModel.poster}" + ) + ) + } + return newTvSeriesLoadResponse( + document.select("#name-ukr").text(), url, TvType.NSFW, episodes + ){ + this.posterUrl = "$mainUrl${document.select("#img-placeholder img").attr("src")}" + this.plot = document.select("#about").text() + this.year = document.select("div[id*=year]").text().substringAfterLast(": ").toIntOrNull() + this.tags = document.select("div.tag").map { it.select("div.name").text() } + } + } + + // It works when I click to view the series + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val dataList = data.split(", ") + + val parsedJSON = Gson().fromJson>(app.get("${dataList[0]}plur.cfg.json").text, listCfgJSONModel)[dataList[1].toInt()] + parsedJSON.sources.forEach { + // Add as source + val quality = with(it.size){ + when{ + this == 1080 -> Qualities.P1080.value + this == 720 -> Qualities.P720.value + this == 480 -> Qualities.P480.value + else -> Qualities.Unknown.value + } + } + callback(ExtractorLink("${dataList[0]}${it.src}","Серія ${dataList[1] + 1}", "${dataList[0]}${it.src}", + dataList[0], + quality, false)) + } + return true + } +} diff --git a/HentaiUkrProvider/src/main/kotlin/com/lagradost/models/ObjectsModel.kt b/HentaiUkrProvider/src/main/kotlin/com/lagradost/models/ObjectsModel.kt new file mode 100644 index 0000000..9f1486f --- /dev/null +++ b/HentaiUkrProvider/src/main/kotlin/com/lagradost/models/ObjectsModel.kt @@ -0,0 +1,82 @@ +package com.lagradost.models + +import com.google.gson.annotations.SerializedName + +data class ObjectsModel ( + + @SerializedName("manga") val manga : List, + @SerializedName("video") val video : List