From b4a80e6085bb5f18d2e4008e9242b30daf12591b Mon Sep 17 00:00:00 2001 From: Arraiment <76941874+Arraiment@users.noreply.github.com> Date: Mon, 9 Aug 2021 18:57:57 +0800 Subject: [PATCH] Reworked search filter functionality (#8488) --- src/en/mangafreak/build.gradle | 2 +- .../extension/en/mangafreak/Mangafreak.kt | 67 +++++++++++++------ 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/en/mangafreak/build.gradle b/src/en/mangafreak/build.gradle index 2f48f0300..7bd3b3512 100644 --- a/src/en/mangafreak/build.gradle +++ b/src/en/mangafreak/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Mangafreak' pkgNameSuffix = 'en.mangafreak' extClass = '.Mangafreak' - extVersionCode = 4 + extVersionCode = 5 libVersion = '1.2' } diff --git a/src/en/mangafreak/src/eu/kanade/tachiyomi/extension/en/mangafreak/Mangafreak.kt b/src/en/mangafreak/src/eu/kanade/tachiyomi/extension/en/mangafreak/Mangafreak.kt index 52cb7eda7..2f0481d50 100644 --- a/src/en/mangafreak/src/eu/kanade/tachiyomi/extension/en/mangafreak/Mangafreak.kt +++ b/src/en/mangafreak/src/eu/kanade/tachiyomi/extension/en/mangafreak/Mangafreak.kt @@ -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) : Filter.Group("Genres", genres) + private class GenreFilter(genres: List) : Filter.Group("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>) : + Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { + fun toUriPart() = vals[state].second + } }