aniage: Reformat code and fix parsing ID
This commit is contained in:
parent
28a5cb4326
commit
3c61de375b
2 changed files with 169 additions and 121 deletions
|
@ -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")
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue