diff --git a/src/en/hentai2read/build.gradle b/src/en/hentai2read/build.gradle index df9602082..39a298ed9 100644 --- a/src/en/hentai2read/build.gradle +++ b/src/en/hentai2read/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Hentai2Read' pkgNameSuffix = 'en.hentai2read' extClass = '.Hentai2Read' - extVersionCode = 7 + extVersionCode = 8 libVersion = '1.2' } diff --git a/src/en/hentai2read/src/eu/kanade/tachiyomi/extension/en/hentai2read/Hentai2Read.kt b/src/en/hentai2read/src/eu/kanade/tachiyomi/extension/en/hentai2read/Hentai2Read.kt index 76322b420..9f52f24ca 100644 --- a/src/en/hentai2read/src/eu/kanade/tachiyomi/extension/en/hentai2read/Hentai2Read.kt +++ b/src/en/hentai2read/src/eu/kanade/tachiyomi/extension/en/hentai2read/Hentai2Read.kt @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.extension.en.hentai2read import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage @@ -10,6 +11,7 @@ import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup +import java.lang.UnsupportedOperationException import java.util.Calendar import java.util.regex.Pattern import okhttp3.FormBody @@ -18,6 +20,7 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import rx.Observable class Hentai2Read : ParsedHttpSource() { @@ -71,8 +74,18 @@ class Hentai2Read : ParsedHttpSource() { override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - var searchUrl = "$baseUrl/hentai-list/advanced-search" + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + val search = requestSearch(page, query, filters) + return client.newCall(search.first) + .asObservableSuccess() + .map { response -> + parseSearch(response, page, search.second) + } + } + + private fun requestSearch(page: Int, query: String, filters: FilterList): Pair { + val searchUrl = "$baseUrl/hentai-list/advanced-search" + var sortOrder: String? = null return if (page == 1) { val form = FormBody.Builder().apply { @@ -98,18 +111,24 @@ class Hentai2Read : ParsedHttpSource() { Filter.TriState.STATE_EXCLUDE -> add("chk_wpm_pag_mng_sch_mng_tag_exc[]", tag.id.toString()) } } - is SortOrder -> searchUrl += filter.toUriPart() + is SortOrder -> sortOrder = filter.toUriPart() } } } - POST(searchUrl, headers, form.build()) + Pair(POST(searchUrl, headers, form.build()), sortOrder) } else { - GET("$searchUrl/$base64String", headers) + Pair(GET("$searchUrl/$base64String", headers), sortOrder) } } - override fun searchMangaParse(response: Response): MangasPage { - val document = response.asJsoup() + // If the user wants to search by a sort order other than alphabetical, we have to make another call + private fun parseSearch(response: Response, page: Int, sortOrder: String?): MangasPage { + val document = if (page == 1 && sortOrder != null) { + response.asJsoup().select("li.dropdown li:contains($sortOrder) a").first().attr("abs:href") + .let { client.newCall(GET(it, headers)).execute().asJsoup() } + } else { + response.asJsoup() + } val mangas = document.select(searchMangaSelector()).map { element -> searchMangaFromElement(element) @@ -123,6 +142,8 @@ class Hentai2Read : ParsedHttpSource() { return MangasPage(mangas, hasNextPage) } + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = throw UnsupportedOperationException("Not used") + override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaFromElement(element: Element): SManga { @@ -215,8 +236,8 @@ class Hentai2Read : ParsedHttpSource() { private class TagSearchMode : Filter.Select("Tag Search Mode", arrayOf("AND", "OR")) private class Tag(name: String, val id: Int) : Filter.TriState(name) private class TagList(title: String, tags: List) : Filter.Group(title, tags) - private class SortOrder(values: Array>) : UriPartFilter("Order", values) - private open class UriPartFilter(displayName: String, val vals: Array>) : + private class SortOrder(values: Array>) : UriPartFilter("Order", values) + private open class UriPartFilter(displayName: String, val vals: Array>) : Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } @@ -246,8 +267,9 @@ class Hentai2Read : ParsedHttpSource() { ) private fun getSortOrder() = arrayOf( - Pair("Most Popular", "/any/all/most-popular"), - Pair("Last Updated", "/any/all/last-updated") + Pair("Alphabetical", null), + Pair("Most Popular", "most popular"), + Pair("Last Updated", "last updated") ) // Categories : 27