Reworked search filter functionality (#8488)

This commit is contained in:
Arraiment 2021-08-09 18:57:57 +08:00 committed by GitHub
parent a80e03cf4e
commit b4a80e6085
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 21 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'Mangafreak'
pkgNameSuffix = 'en.mangafreak'
extClass = '.Mangafreak'
extVersionCode = 4
extVersionCode = 5
libVersion = '1.2'
}

View File

@ -1,6 +1,5 @@
package eu.kanade.tachiyomi.extension.en.mangafreak
import android.net.Uri
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
@ -8,6 +7,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -70,34 +70,35 @@ class Mangafreak : ParsedHttpSource() {
// Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val uri = Uri.parse(baseUrl).buildUpon()
val url = baseUrl.toHttpUrlOrNull()!!.newBuilder()
if (query.isNotBlank()) {
uri.appendPath("Search")
.appendPath(query)
url.addPathSegments("Search/$query")
}
filters.forEach { filter ->
uri.appendPath("Genre")
when (filter) {
is GenreList -> {
uri.appendPath(
filter.state.joinToString("") {
when (it.state) {
Filter.TriState.STATE_IGNORE -> "0"
Filter.TriState.STATE_INCLUDE -> "1"
Filter.TriState.STATE_EXCLUDE -> "2"
else -> "0"
}
is GenreFilter -> {
val genres = filter.state.joinToString("") {
when (it.state) {
Filter.TriState.STATE_IGNORE -> "0"
Filter.TriState.STATE_INCLUDE -> "1"
Filter.TriState.STATE_EXCLUDE -> "2"
else -> "0"
}
)
}
url.addPathSegments("Genre/$genres")
}
is StatusFilter -> url.addPathSegments("Status/${filter.toUriPart()}")
is TypeFilter -> url.addPathSegments("Type/${filter.toUriPart()}")
}
uri.appendEncodedPath("Status/0/Type/0")
}
return GET(uri.toString(), headers)
return GET(url.toString(), headers)
}
override fun searchMangaNextPageSelector(): String? = null
override fun searchMangaSelector(): String = "div.manga_search_item , div.mangaka_search_item"
override fun searchMangaFromElement(element: Element): SManga = mangaFromElement(element, "h3 a")
override fun searchMangaFromElement(element: Element): SManga = mangaFromElement(element, "h3 a, h5 a")
// Details
@ -147,10 +148,13 @@ class Mangafreak : ParsedHttpSource() {
// Filter
private class Genre(name: String) : Filter.TriState(name)
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres)
private class GenreFilter(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres)
override fun getFilterList() = FilterList(
GenreList(getGenreList())
Filter.Header("Filters do not work if search bar is empty"),
GenreFilter(getGenreList()),
TypeFilter(),
StatusFilter()
)
private fun getGenreList() = listOf(
Genre("Act"),
@ -193,4 +197,27 @@ class Mangafreak : ParsedHttpSource() {
Genre("Yaoi"),
Genre("Yuri")
)
private class TypeFilter : UriPartFilter(
"Manga Type",
arrayOf(
Pair("Both", "0"),
Pair("Manga", "2"),
Pair("Manhwa", "1")
)
)
private class StatusFilter : UriPartFilter(
"Manga Status",
arrayOf(
Pair("Both", "0"),
Pair("Completed", "1"),
Pair("Ongoing", "2")
)
)
private open class UriPartFilter(displayName: String, private val vals: Array<Pair<String, String>>) :
Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
fun toUriPart() = vals[state].second
}
}