From 900470df5aba15b068bfbd8b4948682936a83f4e Mon Sep 17 00:00:00 2001 From: Ota <106656898+Opi-Txm@users.noreply.github.com> Date: Mon, 11 Dec 2023 15:40:51 +0100 Subject: [PATCH] Readcomiconline: Added new filters (#19262) --- src/en/readcomiconline/build.gradle | 2 +- .../en/readcomiconline/Readcomiconline.kt | 92 +++++++++++++++---- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/src/en/readcomiconline/build.gradle b/src/en/readcomiconline/build.gradle index 50e3e0771..fc50f4187 100644 --- a/src/en/readcomiconline/build.gradle +++ b/src/en/readcomiconline/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'ReadComicOnline' pkgNameSuffix = 'en.readcomiconline' extClass = '.Readcomiconline' - extVersionCode = 16 + extVersionCode = 17 } dependencies { diff --git a/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt b/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt index e719b7cff..ea42b7fe6 100644 --- a/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt +++ b/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt @@ -99,23 +99,58 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() { override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = "$baseUrl/AdvanceSearch".toHttpUrl().newBuilder().apply { - addQueryParameter("comicName", query.trim()) - addQueryParameter("page", page.toString()) - for (filter in if (filters.isEmpty()) getFilterList() else filters) { - when (filter) { - is Status -> addQueryParameter("status", arrayOf("", "Completed", "Ongoing")[filter.state]) - is GenreList -> { - addQueryParameter("ig", filter.included.joinToString(",")) - addQueryParameter("eg", filter.excluded.joinToString(",")) - } - else -> {} - } - } - }.build() + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { // publisher > writer > artist + sorting for both if else + if (query.isEmpty() && (if (filters.isEmpty()) getFilterList() else filters).filterIsInstance<GenreList>().all { it.included.isEmpty() && it.excluded.isEmpty() }) { + val url = baseUrl.toHttpUrl().newBuilder().apply { + var pathSegmentAdded = false - return GET(url, headers) + for (filter in if (filters.isEmpty()) getFilterList() else filters) { + when (filter) { + is PublisherFilter -> { + if (filter.state.isNotEmpty()) { + addPathSegments("Publisher/${filter.state.replace(" ", "-")}") + pathSegmentAdded = true + } + } + is WriterFilter -> { + if (filter.state.isNotEmpty()) { + addPathSegments("Writer/${filter.state.replace(" ", "-")}") + pathSegmentAdded = true + } + } + is ArtistFilter -> { + if (filter.state.isNotEmpty()) { + addPathSegments("Artist/${filter.state.replace(" ", "-")}") + pathSegmentAdded = true + } + } + else -> {} + } + + if (pathSegmentAdded) { + break + } + } + addPathSegment((if (filters.isEmpty()) getFilterList() else filters).filterIsInstance<SortFilter>().first().selected.toString()) + }.build() + return GET(url, headers) + } else { + val url = "$baseUrl/AdvanceSearch".toHttpUrl().newBuilder().apply { + addQueryParameter("comicName", query.trim()) + addQueryParameter("page", page.toString()) + for (filter in if (filters.isEmpty()) getFilterList() else filters) { + when (filter) { + is Status -> addQueryParameter("status", arrayOf("", "Completed", "Ongoing")[filter.state]) + is GenreList -> { + addQueryParameter("ig", filter.included.joinToString(",")) + addQueryParameter("eg", filter.excluded.joinToString(",")) + } + else -> {} + } + } + }.build() + return GET(url, headers) + } } override fun searchMangaSelector() = popularMangaSelector() @@ -203,10 +238,35 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() { val excluded: List<String> get() = state.filter { it.isExcluded() }.map { it.gid } } + open class SelectFilter(displayName: String, private val options: Array<Pair<String, String>>) : Filter.Select<String>( + displayName, + options.map { it.first }.toTypedArray(), + ) { + open val selected get() = options[state].second.takeUnless { it.isEmpty() } + } + + private class PublisherFilter() : Filter.Text("Publisher") + private class WriterFilter() : Filter.Text("Writer") + private class ArtistFilter() : Filter.Text("Artist") + private class SortFilter : SelectFilter( + "Sort By", + arrayOf( + Pair("Alphabet", ""), + Pair("Popularity", "MostPopular"), + Pair("Latest Update", "LatestUpdate"), + Pair("New Comic", "Newest"), + ), + ) override fun getFilterList() = FilterList( Status(), GenreList(getGenreList()), + Filter.Separator(), + Filter.Header("Filters below is ignored when Status,Genre or the queue is not empty."), + SortFilter(), + PublisherFilter(), + WriterFilter(), + ArtistFilter(), ) // $("select[name=\"genres\"]").map((i,el) => `Genre("${$(el).next().text().trim()}", ${i})`).get().join(',\n')