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'
|
||||
pkgNameSuffix = 'pt.animesroll'
|
||||
extClass = '.AnimesROLL'
|
||||
extVersionCode = 1
|
||||
extVersionCode = 2
|
||||
libVersion = '13'
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,9 @@
|
||||
package eu.kanade.tachiyomi.animeextension.pt.animesroll
|
||||
|
||||
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.EpisodeListDto
|
||||
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.SearchResultsDto
|
||||
@ -33,7 +34,7 @@ class AnimesROLL : AnimeHttpSource() {
|
||||
|
||||
override val supportsLatest = true
|
||||
|
||||
override fun headersBuilder() = Headers.Builder().add("Referer", baseUrl)
|
||||
override fun headersBuilder() = super.headersBuilder().add("Referer", baseUrl)
|
||||
|
||||
private val json = Json {
|
||||
ignoreUnknownKeys = true
|
||||
@ -49,29 +50,45 @@ class AnimesROLL : AnimeHttpSource() {
|
||||
override fun episodeListParse(response: Response): List<SEpisode> {
|
||||
val originalUrl = response.request.url.toString()
|
||||
return if ("/f/" in originalUrl) {
|
||||
val od = response.asJsoup().parseAs<AnimeInfoDto>().animeData.od
|
||||
val episode = SEpisode.create().apply {
|
||||
url = "$NEW_API_URL/od/$od/filme.mp4"
|
||||
val od = response.asJsoup().parseAs<MovieInfoDto>().movieData.od
|
||||
SEpisode.create().apply {
|
||||
url = "$OLD_API_URL/od/$od/filme.mp4"
|
||||
name = "Filme"
|
||||
episode_number = 0F
|
||||
}
|
||||
listOf(episode)
|
||||
}.let(::listOf)
|
||||
} else {
|
||||
val epdata = response.asJsoup().parseAs<EpisodeDto>()
|
||||
val urlStart = "https://cdn-01.animesroll.com/hls/animes/${epdata.anime.slug}"
|
||||
val anime = response.asJsoup().parseAs<AnimeDataDto>()
|
||||
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 {
|
||||
episode_number = it.toFloat()
|
||||
val fixedNum = it.toString().padStart(3, '0')
|
||||
name = "Episódio #$fixedNum"
|
||||
url = "$urlStart/$fixedNum.mp4/media-1/stream.m3u8"
|
||||
val epNum = episode.episodeNumber
|
||||
name = "Episódio #$epNum"
|
||||
episode_number = epNum.toFloat()
|
||||
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>> {
|
||||
val epUrl = episode.url
|
||||
return Observable.just(listOf(Video(epUrl, "default", epUrl)))
|
||||
@ -88,7 +105,11 @@ class AnimesROLL : AnimeHttpSource() {
|
||||
// =========================== Anime Details ============================
|
||||
override fun animeDetailsParse(response: Response): SAnime {
|
||||
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 {
|
||||
author = if (anime.director != "0") anime.director else null
|
||||
var desc = anime.description.ifNotEmpty { it + "\n" }
|
||||
@ -129,7 +150,7 @@ class AnimesROLL : AnimeHttpSource() {
|
||||
}
|
||||
|
||||
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 ===============================
|
||||
@ -176,7 +197,8 @@ class AnimesROLL : AnimeHttpSource() {
|
||||
}
|
||||
|
||||
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:"
|
||||
}
|
||||
|
@ -19,10 +19,9 @@ data class LatestAnimeDto(
|
||||
)
|
||||
|
||||
@Serializable
|
||||
data class AnimeInfoDto(
|
||||
@JsonNames("data_anime", "data_movie")
|
||||
val animeData: AnimeDataDto,
|
||||
val pages: Int = 0,
|
||||
data class MovieInfoDto(
|
||||
@SerialName("data_movie")
|
||||
val movieData: AnimeDataDto,
|
||||
)
|
||||
|
||||
@Serializable
|
||||
@ -45,11 +44,20 @@ data class AnimeDataDto(
|
||||
val od: String = "",
|
||||
)
|
||||
|
||||
@Serializable
|
||||
data class EpisodeListDto(
|
||||
@SerialName("data")
|
||||
val episodes: List<EpisodeDto>,
|
||||
val meta: MetadataDto,
|
||||
) {
|
||||
@Serializable
|
||||
data class MetadataDto(val totalOfPages: Int)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class EpisodeDto(
|
||||
@SerialName("data_anime")
|
||||
val anime: AnimeDataDto,
|
||||
val total_ep: Int,
|
||||
@SerialName("n_episodio")
|
||||
val episodeNumber: String,
|
||||
)
|
||||
|
||||
@Serializable
|
||||
|
Reference in New Issue
Block a user