diff --git a/src/pt/animesroll/build.gradle b/src/pt/animesroll/build.gradle index 3641ba809..cbd5e67a2 100644 --- a/src/pt/animesroll/build.gradle +++ b/src/pt/animesroll/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'AnimesROLL' pkgNameSuffix = 'pt.animesroll' extClass = '.AnimesROLL' - extVersionCode = 1 + extVersionCode = 2 libVersion = '13' } diff --git a/src/pt/animesroll/src/eu/kanade/tachiyomi/animeextension/pt/animesroll/AnimesROLL.kt b/src/pt/animesroll/src/eu/kanade/tachiyomi/animeextension/pt/animesroll/AnimesROLL.kt index f5ed2269c..c9105cd66 100644 --- a/src/pt/animesroll/src/eu/kanade/tachiyomi/animeextension/pt/animesroll/AnimesROLL.kt +++ b/src/pt/animesroll/src/eu/kanade/tachiyomi/animeextension/pt/animesroll/AnimesROLL.kt @@ -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 { val originalUrl = response.request.url.toString() return if ("/f/" in originalUrl) { - val od = response.asJsoup().parseAs().animeData.od - val episode = SEpisode.create().apply { - url = "$NEW_API_URL/od/$od/filme.mp4" + val od = response.asJsoup().parseAs().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() - val urlStart = "https://cdn-01.animesroll.com/hls/animes/${epdata.anime.slug}" + val anime = response.asJsoup().parseAs() + 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 { + val response = client.newCall(episodeListRequest(animeId, page)) + .execute() + .parseAs() + + 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> { 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().animeData + val anime = when { + response.request.url.toString().contains("/f/") -> + doc.parseAs().movieData + else -> doc.parseAs() + } 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:" } diff --git a/src/pt/animesroll/src/eu/kanade/tachiyomi/animeextension/pt/animesroll/dto/AnimesROLLDto.kt b/src/pt/animesroll/src/eu/kanade/tachiyomi/animeextension/pt/animesroll/dto/AnimesROLLDto.kt index af4358051..f03621b14 100644 --- a/src/pt/animesroll/src/eu/kanade/tachiyomi/animeextension/pt/animesroll/dto/AnimesROLLDto.kt +++ b/src/pt/animesroll/src/eu/kanade/tachiyomi/animeextension/pt/animesroll/dto/AnimesROLLDto.kt @@ -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, + 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