ReadManhwa - add filters (#3032)

* ReadManhwa - add filters

* Use HttpUrl
This commit is contained in:
Mike 2020-05-06 09:09:55 -04:00 committed by GitHub
parent c08bbfb10b
commit df8e210c5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 115 additions and 3 deletions

View File

@ -5,7 +5,7 @@ ext {
appName = 'Tachiyomi: ReadManhwa' appName = 'Tachiyomi: ReadManhwa'
pkgNameSuffix = 'en.readmanhwa' pkgNameSuffix = 'en.readmanhwa'
extClass = '.ReadManhwa' extClass = '.ReadManhwa'
extVersionCode = 1 extVersionCode = 2
libVersion = '1.2' libVersion = '1.2'
} }

View File

@ -9,6 +9,7 @@ import com.google.gson.JsonArray
import com.google.gson.JsonObject import com.google.gson.JsonObject
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess 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.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
@ -18,6 +19,7 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Calendar import java.util.Calendar
import java.util.Locale import java.util.Locale
import okhttp3.HttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -70,14 +72,35 @@ class ReadManhwa : HttpSource() {
// Search // Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
return GET("$baseUrl/api/comics?page=$page&q=$query&sort=uploaded_at&order=desc&duration=day", headers) val url = HttpUrl.parse("$baseUrl/api/comics")!!.newBuilder()
.addQueryParameter("per_page", "18")
.addQueryParameter("page", page.toString())
.addQueryParameter("order", "desc")
.addQueryParameter("q", query)
filters.forEach { filter ->
when (filter) {
is SortFilter -> url.addQueryParameter("sort", filter.toUriPart())
is GenreFilter -> url.addQueryParameter("tags", filter.toUriPart())
is DurationFilter -> url.addQueryParameter("duration", filter.toUriPart())
}
}
return GET(url.toString(), headers)
} }
override fun searchMangaParse(response: Response): MangasPage = parseMangaFromJson(response) override fun searchMangaParse(response: Response): MangasPage = parseMangaFromJson(response)
// Details // Details
override fun mangaDetailsRequest(manga: SManga): Request { // Workaround to allow "Open in browser" to use the real URL
override fun fetchMangaDetails(manga: SManga): Observable<SManga> =
client.newCall(apiMangaDetailsRequest(manga)).asObservableSuccess()
.map { mangaDetailsParse(it).apply { initialized = true } }
// Return the real URL for "Open in browser"
override fun mangaDetailsRequest(manga: SManga) = GET("$baseUrl/en/webtoon/${manga.url}", headers)
private fun apiMangaDetailsRequest(manga: SManga): Request {
return GET("$baseUrl/api/comics/${manga.url}", headers) return GET("$baseUrl/api/comics/${manga.url}", headers)
} }
@ -154,4 +177,93 @@ class ReadManhwa : HttpSource() {
} }
override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException("Not used") override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException("Not used")
// Filters
override fun getFilterList() = FilterList(
GenreFilter(getGenreList()),
DurationFilter(getDurationList()),
SortFilter(getSortList())
)
private class GenreFilter(pairs: Array<Pair<String, String>>) : UriPartFilter("Genre", pairs)
private class DurationFilter(pairs: Array<Pair<String, String>>) : UriPartFilter("Duration", pairs)
private class SortFilter(pairs: Array<Pair<String, String>>) : UriPartFilter("Sorted by", pairs)
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
}
private fun getGenreList() = arrayOf(
Pair("All", "0"),
Pair("Action", "14"),
Pair("Adult", "27"),
Pair("Adventure", "6"),
Pair("Angst", "50"),
Pair("BL", "20"),
Pair("Comedy", "1"),
Pair("Completed", "53"),
Pair("Crime", "18"),
Pair("Cultivation", "37"),
Pair("Drama", "2"),
Pair("Ecchi", "46"),
Pair("Fantasy", "8"),
Pair("GL", "42"),
Pair("Gender Bender", "35"),
Pair("Gossip", "12"),
Pair("Harem", "7"),
Pair("Historical", "33"),
Pair("Horror", "19"),
Pair("Incest", "10"),
Pair("Isekai", "28"),
Pair("Josei", "48"),
Pair("M", "43"),
Pair("Manhua", "38"),
Pair("Manhwa", "40"),
Pair("Martial arts", "26"),
Pair("Mature", "30"),
Pair("Medical", "24"),
Pair("Modern", "51"),
Pair("Mystery", "15"),
Pair("NTR", "32"),
Pair("Philosophical", "44"),
Pair("Post Apocalyptic", "49"),
Pair("Psychological", "16"),
Pair("Romance", "3"),
Pair("Rpg", "41"),
Pair("School LIfe", "11"),
Pair("Sci Fi", "9"),
Pair("Seinen", "31"),
Pair("Shoujo", "36"),
Pair("Shounen", "29"),
Pair("Slice of Life", "4"),
Pair("Smut", "13"),
Pair("Sports", "5"),
Pair("Superhero", "45"),
Pair("Supernatural", "22"),
Pair("Suspense", "47"),
Pair("Thriller", "17"),
Pair("TimeTravel", "52"),
Pair("Tragedy", "23"),
Pair("Vanilla", "34"),
Pair("Webtoon", "39"),
Pair("Yaoi", "21"),
Pair("Yuri", "25")
)
private fun getDurationList() = arrayOf(
Pair("All time", "all"),
Pair("Year", "year"),
Pair("Month", "month"),
Pair("Week", "week"),
Pair("Day", "day")
)
private fun getSortList() = arrayOf(
Pair("Popularity", "popularity"),
Pair("Date", "uploaded_at")
)
} }