From 312747fb1ae81ad1153a6a93b1f21df09b73507b Mon Sep 17 00:00:00 2001 From: bapeey <90949336+bapeey@users.noreply.github.com> Date: Sat, 26 Apr 2025 21:08:00 -0500 Subject: [PATCH] EternalMangas: Fix no results and NPE (#8647) fix --- src/all/eternalmangas/build.gradle | 2 +- .../all/eternalmangas/EternalMangas.kt | 54 +++++++++++++++---- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/all/eternalmangas/build.gradle b/src/all/eternalmangas/build.gradle index d826be84f..5f0db2266 100644 --- a/src/all/eternalmangas/build.gradle +++ b/src/all/eternalmangas/build.gradle @@ -3,7 +3,7 @@ ext { extClass = '.EternalMangasFactory' themePkg = 'mangaesp' baseUrl = 'https://eternalmangas.com' - overrideVersionCode = 2 + overrideVersionCode = 3 isNsfw = true } diff --git a/src/all/eternalmangas/src/eu/kanade/tachiyomi/extension/all/eternalmangas/EternalMangas.kt b/src/all/eternalmangas/src/eu/kanade/tachiyomi/extension/all/eternalmangas/EternalMangas.kt index f79761e00..a3a8b5aa6 100644 --- a/src/all/eternalmangas/src/eu/kanade/tachiyomi/extension/all/eternalmangas/EternalMangas.kt +++ b/src/all/eternalmangas/src/eu/kanade/tachiyomi/extension/all/eternalmangas/EternalMangas.kt @@ -2,16 +2,20 @@ package eu.kanade.tachiyomi.extension.all.eternalmangas import eu.kanade.tachiyomi.multisrc.mangaesp.MangaEsp import eu.kanade.tachiyomi.multisrc.mangaesp.SeriesDto +import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga -import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import okhttp3.FormBody +import okhttp3.Request import okhttp3.Response import org.jsoup.Jsoup +import rx.Observable import java.text.ParseException import java.text.SimpleDateFormat import java.util.Locale @@ -26,16 +30,41 @@ open class EternalMangas( ) { override val useApiSearch = true - override fun latestUpdatesParse(response: Response): MangasPage { - val responseData = json.decodeFromString(response.body.string()) - val mangas = responseData.updates[internalLang]?.flatten()?.map { it.toSManga(seriesPath) } ?: emptyList() - return MangasPage(mangas, false) + override fun fetchPopularManga(page: Int): Observable { + return super.fetchSearchManga(page, "", createSortFilter("views", false)) + } + + override fun fetchLatestUpdates(page: Int): Observable { + return super.fetchSearchManga(page, "", createSortFilter("updated_at", false)) } override fun List.additionalParse(): List { return this.filter { it.language == internalLang }.toMutableList() } + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + return GET("$baseUrl/comics", headers) + } + + private val tokenRegex = """self\.__next_f\.push\(.*token\\":\\"(.*?)\\"\}""".toRegex() + + override fun searchMangaParse( + response: Response, + page: Int, + query: String, + filters: FilterList, + ): MangasPage { + val token = tokenRegex.find(response.body.string())?.groupValues?.get(1) + ?: throw Exception("Token not found") + + val apiHeaders = headersBuilder() + .add("X-Eternal-Key", token) + .build() + + val apiResponse = client.newCall(GET("$apiBaseUrl$apiPath/comics-actu", apiHeaders)).execute() + return super.searchMangaParse(apiResponse, page, query, filters) + } + override fun mangaDetailsParse(response: Response) = SManga.create().apply { val body = jsRedirect(response) @@ -92,7 +121,7 @@ open class EternalMangas( private fun jsRedirect(response: Response): String { var body = response.body.string() val document = Jsoup.parse(body) - document.selectFirst("body > form[method=post]")?.let { + document.selectFirst("body > form[method=post], body > div[hidden] > form[method=post]")?.let { val action = it.attr("action") val inputs = it.select("input") @@ -106,8 +135,13 @@ open class EternalMangas( return body } - @Serializable - class LatestUpdatesDto( - val updates: Map>>, - ) + private fun createSortFilter(value: String, ascending: Boolean = false): FilterList { + val sortProperties = getSortProperties() + val index = sortProperties.indexOfFirst { it.value == value }.takeIf { it >= 0 } ?: 0 + return FilterList( + SortByFilter("", sortProperties).apply { + state = Filter.Sort.Selection(index, ascending) + }, + ) + } }