diff --git a/src/en/animepahe/build.gradle b/src/en/animepahe/build.gradle index 6ed6ac527..c55774d01 100644 --- a/src/en/animepahe/build.gradle +++ b/src/en/animepahe/build.gradle @@ -1,15 +1,17 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' ext { extName = 'AnimePahe' pkgNameSuffix = 'en.animepahe' extClass = '.AnimePahe' - extVersionCode = 17 + extVersionCode = 18 libVersion = '13' } dependencies { + implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1" ext.coroutinesVersion = "1.4.3" implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion") } diff --git a/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/AnimePahe.kt b/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/AnimePahe.kt index 87497a3e8..4518df759 100644 --- a/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/AnimePahe.kt +++ b/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/AnimePahe.kt @@ -13,13 +13,15 @@ import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.util.asJsoup import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext +import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonNull import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.float import kotlinx.serialization.json.int @@ -30,6 +32,7 @@ import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response +import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy @@ -56,7 +59,8 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() { override val client: OkHttpClient = network.cloudflareClient override fun animeDetailsRequest(anime: SAnime): Request { - val animeId = anime.url.substringAfterLast("?anime_id=") + val parsed = json.decodeFromString(anime.url) + val animeId = parsed.url.substringAfterLast("?anime_id=") val session = getSession(anime.title, animeId) return GET("$baseUrl/anime/$session?anime_id=$animeId") } @@ -111,7 +115,12 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() { val anime = SAnime.create() anime.title = item.jsonObject["title"]!!.jsonPrimitive.content val animeId = item.jsonObject["id"]!!.jsonPrimitive.int - anime.setUrlWithoutDomain("$baseUrl/anime/?anime_id=$animeId") + anime.setUrlWithoutDomain( + LinkData( + "$baseUrl/anime/?anime_id=$animeId", + item.jsonObject["session"]!!.jsonPrimitive.content + ).toJsonString() + ) animeList.add(anime) } return AnimesPage(animeList, false) @@ -136,7 +145,12 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() { val anime = SAnime.create() anime.title = item.jsonObject["anime_title"]!!.jsonPrimitive.content val animeId = item.jsonObject["anime_id"]!!.jsonPrimitive.int - anime.setUrlWithoutDomain("$baseUrl/anime/?anime_id=$animeId") + anime.setUrlWithoutDomain( + LinkData( + "$baseUrl/anime/?anime_id=$animeId", + item.jsonObject["anime_session"]!!.jsonPrimitive.content + ).toJsonString() + ) anime.artist = item.jsonObject["fansub"]!!.jsonPrimitive.content animeList.add(anime) } @@ -151,17 +165,33 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() { } } + override fun fetchEpisodeList(anime: SAnime): Observable> { + val parsed = json.decodeFromString(anime.url) + return if (anime.status != SAnime.LICENSED) { + client.newCall(episodeListRequest(anime)) + .asObservableSuccess() + .map { response -> + episodeListParse(response, parsed.animeSession) + } + } else { + Observable.error(Exception("Licensed - No episodes to show")) + } + } + override fun episodeListRequest(anime: SAnime): Request { - val animeId = anime.url.substringAfterLast("?anime_id=") + val parsed = json.decodeFromString(anime.url) + val animeId = parsed.url.substringAfterLast("?anime_id=") val session = getSession(anime.title, animeId) return GET("$baseUrl/api?m=release&id=$session&sort=episode_desc&page=1") } - override fun episodeListParse(response: Response): List { - return recursivePages(response) + override fun episodeListParse(response: Response): List = throw Exception("Not used") + + private fun episodeListParse(response: Response, animeSession: String): List { + return recursivePages(response, animeSession) } - private fun parseEpisodePage(jsonLine: String?): MutableList { + private fun parseEpisodePage(jsonLine: String?, animeSession: String): MutableList { val jsonData = jsonLine ?: return mutableListOf() val jObject = json.decodeFromString(jsonData) val array = jObject["data"]!!.jsonArray @@ -171,9 +201,8 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() { val episode = SEpisode.create() episode.date_upload = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US) .parse(itemO["created_at"]!!.jsonPrimitive.content)!!.time - val animeId = itemO["anime_id"]!!.jsonPrimitive.int val session = itemO["session"]!!.jsonPrimitive.content - episode.setUrlWithoutDomain("$baseUrl/api?m=links&id=$animeId&session=$session&p=kwik") + episode.setUrlWithoutDomain("$baseUrl/play/$animeSession/$session") val epNum = itemO["episode"]!!.jsonPrimitive.float episode.episode_number = epNum val epNumString = if (epNum % 1F == 0F) epNum.toInt().toString() else epNum.toString() @@ -183,16 +212,16 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() { return episodeList } - private fun recursivePages(response: Response): List { + private fun recursivePages(response: Response, animeSession: String): List { val responseString = response.body!!.string() val jObject = json.decodeFromString(responseString) val lastPage = jObject["last_page"]!!.jsonPrimitive.int val page = jObject["current_page"]!!.jsonPrimitive.int val hasNextPage = page < lastPage - val returnList = parseEpisodePage(responseString) + val returnList = parseEpisodePage(responseString, animeSession) if (hasNextPage) { val nextPage = nextPageRequest(response.request.url.toString(), page + 1) - returnList += recursivePages(nextPage) + returnList += recursivePages(nextPage, animeSession) } return returnList } @@ -203,18 +232,17 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() { } override fun videoListParse(response: Response): List