diff --git a/src/en/allanime/build.gradle b/src/en/allanime/build.gradle index 6c65fb144..b339ab445 100644 --- a/src/en/allanime/build.gradle +++ b/src/en/allanime/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'AllAnime' pkgNameSuffix = 'en.allanime' extClass = '.AllAnime' - extVersionCode = 22 + extVersionCode = 23 libVersion = '13' } diff --git a/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/AllAnime.kt b/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/AllAnime.kt index b9c035702..215cf40fb 100644 --- a/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/AllAnime.kt +++ b/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/AllAnime.kt @@ -20,18 +20,24 @@ import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.asObservableSuccess import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.runBlocking +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.buildJsonArray import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonObject +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import org.jsoup.Jsoup import rx.Observable @@ -60,13 +66,16 @@ class AllAnime : ConfigurableAnimeSource, AnimeHttpSource() { // ============================== Popular =============================== override fun popularAnimeRequest(page: Int): Request { - val variables = buildJsonObject { - put("type", "anime") - put("size", PAGE_SIZE) - put("dateRange", 7) - put("page", page) + val data = buildJsonObject { + putJsonObject("variables") { + put("type", "anime") + put("size", PAGE_SIZE) + put("dateRange", 7) + put("page", page) + } + put("query", POPULAR_QUERY) } - return GET("$baseUrl/allanimeapi?variables=$variables&query=$POPULAR_QUERY", headers = headers) + return buildPost(data) } override fun popularAnimeParse(response: Response): AnimesPage { @@ -95,17 +104,20 @@ class AllAnime : ConfigurableAnimeSource, AnimeHttpSource() { // =============================== Latest =============================== override fun latestUpdatesRequest(page: Int): Request { - val variables = buildJsonObject { - putJsonObject("search") { - put("allowAdult", false) - put("allowUnknown", false) + val data = buildJsonObject { + putJsonObject("variables") { + putJsonObject("search") { + put("allowAdult", false) + put("allowUnknown", false) + } + put("limit", PAGE_SIZE) + put("page", page) + put("translationType", preferences.subPref) + put("countryOrigin", "ALL") } - put("limit", PAGE_SIZE) - put("page", page) - put("translationType", preferences.subPref) - put("countryOrigin", "ALL") + put("query", SEARCH_QUERY) } - return GET("$baseUrl/allanimeapi?variables=$variables&query=$SEARCH_QUERY", headers = headers) + return buildPost(data) } override fun latestUpdatesParse(response: Response): AnimesPage = parseAnime(response) @@ -125,38 +137,44 @@ class AllAnime : ConfigurableAnimeSource, AnimeHttpSource() { private fun searchAnimeRequest(page: Int, query: String, filters: AllAnimeFilters.FilterSearchParams): Request { return if (query.isNotEmpty()) { - val variables = buildJsonObject { - putJsonObject("search") { - put("query", query) - put("allowAdult", false) - put("allowUnknown", false) - } - put("limit", PAGE_SIZE) - put("page", page) - put("translationType", preferences.subPref) - put("countryOrigin", "ALL") - } - GET("$baseUrl/allanimeapi?variables=$variables&query=$SEARCH_QUERY", headers = headers) - } else { - val variables = buildJsonObject { - putJsonObject("search") { - put("allowAdult", false) - put("allowUnknown", false) - if (filters.season != "all") put("season", filters.season) - if (filters.releaseYear != "all") put("year", filters.releaseYear.toInt()) - if (filters.genres != "all") { - put("genres", json.decodeFromString(filters.genres)) - put("excludeGenres", buildJsonArray { }) + val data = buildJsonObject { + putJsonObject("variables") { + putJsonObject("search") { + put("query", query) + put("allowAdult", false) + put("allowUnknown", false) } - if (filters.types != "all") put("types", json.decodeFromString(filters.types)) - if (filters.sortBy != "update") put("sortBy", filters.sortBy) + put("limit", PAGE_SIZE) + put("page", page) + put("translationType", preferences.subPref) + put("countryOrigin", "ALL") } - put("limit", PAGE_SIZE) - put("page", page) - put("translationType", preferences.subPref) - put("countryOrigin", filters.origin) + put("query", SEARCH_QUERY) } - GET("$baseUrl/allanimeapi?variables=$variables&query=$SEARCH_QUERY", headers = headers) + buildPost(data) + } else { + val data = buildJsonObject { + putJsonObject("variables") { + putJsonObject("search") { + put("allowAdult", false) + put("allowUnknown", false) + if (filters.season != "all") put("season", filters.season) + if (filters.releaseYear != "all") put("year", filters.releaseYear.toInt()) + if (filters.genres != "all") { + put("genres", json.decodeFromString(filters.genres)) + put("excludeGenres", buildJsonArray { }) + } + if (filters.types != "all") put("types", json.decodeFromString(filters.types)) + if (filters.sortBy != "update") put("sortBy", filters.sortBy) + } + put("limit", PAGE_SIZE) + put("page", page) + put("translationType", preferences.subPref) + put("countryOrigin", filters.origin) + } + put("query", SEARCH_QUERY) + } + buildPost(data) } } @@ -177,10 +195,13 @@ class AllAnime : ConfigurableAnimeSource, AnimeHttpSource() { } private fun animeDetailsRequestInternal(anime: SAnime): Request { - val variables = buildJsonObject { - put("_id", anime.url.split("<&sep>").first()) + val data = buildJsonObject { + putJsonObject("variables") { + put("_id", anime.url.split("<&sep>").first()) + } + put("query", DETAILS_QUERY) } - return GET("$baseUrl/allanimeapi?variables=$variables&query=$DETAILS_QUERY", headers = headers) + return buildPost(data) } override fun animeDetailsRequest(anime: SAnime): Request { @@ -215,10 +236,13 @@ class AllAnime : ConfigurableAnimeSource, AnimeHttpSource() { // ============================== Episodes ============================== override fun episodeListRequest(anime: SAnime): Request { - val variables = buildJsonObject { - put("_id", anime.url.split("<&sep>").first()) + val data = buildJsonObject { + putJsonObject("variables") { + put("_id", anime.url.split("<&sep>").first()) + } + put("query", EPISODES_QUERY) } - return GET("$baseUrl/allanimeapi?variables=$variables&query=$EPISODES_QUERY", headers = headers) + return buildPost(data) } override fun episodeListParse(response: Response): List { @@ -233,22 +257,43 @@ class AllAnime : ConfigurableAnimeSource, AnimeHttpSource() { return episodesDetail.map { ep -> val numName = ep.toIntOrNull() ?: (ep.toFloatOrNull() ?: "1") - val variables = buildJsonObject { - put("showId", medias.data.show._id) - put("translationType", subPref) - put("episodeString", ep) - } SEpisode.create().apply { episode_number = ep.toFloatOrNull() ?: 0F name = "Episode $numName ($subPref)" - setUrlWithoutDomain("/allanimeapi?variables=$variables&query=$STREAMS_QUERY") + url = json.encodeToString( + buildJsonObject { + putJsonObject("variables") { + put("showId", medias.data.show._id) + put("translationType", subPref) + put("episodeString", ep) + } + put("query", STREAMS_QUERY) + }, + ) } } } // ============================ Video Links ============================= + override fun videoListRequest(episode: SEpisode): Request { + val payload = episode.url + .toRequestBody("application/json; charset=utf-8".toMediaType()) + + val siteUrl = preferences.siteUrl + val postHeaders = headers.newBuilder() + .add("Accept", "*/*") + .add("Content-Length", payload.contentLength().toString()) + .add("Content-Type", payload.contentType().toString()) + .add("Host", baseUrl.toHttpUrl().host) + .add("Origin", siteUrl) + .add("Referer", "$baseUrl/") + .build() + + return POST("$baseUrl/api", headers = postHeaders, body = payload) + } + override fun videoListParse(response: Response): List