aniage: Reformat code and fix parsing ID

This commit is contained in:
CakesTwix 2023-12-12 20:38:15 +02:00
parent 28a5cb4326
commit 3c61de375b
Signed by: CakesTwix
GPG key ID: 7B11051D5CE19825
2 changed files with 169 additions and 121 deletions

View file

@ -1,5 +1,5 @@
// use an integer for version numbers // use an integer for version numbers
version = 10 version = 11
dependencies{ dependencies{
implementation("com.google.code.gson:gson:2.9.0") implementation("com.google.code.gson:gson:2.9.0")

View file

@ -38,7 +38,8 @@ class AniageProvider : MainAPI() {
override val hasMainPage = true override val hasMainPage = true
override var lang = "uk" override var lang = "uk"
override val hasDownloadSupport = true override val hasDownloadSupport = true
override val supportedTypes = setOf( override val supportedTypes =
setOf(
TvType.Anime, TvType.Anime,
TvType.AnimeMovie, TvType.AnimeMovie,
TvType.OVA, TvType.OVA,
@ -55,7 +56,8 @@ class AniageProvider : MainAPI() {
private val listPageModel = object : TypeToken<List<PageProps>>() {}.type private val listPageModel = object : TypeToken<List<PageProps>>() {}.type
// Sections // Sections
override val mainPage = mainPageOf( override val mainPage =
mainPageOf(
mainUrl to "Нове", mainUrl to "Нове",
mainUrl to "Повнометражне", mainUrl to "Повнометражне",
mainUrl to "ONA", mainUrl to "ONA",
@ -67,16 +69,17 @@ class AniageProvider : MainAPI() {
) )
// Done // Done
override suspend fun getMainPage( override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse {
page: Int,
request: MainPageRequest
): HomePageResponse {
val body = JSONObject() val body = JSONObject()
val cleanup = with(request.name){ val cleanup =
with(request.name) {
when { when {
this == "Нове" -> JSONArray() this == "Нове" -> JSONArray()
else -> JSONArray().put(JSONObject() else ->
JSONArray()
.put(
JSONObject()
.put("property", "type") .put("property", "type")
.put("type", "=") .put("type", "=")
.put("value", JSONArray().put(this)) .put("value", JSONArray().put(this))
@ -93,13 +96,12 @@ class AniageProvider : MainAPI() {
body.put("page", page) body.put("page", page)
body.put("pageSize", pageSize) body.put("pageSize", pageSize)
val document = app.post("$apiUrl/v2/anime/find", val document = app.post("$apiUrl/v2/anime/find", json = body).text
json = body
).text
val parsedJSON = Gson().fromJson(document, FindModel::class.java) val parsedJSON = Gson().fromJson(document, FindModel::class.java)
// Log.d("CakesTwix-Debug", parsedJSON.data[0].title) // Log.d("CakesTwix-Debug", parsedJSON.data[0].title)
val homeList = parsedJSON.data.map { val homeList =
parsedJSON.data.map {
newAnimeSearchResponse(it.title, it.id, TvType.Anime) { newAnimeSearchResponse(it.title, it.id, TvType.Anime) {
this.posterUrl = "$imageUrl/main/${it.posterId}?width=296" this.posterUrl = "$imageUrl/main/${it.posterId}?width=296"
addDubStatus(isDub = true, it.episodes) addDubStatus(isDub = true, it.episodes)
@ -111,8 +113,10 @@ class AniageProvider : MainAPI() {
} }
override suspend fun search(query: String): List<SearchResponse> { override suspend fun search(query: String): List<SearchResponse> {
val animeJSON = Gson().fromJson<List<PageProps>>(app.get("$findUrl$query").text, listPageModel) val animeJSON =
val findList = animeJSON.map { Gson().fromJson<List<PageProps>>(app.get("$findUrl$query").text, listPageModel)
val findList =
animeJSON.map {
newAnimeSearchResponse(it.title, it.id, TvType.Anime) { newAnimeSearchResponse(it.title, it.id, TvType.Anime) {
this.posterUrl = "$imageUrl/main/${it.posterId}?width=296" this.posterUrl = "$imageUrl/main/${it.posterId}?width=296"
addDubStatus(isDub = true, it.episodes) addDubStatus(isDub = true, it.episodes)
@ -124,17 +128,23 @@ class AniageProvider : MainAPI() {
// Detailed information // Detailed information
override suspend fun load(url: String): LoadResponse { override suspend fun load(url: String): LoadResponse {
val animeID = url.replace("$mainUrl/", "") val animeID = url.replace("$mainUrl/watch?wid=", "").replace("$mainUrl/", "")
val document = app.get("$mainUrl/$animeID").document val document = app.get("$mainUrl/watch/$animeID").document
val jsonObject = JSONObject(document.selectFirst("script[type*=application/json]")!!.html()) val jsonObject = JSONObject(document.selectFirst("script[type*=application/json]")!!.html())
val buildId = jsonObject.getString("buildId") val buildId = jsonObject.getString("buildId")
// https://www.aniage.net/_next/data/IfKYt_B-o41irAex5hZoV/watch.json?wid=96dcb9ce-e4bc-4248-8ed3-29c3d14aedfc // 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") // 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) 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) // Log.d("CakesTwix-Debug", animeJSON.pageProps.title)
val showStatus = with(animeJSON.pageProps.titleStatus){ val showStatus =
with(animeJSON.pageProps.titleStatus) {
when { when {
contains("Онгоїнг") -> ShowStatus.Ongoing contains("Онгоїнг") -> ShowStatus.Ongoing
contains("Вийшло") -> ShowStatus.Completed contains("Вийшло") -> ShowStatus.Completed
@ -142,7 +152,8 @@ class AniageProvider : MainAPI() {
} }
} }
val tvType = with(animeJSON.pageProps.type){ val tvType =
with(animeJSON.pageProps.type) {
when { when {
contains("ТБ-Серіал") -> TvType.Anime contains("ТБ-Серіал") -> TvType.Anime
contains("ТБ-Спешл") -> TvType.Anime contains("ТБ-Спешл") -> TvType.Anime
@ -155,25 +166,40 @@ class AniageProvider : MainAPI() {
} }
} }
val trailer = with(animeJSON.pageProps.trailerUrl){ val trailer =
with(animeJSON.pageProps.trailerUrl) {
when { when {
this.isNullOrEmpty() -> null this.isNullOrEmpty() -> null
contains("https://iframe.mediadelivery.net/embed") -> contains("https://iframe.mediadelivery.net/embed") ->
app.get(this).document.select("source[type*=application/x-mpegURL]").attr("src") app.get(this)
else -> .document
null .select("source[type*=application/x-mpegURL]")
.attr("src")
else -> null
} }
} }
// Episodes // Episodes
val episodes = mutableListOf<Episode>() val episodes = mutableListOf<Episode>()
// Log.d("CakesTwix-Debug", app.get("https://master.api.aniage.net/anime/episodes?animeId=$animeID&page=1&pageSize=30&sortOrder=ASC&teamId=${animeJSON.pageProps.teams[0].teamId}&volume=1").url) // Log.d("CakesTwix-Debug",
// app.get("https://master.api.aniage.net/anime/episodes?animeId=$animeID&page=1&pageSize=30&sortOrder=ASC&teamId=${animeJSON.pageProps.teams[0].teamId}&volume=1").url)
if (animeJSON.pageProps.teams.isNotEmpty()) { if (animeJSON.pageProps.teams.isNotEmpty()) {
Gson().fromJson<List<EpisodesModel>>(app.get("$apiUrl/anime/episodes?animeId=$animeID&page=1&pageSize=30&sortOrder=ASC&teamId=${animeJSON.pageProps.teams[0].teamId}&volume=1").text, listEpisodeModel).map { Gson()
val episodeName = if(it.title == "." || it.title == it.episodeNum.toString()) "Серія ${it.episodeNum}" else it.title .fromJson<List<EpisodesModel>>(
episodes.add(Episode app.get(
( "$apiUrl/anime/episodes?animeId=$animeID&page=1&pageSize=30&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}", "${it.animeId}, ${it.episodeNum}",
episodeName, episodeName,
episode = it.episodeNum, episode = it.episodeNum,
@ -188,7 +214,8 @@ class AniageProvider : MainAPI() {
"$mainUrl/watch?wid=$animeID", "$mainUrl/watch?wid=$animeID",
tvType, tvType,
) { ) {
this.posterUrl = "$imageUrl/main/${animeJSON.pageProps.posterId}?optimize=image&width=296" this.posterUrl =
"$imageUrl/main/${animeJSON.pageProps.posterId}?optimize=image&width=296"
this.engName = animeJSON.pageProps.alternativeTitle this.engName = animeJSON.pageProps.alternativeTitle
this.tags = animeJSON.pageProps.genres.map { it } this.tags = animeJSON.pageProps.genres.map { it }
this.plot = animeJSON.pageProps.description this.plot = animeJSON.pageProps.description
@ -215,39 +242,61 @@ class AniageProvider : MainAPI() {
val jsonObject = JSONObject(document.selectFirst("script[type*=application/json]")!!.html()) val jsonObject = JSONObject(document.selectFirst("script[type*=application/json]")!!.html())
val buildId = jsonObject.getString("buildId") val buildId = jsonObject.getString("buildId")
val animeJSON = Gson().fromJson(app.get("$mainUrl/_next/data/$buildId/watch.json?wid=${dataList[0]}").text, AnimeDetail::class.java) 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?" var stringTeam = "$apiUrl/anime/teams/by-ids?"
animeJSON.pageProps.teams.map { teams -> animeJSON.pageProps.teams.map { teams -> stringTeam += "ids=${teams.teamId}&" }
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-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 // /anime/teams/by-ids?ids=e6bff5dc-354b-4fda-98b3-c29c12931070ids=31d156c3-1596-4dd0-8736-a01f7793c5deids=c7ea3994-2841-4798-b39d-5d9389409f59
// For names // For names
Gson().fromJson<List<TeamsModel>>(app.get(stringTeam).text, listTeamsModel).forEach { teamName -> Gson().fromJson<List<TeamsModel>>(app.get(stringTeam).text, listTeamsModel).forEach {
Gson().fromJson<List<EpisodesModel>>(app.get("$apiUrl/anime/episodes?animeId=${dataList[0]}&page=1&pageSize=30&sortOrder=ASC&teamId=${teamName.id}&volume=1").text, listEpisodeModel).map { teamName ->
Gson()
.fromJson<List<EpisodesModel>>(
app.get(
"$apiUrl/anime/episodes?animeId=${dataList[0]}&page=1&pageSize=30&sortOrder=ASC&teamId=${teamName.id}&volume=1"
)
.text,
listEpisodeModel
)
.map {
if (it.episodeNum == dataList[1].toIntOrNull()) { if (it.episodeNum == dataList[1].toIntOrNull()) {
when { when {
it.playPath != null -> it.playPath != null ->
M3u8Helper.generateM3u8( M3u8Helper.generateM3u8(
source = teamName.name, source = teamName.name,
streamUrl = app.get(it.playPath).document.select("source").attr("src"), streamUrl =
app.get(it.playPath)
.document
.select("source")
.attr("src"),
referer = mainUrl referer = mainUrl
).forEach(callback) )
.forEach(callback)
it.s3VideoSource != null -> it.s3VideoSource != null ->
M3u8Helper.generateM3u8( M3u8Helper.generateM3u8(
source = teamName.name, source = teamName.name,
streamUrl = "$videoCdn${it.s3VideoSource.playlistPath}", streamUrl = "$videoCdn${it.s3VideoSource.playlistPath}",
referer = apiUrl referer = apiUrl
).forEach(callback) )
.forEach(callback)
it.videoSource != null -> it.videoSource != null ->
M3u8Helper.generateM3u8( M3u8Helper.generateM3u8(
source = teamName.name, source = teamName.name,
streamUrl = app.get(it.videoSource.playPath).document.select("source").attr("src"), streamUrl =
app.get(it.videoSource.playPath)
.document
.select("source")
.attr("src"),
referer = mainUrl referer = mainUrl
).forEach(callback) )
.forEach(callback)
} }
} }
} }
@ -263,6 +312,5 @@ class AniageProvider : MainAPI() {
} }
return value.value.toIntOrNull() return value.value.toIntOrNull()
} }
} }