diff --git a/AniageProvider/build.gradle.kts b/AniageProvider/build.gradle.kts
deleted file mode 100644
index e5dd16b..0000000
--- a/AniageProvider/build.gradle.kts
+++ /dev/null
@@ -1,30 +0,0 @@
-// use an integer for version numbers
-version = 12
-
-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(
- "Anime",
- "AnimeMovie",
- "OVA",
- )
-
- iconUrl = "https://www.google.com/s2/favicons?domain=watari-anime.com&sz=%size%"
-}
\ No newline at end of file
diff --git a/AniageProvider/src/main/AndroidManifest.xml b/AniageProvider/src/main/AndroidManifest.xml
deleted file mode 100644
index 29aec9d..0000000
--- a/AniageProvider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/AniageProvider/src/main/kotlin/com/lagradost/AniageProvider.kt b/AniageProvider/src/main/kotlin/com/lagradost/AniageProvider.kt
deleted file mode 100644
index 4d36292..0000000
--- a/AniageProvider/src/main/kotlin/com/lagradost/AniageProvider.kt
+++ /dev/null
@@ -1,316 +0,0 @@
-package com.lagradost
-
-import com.google.gson.Gson
-import com.google.gson.reflect.TypeToken
-import com.lagradost.cloudstream3.DubStatus
-import com.lagradost.cloudstream3.Episode
-import com.lagradost.cloudstream3.HomePageResponse
-import com.lagradost.cloudstream3.LoadResponse
-import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
-import com.lagradost.cloudstream3.MainAPI
-import com.lagradost.cloudstream3.MainPageRequest
-import com.lagradost.cloudstream3.SearchResponse
-import com.lagradost.cloudstream3.ShowStatus
-import com.lagradost.cloudstream3.SubtitleFile
-import com.lagradost.cloudstream3.TvType
-import com.lagradost.cloudstream3.addDubStatus
-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.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.M3u8Helper
-import com.lagradost.models.AnimeDetail
-import com.lagradost.models.EpisodesModel
-import com.lagradost.models.FindModel
-import com.lagradost.models.PageProps
-import com.lagradost.models.TeamsModel
-import org.json.JSONArray
-import org.json.JSONObject
-
-class AniageProvider : MainAPI() {
-
- // Basic Info
- override var mainUrl = "https://watari-anime.com"
- override var name = "Watari Anime"
- override val hasMainPage = true
- override var lang = "uk"
- override val hasDownloadSupport = true
- override val supportedTypes =
- setOf(
- TvType.Anime,
- TvType.AnimeMovie,
- TvType.OVA,
- )
-
- private val apiUrl = "https://master.api.aniage.net"
- private val findUrl = "https://finder-master.api.aniage.net/?query="
- private val imageUrl = "https://image.aniage.net"
- private val videoCdn = "https://aniage-video-stream.b-cdn.net/"
- private val pageSize = 999
-
- private val listEpisodeModel = object : TypeToken>() {}.type
- private val listTeamsModel = object : TypeToken>() {}.type
- private val listPageModel = object : TypeToken>() {}.type
-
- // Sections
- override val mainPage =
- mainPageOf(
- mainUrl to "Нове",
- mainUrl to "Повнометражне",
- mainUrl to "ONA",
- mainUrl to "OVA",
- mainUrl to "SPECIAL",
- mainUrl to "ТБ-Серіал",
- mainUrl to "ТБ-Спешл",
- mainUrl to "Короткометражне",
- )
-
- // Done
- override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse {
- val body = JSONObject()
-
- val cleanup =
- with(request.name) {
- when {
- this == "Нове" -> JSONArray()
- else ->
- JSONArray()
- .put(
- JSONObject()
- .put("property", "type")
- .put("type", "=")
- .put("value", JSONArray().put(this))
- )
- }
- }
-
- body.put("cleanup", cleanup)
- val orderBody = JSONObject()
- orderBody.put("by", "lastUpdated")
- orderBody.put("direction", "DESC")
-
- body.put("order", orderBody)
- body.put("page", page)
- body.put("pageSize", 30)
-
- val document = app.post("$apiUrl/v2/anime/find", json = body).text
- val parsedJSON = Gson().fromJson(document, FindModel::class.java)
- // Log.d("CakesTwix-Debug", parsedJSON.data[0].title)
-
- val homeList =
- parsedJSON.data.map {
- newAnimeSearchResponse(it.title, it.id, TvType.Anime) {
- this.posterUrl = "$imageUrl/main/${it.posterId}?width=296"
- addDubStatus(isDub = true, it.episodes)
- this.otherName = it.alternativeTitle
- }
- }
- // Log.d("CakesTwix-Debug", "$cdnUrl${parsedJSON.data[1].posterId}")
- return newHomePageResponse(request.name, homeList)
- }
-
- override suspend fun search(query: String): List {
- val animeJSON =
- Gson().fromJson>(app.get("$findUrl$query").text, listPageModel)
- val findList =
- animeJSON.map {
- newAnimeSearchResponse(it.title, it.id, TvType.Anime) {
- this.posterUrl = "$imageUrl/main/${it.posterId}?width=296"
- addDubStatus(isDub = true, it.episodes)
- this.otherName = it.alternativeTitle
- }
- }
- return findList
- }
-
- // Detailed information
- override suspend fun load(url: String): LoadResponse {
- val animeID = url.replace("$mainUrl/watch?wid=", "").replace("$mainUrl/", "")
- val document = app.get("$mainUrl/watch/$animeID").document
- val jsonObject = JSONObject(document.selectFirst("script[type*=application/json]")!!.html())
- val buildId = jsonObject.getString("buildId")
-
- // https://www.aniage.net/_next/data/IfKYt_B-o41irAex5hZoV/watch.json?wid=96dcb9ce-e4bc-4248-8ed3-29c3d14aedfc
- // Log.d("CakesTwix-Debug", "$mainUrl/_next/data/$buildId/watch.json?wid=$animeID")
- val animeJSON =
- Gson()
- .fromJson(
- app.get("$mainUrl/_next/data/$buildId/watch.json?wid=$animeID").text,
- AnimeDetail::class.java
- )
- // Log.d("CakesTwix-Debug", animeJSON.pageProps.title)
-
- val showStatus =
- with(animeJSON.pageProps.titleStatus) {
- when {
- contains("Онгоїнг") -> ShowStatus.Ongoing
- contains("Вийшло") -> ShowStatus.Completed
- else -> null
- }
- }
-
- val tvType =
- with(animeJSON.pageProps.type) {
- when {
- contains("ТБ-Серіал") -> TvType.Anime
- contains("ТБ-Спешл") -> TvType.Anime
- contains("OVA") -> TvType.OVA
- contains("SPECIAL") -> TvType.OVA
- contains("ONA") -> TvType.OVA
- contains("Повнометражне") -> TvType.AnimeMovie
- contains("Короткометражне") -> TvType.AnimeMovie
- else -> TvType.Anime
- }
- }
-
- val trailer =
- with(animeJSON.pageProps.trailerUrl) {
- when {
- this.isNullOrEmpty() -> null
- contains("https://iframe.mediadelivery.net/embed") ->
- app.get(this)
- .document
- .select("source[type*=application/x-mpegURL]")
- .attr("src")
- else -> null
- }
- }
-
- // Episodes
- val episodes = mutableListOf()
-
- // Log.d("CakesTwix-Debug",
- // app.get("https://master.api.aniage.net/anime/episodes?animeId=$animeID&page=1&pageSize=$pageSize&sortOrder=ASC&teamId=${animeJSON.pageProps.teams[0].teamId}&volume=1").url)
- if (animeJSON.pageProps.teams.isNotEmpty()) {
- Gson()
- .fromJson>(
- app.get(
- "$apiUrl/anime/episodes?animeId=$animeID&page=1&pageSize=$pageSize&sortOrder=ASC&teamId=${animeJSON.pageProps.teams[0].teamId}&volume=1"
- )
- .text,
- listEpisodeModel
- )
- .map {
- val episodeName =
- if (it.title == "." || it.title == it.episodeNum.toString())
- "Серія ${it.episodeNum}"
- else it.title
- episodes.add(
- Episode(
- "${it.animeId}, ${it.episodeNum}",
- episodeName,
- episode = it.episodeNum,
- // posterUrl = "$imageUrl/main/${it.previewPath}",
- )
- )
- return@map
- }
- }
- return newAnimeLoadResponse(
- animeJSON.pageProps.title,
- "$mainUrl/watch?wid=$animeID",
- tvType,
- ) {
- this.posterUrl =
- "$imageUrl/main/${animeJSON.pageProps.posterId}?optimize=image&width=296"
- this.engName = animeJSON.pageProps.alternativeTitle
- this.tags = animeJSON.pageProps.genres.map { it }
- this.plot = animeJSON.pageProps.description
- addTrailer(trailer, addRaw = true)
- this.showStatus = showStatus
- this.duration = animeJSON.pageProps.averageDuration
- addEpisodes(DubStatus.Dubbed, episodes)
- this.year = extractIntFromString(animeJSON.pageProps.season)
- }
- }
-
- // It works when I click to view the series
- override suspend fun loadLinks(
- data: String,
- isCasting: Boolean,
- subtitleCallback: (SubtitleFile) -> Unit,
- callback: (ExtractorLink) -> Unit
- ): Boolean {
- // animeID, Num Episode
- val dataList = data.split(", ")
-
- // Get Episodes List
- val document = app.get("$mainUrl/watch/${dataList[0]}").document
- val jsonObject = JSONObject(document.selectFirst("script[type*=application/json]")!!.html())
- val buildId = jsonObject.getString("buildId")
-
- val animeJSON =
- Gson()
- .fromJson(
- app.get("$mainUrl/_next/data/$buildId/watch.json?wid=${dataList[0]}").text,
- AnimeDetail::class.java
- )
-
- var stringTeam = "$apiUrl/anime/teams/by-ids?"
- animeJSON.pageProps.teams.map { teams -> stringTeam += "ids=${teams.teamId}&" }
- // /anime/teams/by-ids?ids=e6bff5dc-354b-4fda-98b3-c29c12931070&ids=31d156c3-1596-4dd0-8736-a01f7793c5de
- // /anime/teams/by-ids?ids=e6bff5dc-354b-4fda-98b3-c29c12931070ids=31d156c3-1596-4dd0-8736-a01f7793c5deids=c7ea3994-2841-4798-b39d-5d9389409f59
-
- // For names
- Gson().fromJson>(app.get(stringTeam).text, listTeamsModel).forEach {
- teamName ->
- Gson()
- .fromJson>(
- app.get(
- "$apiUrl/anime/episodes?animeId=${dataList[0]}&page=1&pageSize=$pageSize&sortOrder=ASC&teamId=${teamName.id}&volume=1"
- )
- .text,
- listEpisodeModel
- )
- .map {
- if (it.episodeNum == dataList[1].toIntOrNull()) {
- when {
- it.playPath != null ->
- M3u8Helper.generateM3u8(
- source = teamName.name,
- streamUrl =
- app.get(it.playPath)
- .document
- .select("source")
- .attr("src"),
- referer = mainUrl
- )
- .forEach(callback)
- it.s3VideoSource != null ->
- M3u8Helper.generateM3u8(
- source = teamName.name,
- streamUrl = "$videoCdn${it.s3VideoSource.playlistPath}",
- referer = apiUrl
- )
- .forEach(callback)
- it.videoSource != null ->
- M3u8Helper.generateM3u8(
- source = teamName.name,
- streamUrl =
- app.get(it.videoSource.playPath)
- .document
- .select("source")
- .attr("src"),
- referer = mainUrl
- )
- .forEach(callback)
- }
- }
- }
- }
-
- return true
- }
-
- private fun extractIntFromString(string: String): Int? {
- val value = Regex("(\\d+)").findAll(string).lastOrNull() ?: return null
- if (value.value[0].toString() == "0") {
- return value.value.drop(1).toIntOrNull()
- }
-
- return value.value.toIntOrNull()
- }
-}
diff --git a/AniageProvider/src/main/kotlin/com/lagradost/AniageProviderPlugin.kt b/AniageProvider/src/main/kotlin/com/lagradost/AniageProviderPlugin.kt
deleted file mode 100644
index 8bcc216..0000000
--- a/AniageProvider/src/main/kotlin/com/lagradost/AniageProviderPlugin.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.lagradost
-
-import com.lagradost.cloudstream3.plugins.CloudstreamPlugin
-import com.lagradost.cloudstream3.plugins.Plugin
-import android.content.Context
-
-@CloudstreamPlugin
-class AniageProviderPlugin: Plugin() {
- override fun load(context: Context) {
- // All providers should be added in this manner. Please don't edit the providers list directly.
- registerMainAPI(AniageProvider())
- }
-}
\ No newline at end of file
diff --git a/AniageProvider/src/main/kotlin/com/lagradost/models/AnimeDetailModel.kt b/AniageProvider/src/main/kotlin/com/lagradost/models/AnimeDetailModel.kt
deleted file mode 100644
index 471bafe..0000000
--- a/AniageProvider/src/main/kotlin/com/lagradost/models/AnimeDetailModel.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.lagradost.models
-
-import com.google.gson.annotations.SerializedName
-
-data class AnimeDetail (
- @SerializedName("pageProps") val pageProps : PageProps,
- @SerializedName("__N_SSP") val __N_SSP : Boolean
-)
-
-data class PageProps (
-
- @SerializedName("id") val id : String,
- @SerializedName("posterId") val posterId : String,
- @SerializedName("title") val title : String,
- @SerializedName("alternativeTitle") val alternativeTitle : String,
- @SerializedName("type") val type : String,
- @SerializedName("titleStatus") val titleStatus : String,
- @SerializedName("publishedAt") val publishedAt : String,
- @SerializedName("genres") val genres : List,
- @SerializedName("description") val description : String,
- @SerializedName("season") val season : String,
- @SerializedName("studios") val studios : List,
- @SerializedName("adult") val adult : Int,
- @SerializedName("episodes") val episodes : Int,
- @SerializedName("trailerUrl") val trailerUrl : String,
- @SerializedName("maxEpisodes") val maxEpisodes : Int,
- @SerializedName("averageDuration") val averageDuration : Int,
- @SerializedName("teams") val teams : List
-)
-
-data class Teams (
-
- @SerializedName("animeId") val animeId : String,
- @SerializedName("teamId") val teamId : String,
- @SerializedName("episodes") val episodes : Int,
- @SerializedName("views") val views : Int,
- @SerializedName("lastUpdated") val lastUpdated : String
-)
\ No newline at end of file
diff --git a/AniageProvider/src/main/kotlin/com/lagradost/models/EpisodesModel.kt b/AniageProvider/src/main/kotlin/com/lagradost/models/EpisodesModel.kt
deleted file mode 100644
index 530ae5f..0000000
--- a/AniageProvider/src/main/kotlin/com/lagradost/models/EpisodesModel.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.lagradost.models
-
-import com.google.gson.annotations.SerializedName
-
-data class EpisodesModel(
-
- @SerializedName("views") val views : Int,
- @SerializedName("commented") val commented : Int,
- @SerializedName("id") val id : String,
- @SerializedName("animeId") val animeId : String,
- @SerializedName("teamId") val teamId : String,
- @SerializedName("volume") val volume : Int,
- @SerializedName("episodeNum") val episodeNum : Int,
- @SerializedName("subEpisodeNum") val subEpisodeNum : Int,
- @SerializedName("lastUpdated") val lastUpdated : String,
- @SerializedName("resourcePath") val resourcePath : String,
- @SerializedName("playPath") val playPath : String,
- @SerializedName("title") val title : String,
- @SerializedName("previewPath") val previewPath : String,
- @SerializedName("videoSource") val videoSource : VideoSource?,
- @SerializedName("s3VideoSource") val s3VideoSource : S3VideoSource?
-)
-
-data class VideoSource (
-
- @SerializedName("guid") val guid : String,
- @SerializedName("libraryId") val libraryId : Int,
- @SerializedName("playPath") val playPath : String,
- @SerializedName("previewPath") val previewPath : String,
- @SerializedName("errorMessage") val errorMessage : String,
- @SerializedName("videoStatus") val videoStatus : Int,
- @SerializedName("backupStatus") val backupStatus : String,
- @SerializedName("backup") val backup : Boolean,
- @SerializedName("lastUpdatedAt") val lastUpdatedAt : String
-)
-
-data class S3VideoSource (
-
- @SerializedName("id") val id : String,
- @SerializedName("previewPath") val previewPath : String,
- @SerializedName("playlistPath") val playlistPath : String,
- @SerializedName("bucket") val bucket : String,
- @SerializedName("lastUpdatedAt") val lastUpdatedAt : String
-)
diff --git a/AniageProvider/src/main/kotlin/com/lagradost/models/FindModel.kt b/AniageProvider/src/main/kotlin/com/lagradost/models/FindModel.kt
deleted file mode 100644
index e2638ec..0000000
--- a/AniageProvider/src/main/kotlin/com/lagradost/models/FindModel.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.lagradost.models
-
-import com.google.gson.annotations.SerializedName
-
-
-data class FindModel (
-
- // @SerializedName("cursorNext") val cursorNext : CursorNext?,
- // @SerializedName("cursorPrev") val cursorPrev : String?,
- @SerializedName("counter") val counter : Int,
- @SerializedName("data") val data : List
-)
-
-data class CursorNext (
-
- @SerializedName("page") val page : Int,
- @SerializedName("pageSize") val pageSize : Int,
- @SerializedName("order") val order : Order,
- @SerializedName("cleanup") val cleanup : List
-)
-
-data class Data (
-
- @SerializedName("id") val id : String,
- @SerializedName("posterId") val posterId : String,
- @SerializedName("title") val title : String,
- @SerializedName("alternativeTitle") val alternativeTitle : String,
- @SerializedName("type") val type : String,
- @SerializedName("titleStatus") val titleStatus : String,
- @SerializedName("publishedAt") val publishedAt : String,
- @SerializedName("genres") val genres : List,
- @SerializedName("description") val description : String,
- @SerializedName("season") val season : String,
- @SerializedName("studios") val studios : List,
- @SerializedName("adult") val adult : Int,
- @SerializedName("episodes") val episodes : Int,
- @SerializedName("trailerUrl") val trailerUrl : String,
- @SerializedName("maxEpisodes") val maxEpisodes : Int,
- @SerializedName("averageDuration") val averageDuration : Int
-)
-
-data class Order (
-
- @SerializedName("by") val by : String,
- @SerializedName("direction") val direction : String
-)
\ No newline at end of file
diff --git a/AniageProvider/src/main/kotlin/com/lagradost/models/TeamsModel.kt b/AniageProvider/src/main/kotlin/com/lagradost/models/TeamsModel.kt
deleted file mode 100644
index df3e8ff..0000000
--- a/AniageProvider/src/main/kotlin/com/lagradost/models/TeamsModel.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.lagradost.models
-
-import com.google.gson.annotations.SerializedName
-
-data class TeamsModel (
- @SerializedName("socials") val socials : List,
- @SerializedName("id") val id : String,
- @SerializedName("ownerId") val ownerId : String,
- @SerializedName("description") val description : String,
- @SerializedName("name") val name : String,
- @SerializedName("logo") val logo : String,
- @SerializedName("type") val type : String
-)
-
-data class Socials (
-
- @SerializedName("url") val url : String,
- @SerializedName("type") val type : String
-)
\ No newline at end of file