Hentai2Read - more search changes (#2857)

This commit is contained in:
Mike 2020-04-26 15:42:16 -04:00 committed by GitHub
parent b364b5a219
commit 46a3b00ac8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 12 deletions

View File

@ -5,7 +5,7 @@ ext {
appName = 'Tachiyomi: Hentai2Read' appName = 'Tachiyomi: Hentai2Read'
pkgNameSuffix = 'en.hentai2read' pkgNameSuffix = 'en.hentai2read'
extClass = '.Hentai2Read' extClass = '.Hentai2Read'
extVersionCode = 7 extVersionCode = 8
libVersion = '1.2' libVersion = '1.2'
} }

View File

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.extension.en.hentai2read
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST 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.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import java.lang.UnsupportedOperationException
import java.util.Calendar import java.util.Calendar
import java.util.regex.Pattern import java.util.regex.Pattern
import okhttp3.FormBody import okhttp3.FormBody
@ -18,6 +20,7 @@ import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import rx.Observable
class Hentai2Read : ParsedHttpSource() { class Hentai2Read : ParsedHttpSource() {
@ -71,8 +74,18 @@ class Hentai2Read : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
var searchUrl = "$baseUrl/hentai-list/advanced-search" 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<Request, String?> {
val searchUrl = "$baseUrl/hentai-list/advanced-search"
var sortOrder: String? = null
return if (page == 1) { return if (page == 1) {
val form = FormBody.Builder().apply { 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()) 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 { } else {
GET("$searchUrl/$base64String", headers) Pair(GET("$searchUrl/$base64String", headers), sortOrder)
} }
} }
override fun searchMangaParse(response: Response): MangasPage { // If the user wants to search by a sort order other than alphabetical, we have to make another call
val document = response.asJsoup() 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 -> val mangas = document.select(searchMangaSelector()).map { element ->
searchMangaFromElement(element) searchMangaFromElement(element)
@ -123,6 +142,8 @@ class Hentai2Read : ParsedHttpSource() {
return MangasPage(mangas, hasNextPage) return MangasPage(mangas, hasNextPage)
} }
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = throw UnsupportedOperationException("Not used")
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaFromElement(element: Element): SManga { override fun searchMangaFromElement(element: Element): SManga {
@ -215,8 +236,8 @@ class Hentai2Read : ParsedHttpSource() {
private class TagSearchMode : Filter.Select<String>("Tag Search Mode", arrayOf("AND", "OR")) private class TagSearchMode : Filter.Select<String>("Tag Search Mode", arrayOf("AND", "OR"))
private class Tag(name: String, val id: Int) : Filter.TriState(name) private class Tag(name: String, val id: Int) : Filter.TriState(name)
private class TagList(title: String, tags: List<Tag>) : Filter.Group<Tag>(title, tags) private class TagList(title: String, tags: List<Tag>) : Filter.Group<Tag>(title, tags)
private class SortOrder(values: Array<Pair<String, String>>) : UriPartFilter("Order", values) private class SortOrder(values: Array<Pair<String, String?>>) : UriPartFilter("Order", values)
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String?>>) :
Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
fun toUriPart() = vals[state].second fun toUriPart() = vals[state].second
} }
@ -246,8 +267,9 @@ class Hentai2Read : ParsedHttpSource() {
) )
private fun getSortOrder() = arrayOf( private fun getSortOrder() = arrayOf(
Pair("Most Popular", "/any/all/most-popular"), Pair("Alphabetical", null),
Pair("Last Updated", "/any/all/last-updated") Pair("Most Popular", "most popular"),
Pair("Last Updated", "last updated")
) )
// Categories : 27 // Categories : 27