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:
Claudemirovsky
2023-03-23 14:25:04 -03:00
committed by GitHub
parent c78741344e
commit 2e741a6eed
3 changed files with 56 additions and 26 deletions

View File

@ -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'
} }

View File

@ -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:"
} }

View File

@ -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