diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index d66018b25..9cb0e23ea 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -151,6 +151,8 @@ object PreferenceKeys { const val eh_sessionCookie = "eh_sessionCookie" + const val eh_hathPerksCookie = "eh_hathPerksCookie" + const val eh_enableExHentai = "enable_exhentai" const val eh_ts_aspNetCookie = "eh_ts_aspNetCookie" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index d93b68b1a..b17dac232 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -203,6 +203,7 @@ class PreferencesHelper(val context: Context) { fun eh_exhSettingsProfile() = rxPrefs.getInteger(Keys.eh_exhSettingsProfile, -1) fun eh_settingsKey() = rxPrefs.getString(Keys.eh_settingsKey, "") fun eh_sessionCookie() = rxPrefs.getString(Keys.eh_sessionCookie, "") + fun eh_hathPerksCookies() = rxPrefs.getString(Keys.eh_hathPerksCookie, "") //Lock fun eh_lockHash() = rxPrefs.getString(Keys.eh_lock_hash, null) diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt index bf68b08c1..56d966305 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt @@ -82,10 +82,18 @@ class EHentai(override val id: Long, } }) } + + val parsedLocation = HttpUrl.parse(doc.location()) + //Add to page if required - val hasNextPage = select("a[onclick=return false]").last()?.let { - it.text() == ">" - } ?: false + val hasNextPage = if(parsedLocation == null + || !parsedLocation.queryParameterNames().contains(REVERSE_PARAM)) { + select("a[onclick=return false]").last()?.let { + it.text() == ">" + } ?: false + } else { + parsedLocation.queryParameter(REVERSE_PARAM)!!.toBoolean() + } Pair(parsedMangas, hasNextPage) } @@ -155,18 +163,47 @@ class EHentai(override val id: Long, //Support direct URL importing override fun fetchSearchManga(page: Int, query: String, filters: FilterList) = urlImportFetchSearchManga(query, { - super.fetchSearchManga(page, query, filters) + searchMangaRequestObservable(page, query, filters).flatMap { + client.newCall(it).asObservableSuccess() + } .map { response -> + searchMangaParse(response) + } }) - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + private fun searchMangaRequestObservable(page: Int, query: String, filters: FilterList): Observable { val uri = Uri.parse("$baseUrl$QUERY_PREFIX").buildUpon() uri.appendQueryParameter("f_search", query) filters.forEach { if(it is UriFilter) it.addToUri(uri) } - return exGet(uri.toString(), page) + + val request = exGet(uri.toString(), page) + + // Reverse search results on filter + if(filters.any { it is ReverseFilter && it.state }) { + return client.newCall(request) + .asObservableSuccess() + .map { + val doc = it.asJsoup() + + val elements = doc.select(".ptt > tbody > tr > td") + + val totalElement = elements[elements.size - 2] + + val thisPage = totalElement.text().toInt() - (page - 1) + + uri.appendQueryParameter(REVERSE_PARAM, (thisPage > 1).toString()) + + exGet(uri.toString(), thisPage) + } + } else { + return Observable.just(request) + } } + override fun searchMangaRequest(page: Int, query: String, filters: FilterList) + = throw UnsupportedOperationException() + override fun latestUpdatesRequest(page: Int) = exGet(baseUrl, page) override fun popularMangaParse(response: Response) = genericMangaParse(response) @@ -349,6 +386,10 @@ class EHentai(override val id: Long, val sessionCookie = prefs.eh_sessionCookie().getOrDefault() if(sessionCookie != null) cookies["s"] = sessionCookie + + val hathPerksCookie = prefs.eh_hathPerksCookies().getOrDefault() + if(hathPerksCookie != null) + cookies["hath_perks"] = hathPerksCookie } //Session-less list display mode (for users without ExHentai) @@ -386,7 +427,8 @@ class EHentai(override val id: Long, //Filters override fun getFilterList() = FilterList( GenreGroup(), - AdvancedGroup() + AdvancedGroup(), + ReverseFilter() ) class GenreOption(name: String, val genreId: String): Filter.CheckBox(name, false), UriFilter { @@ -437,6 +479,8 @@ class EHentai(override val id: Long, RatingOption() )) + class ReverseFilter : Filter.CheckBox("Reverse search results") + override val name = if(exh) "ExHentai" else @@ -448,6 +492,7 @@ class EHentai(override val id: Long, companion object { val QUERY_PREFIX = "?f_apply=Apply+Filter" val TR_SUFFIX = "TR" + val REVERSE_PARAM = "TEH_REVERSE" fun buildCookies(cookies: Map) = cookies.entries.joinToString(separator = "; ") { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index e2449aa1d..cfd21537a 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -224,7 +224,7 @@ class ReaderActivity : BaseRxActivity() { retried++ } - toast("Retried $retried failed pages...") + toast("Retrying $retried failed pages...") } subscriptions += eh_retry_all_help.clicks().subscribe { diff --git a/app/src/main/java/exh/uconfig/EHConfigurator.kt b/app/src/main/java/exh/uconfig/EHConfigurator.kt index 0bb9e62e9..29fcb590c 100644 --- a/app/src/main/java/exh/uconfig/EHConfigurator.kt +++ b/app/src/main/java/exh/uconfig/EHConfigurator.kt @@ -120,11 +120,16 @@ class EHConfigurator { val sessionCookie = response.headers().toMultimap()["Set-Cookie"]?.find { it.startsWith("s=") }?.removePrefix("s=")?.substringBefore(';') + val hathPerksCookie = response.headers().toMultimap()["Set-Cookie"]?.find { + it.startsWith("hath_perks=") + }?.removePrefix("hath_perks=")?.substringBefore(';') if(keyCookie != null) prefs.eh_settingsKey().set(keyCookie) if(sessionCookie != null) prefs.eh_sessionCookie().set(sessionCookie) + if(hathPerksCookie != null) + prefs.eh_hathPerksCookies().set(hathPerksCookie) } companion object {