AnimesROLL: Fix episode list, anime details page and video links (#1436)
* Fix: Solve serialization problems at AnimeDetails page * fix: Get episode list via the new api * fix: Solve http 404 on video URLs * refactor: Rename a dto * chore: Bump version
This commit is contained in:
@ -6,7 +6,7 @@ ext {
|
|||||||
extName = 'AnimesROLL'
|
extName = 'AnimesROLL'
|
||||||
pkgNameSuffix = 'pt.animesroll'
|
pkgNameSuffix = 'pt.animesroll'
|
||||||
extClass = '.AnimesROLL'
|
extClass = '.AnimesROLL'
|
||||||
extVersionCode = 1
|
extVersionCode = 2
|
||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.animesroll
|
package eu.kanade.tachiyomi.animeextension.pt.animesroll
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.AnimeDataDto
|
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.AnimeDataDto
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.AnimeInfoDto
|
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.MovieInfoDto
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.EpisodeDto
|
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.EpisodeDto
|
||||||
|
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.EpisodeListDto
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.LatestAnimeDto
|
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.LatestAnimeDto
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.PagePropDto
|
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.PagePropDto
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.SearchResultsDto
|
import eu.kanade.tachiyomi.animeextension.pt.animesroll.dto.SearchResultsDto
|
||||||
@ -33,7 +34,7 @@ class AnimesROLL : AnimeHttpSource() {
|
|||||||
|
|
||||||
override val supportsLatest = true
|
override val supportsLatest = true
|
||||||
|
|
||||||
override fun headersBuilder() = Headers.Builder().add("Referer", baseUrl)
|
override fun headersBuilder() = super.headersBuilder().add("Referer", baseUrl)
|
||||||
|
|
||||||
private val json = Json {
|
private val json = Json {
|
||||||
ignoreUnknownKeys = true
|
ignoreUnknownKeys = true
|
||||||
@ -49,29 +50,45 @@ class AnimesROLL : AnimeHttpSource() {
|
|||||||
override fun episodeListParse(response: Response): List<SEpisode> {
|
override fun episodeListParse(response: Response): List<SEpisode> {
|
||||||
val originalUrl = response.request.url.toString()
|
val originalUrl = response.request.url.toString()
|
||||||
return if ("/f/" in originalUrl) {
|
return if ("/f/" in originalUrl) {
|
||||||
val od = response.asJsoup().parseAs<AnimeInfoDto>().animeData.od
|
val od = response.asJsoup().parseAs<MovieInfoDto>().movieData.od
|
||||||
val episode = SEpisode.create().apply {
|
SEpisode.create().apply {
|
||||||
url = "$NEW_API_URL/od/$od/filme.mp4"
|
url = "$OLD_API_URL/od/$od/filme.mp4"
|
||||||
name = "Filme"
|
name = "Filme"
|
||||||
episode_number = 0F
|
episode_number = 0F
|
||||||
}
|
}.let(::listOf)
|
||||||
listOf(episode)
|
|
||||||
} else {
|
} else {
|
||||||
val epdata = response.asJsoup().parseAs<EpisodeDto>()
|
val anime = response.asJsoup().parseAs<AnimeDataDto>()
|
||||||
val urlStart = "https://cdn-01.animesroll.com/hls/animes/${epdata.anime.slug}"
|
val urlStart = "https://cdn-01.gamabunta.xyz/hls/animes/${anime.slug}"
|
||||||
|
|
||||||
(epdata.total_ep downTo 1).map {
|
return fetchEpisodesRecursively(anime.id).map { episode ->
|
||||||
SEpisode.create().apply {
|
SEpisode.create().apply {
|
||||||
episode_number = it.toFloat()
|
val epNum = episode.episodeNumber
|
||||||
val fixedNum = it.toString().padStart(3, '0')
|
name = "Episódio #$epNum"
|
||||||
name = "Episódio #$fixedNum"
|
episode_number = epNum.toFloat()
|
||||||
url = "$urlStart/$fixedNum.mp4/media-1/stream.m3u8"
|
url = "$urlStart/$epNum.mp4/media-1/stream.m3u8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ============================ Video Links =============================
|
|
||||||
|
|
||||||
|
private fun fetchEpisodesRecursively(animeId: String, page: Int = 1): List<EpisodeDto> {
|
||||||
|
val response = client.newCall(episodeListRequest(animeId, page))
|
||||||
|
.execute()
|
||||||
|
.parseAs<EpisodeListDto>()
|
||||||
|
|
||||||
|
return response.episodes.let { episodes ->
|
||||||
|
when {
|
||||||
|
response.meta.totalOfPages > page ->
|
||||||
|
episodes + fetchEpisodesRecursively(animeId, page + 1)
|
||||||
|
else -> episodes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun episodeListRequest(animeId: String, page: Int) =
|
||||||
|
GET("$NEW_API_URL/animes/$animeId/episodes?page=$page%order=desc")
|
||||||
|
|
||||||
|
// ============================ Video Links =============================
|
||||||
override fun fetchVideoList(episode: SEpisode): Observable<List<Video>> {
|
override fun fetchVideoList(episode: SEpisode): Observable<List<Video>> {
|
||||||
val epUrl = episode.url
|
val epUrl = episode.url
|
||||||
return Observable.just(listOf(Video(epUrl, "default", epUrl)))
|
return Observable.just(listOf(Video(epUrl, "default", epUrl)))
|
||||||
@ -88,7 +105,11 @@ class AnimesROLL : AnimeHttpSource() {
|
|||||||
// =========================== Anime Details ============================
|
// =========================== Anime Details ============================
|
||||||
override fun animeDetailsParse(response: Response): SAnime {
|
override fun animeDetailsParse(response: Response): SAnime {
|
||||||
val doc = response.asJsoup()
|
val doc = response.asJsoup()
|
||||||
val anime = doc.parseAs<AnimeInfoDto>().animeData
|
val anime = when {
|
||||||
|
response.request.url.toString().contains("/f/") ->
|
||||||
|
doc.parseAs<MovieInfoDto>().movieData
|
||||||
|
else -> doc.parseAs<AnimeDataDto>()
|
||||||
|
}
|
||||||
return anime.toSAnime().apply {
|
return anime.toSAnime().apply {
|
||||||
author = if (anime.director != "0") anime.director else null
|
author = if (anime.director != "0") anime.director else null
|
||||||
var desc = anime.description.ifNotEmpty { it + "\n" }
|
var desc = anime.description.ifNotEmpty { it + "\n" }
|
||||||
@ -129,7 +150,7 @@ class AnimesROLL : AnimeHttpSource() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
|
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
|
||||||
return GET("$NEW_API_URL/search?q=$query")
|
return GET("$OLD_API_URL/search?q=$query")
|
||||||
}
|
}
|
||||||
|
|
||||||
// =============================== Latest ===============================
|
// =============================== Latest ===============================
|
||||||
@ -176,7 +197,8 @@ class AnimesROLL : AnimeHttpSource() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val NEW_API_URL = "https://apiv2-prd.anroll.net"
|
private const val OLD_API_URL = "https://apiv2-prd.anroll.net"
|
||||||
|
private const val NEW_API_URL = "https://apiv3-prd.anroll.net"
|
||||||
|
|
||||||
const val PREFIX_SEARCH = "path:"
|
const val PREFIX_SEARCH = "path:"
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,9 @@ data class LatestAnimeDto(
|
|||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class AnimeInfoDto(
|
data class MovieInfoDto(
|
||||||
@JsonNames("data_anime", "data_movie")
|
@SerialName("data_movie")
|
||||||
val animeData: AnimeDataDto,
|
val movieData: AnimeDataDto,
|
||||||
val pages: Int = 0,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@ -45,11 +44,20 @@ data class AnimeDataDto(
|
|||||||
val od: String = "",
|
val od: String = "",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class EpisodeListDto(
|
||||||
|
@SerialName("data")
|
||||||
|
val episodes: List<EpisodeDto>,
|
||||||
|
val meta: MetadataDto,
|
||||||
|
) {
|
||||||
|
@Serializable
|
||||||
|
data class MetadataDto(val totalOfPages: Int)
|
||||||
|
}
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class EpisodeDto(
|
data class EpisodeDto(
|
||||||
@SerialName("data_anime")
|
@SerialName("n_episodio")
|
||||||
val anime: AnimeDataDto,
|
val episodeNumber: String,
|
||||||
val total_ep: Int,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
|
Reference in New Issue
Block a user