Manhuagui: Add Ranking Filter (#7499)
* Manhugui: Add Ranking Filter * Manhugui: Fix original sort function * Manhuagui: Correct the file name
This commit is contained in:
parent
0d94dabe27
commit
4b90bdeb0c
|
@ -1,7 +1,7 @@
|
||||||
ext {
|
ext {
|
||||||
extName = 'ManHuaGui'
|
extName = 'ManHuaGui'
|
||||||
extClass = '.Manhuagui'
|
extClass = '.Manhuagui'
|
||||||
extVersionCode = 21
|
extVersionCode = 22
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
|
|
@ -130,19 +130,31 @@ class Manhuagui(
|
||||||
|
|
||||||
// Example: https://www.manhuagui.com/list/japan_maoxian_qingnian_2020_b/update_p1.html
|
// Example: https://www.manhuagui.com/list/japan_maoxian_qingnian_2020_b/update_p1.html
|
||||||
// /$params /$sortOrder $page
|
// /$params /$sortOrder $page
|
||||||
var url = "$baseUrl/list"
|
val url: String = when {
|
||||||
if (params != "") {
|
sortOrder == "" -> "$baseUrl/list${params.toPathOrEmpty()}/index_p$page.html"
|
||||||
url += "/$params"
|
sortOrder.startsWith(RANK_PREFIX) -> {
|
||||||
}
|
"$baseUrl/rank${params.toPathOrEmpty()}".let {
|
||||||
url += if (sortOrder == "") {
|
if (it.endsWith("rank")) {
|
||||||
"/index_p$page.html"
|
"$it/${sortOrder.removePrefix(RANK_PREFIX).toPathOrEmpty("",".html")}"
|
||||||
} else {
|
} else {
|
||||||
"/${sortOrder}_p$page.html"
|
"$it${sortOrder.removePrefix(RANK_PREFIX).toPathOrEmpty("_")}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> "$baseUrl/list${params.toPathOrEmpty()}/${sortOrder}_p$page.html"
|
||||||
}
|
}
|
||||||
return GET(url, headers)
|
return GET(url, headers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun String.toPathOrEmpty(prefix: String = "/", suffix: String = ""): String {
|
||||||
|
return if (isEmpty()) {
|
||||||
|
this
|
||||||
|
} else {
|
||||||
|
"$prefix$this$suffix"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Return mobile webpage url to "Open in browser" and "Share manga".
|
// Return mobile webpage url to "Open in browser" and "Share manga".
|
||||||
override fun mangaDetailsRequest(manga: SManga): Request {
|
override fun mangaDetailsRequest(manga: SManga): Request {
|
||||||
return GET(mobileWebsiteUrl + manga.url)
|
return GET(mobileWebsiteUrl + manga.url)
|
||||||
|
@ -221,7 +233,8 @@ class Manhuagui(
|
||||||
|
|
||||||
override fun searchMangaParse(response: Response): MangasPage {
|
override fun searchMangaParse(response: Response): MangasPage {
|
||||||
val document = response.asJsoup()
|
val document = response.asJsoup()
|
||||||
if (response.request.url.encodedPath.startsWith("/s/")) {
|
return when {
|
||||||
|
response.request.url.encodedPath.startsWith("/s/") -> {
|
||||||
// Normal search
|
// Normal search
|
||||||
val mangas = document.select(searchMangaSelector()).map { element ->
|
val mangas = document.select(searchMangaSelector()).map { element ->
|
||||||
searchMangaFromElement(element)
|
searchMangaFromElement(element)
|
||||||
|
@ -230,14 +243,28 @@ class Manhuagui(
|
||||||
document.select(selector).first()
|
document.select(selector).first()
|
||||||
} != null
|
} != null
|
||||||
|
|
||||||
return MangasPage(mangas, hasNextPage)
|
MangasPage(mangas, hasNextPage)
|
||||||
} else {
|
}
|
||||||
|
response.request.url.encodedPath.startsWith("/rank/") -> {
|
||||||
|
MangasPage(
|
||||||
|
document.select("td.rank-title").map {
|
||||||
|
SManga.create().apply {
|
||||||
|
url = it.select("a").attr("href")
|
||||||
|
title = it.select("a").text()
|
||||||
|
// The ranking page does not include images.
|
||||||
|
}
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
// Filters search
|
// Filters search
|
||||||
val mangas = document.select(popularMangaSelector()).map { element ->
|
val mangas = document.select(popularMangaSelector()).map { element ->
|
||||||
popularMangaFromElement(element)
|
popularMangaFromElement(element)
|
||||||
}
|
}
|
||||||
val hasNextPage = document.select(popularMangaNextPageSelector()).first() != null
|
val hasNextPage = document.select(popularMangaNextPageSelector()).first() != null
|
||||||
return MangasPage(mangas, hasNextPage)
|
MangasPage(mangas, hasNextPage)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,6 +564,10 @@ class Manhuagui(
|
||||||
Pair("最新发布", ""), // Publish date
|
Pair("最新发布", ""), // Publish date
|
||||||
Pair("最新更新", "update"),
|
Pair("最新更新", "update"),
|
||||||
Pair("评分最高", "rate"),
|
Pair("评分最高", "rate"),
|
||||||
|
Pair("日排行", RANK_PREFIX),
|
||||||
|
Pair("周排行", "${RANK_PREFIX}week"),
|
||||||
|
Pair("月排行", "${RANK_PREFIX}month"),
|
||||||
|
Pair("总排行", "${RANK_PREFIX}total"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -614,6 +645,11 @@ class Manhuagui(
|
||||||
"按年份",
|
"按年份",
|
||||||
arrayOf(
|
arrayOf(
|
||||||
Pair("全部", ""),
|
Pair("全部", ""),
|
||||||
|
Pair("2025年", "2025"),
|
||||||
|
Pair("2024年", "2024"),
|
||||||
|
Pair("2023年", "2023"),
|
||||||
|
Pair("2022年", "2022"),
|
||||||
|
Pair("2021年", "2021"),
|
||||||
Pair("2020年", "2020"),
|
Pair("2020年", "2020"),
|
||||||
Pair("2019年", "2019"),
|
Pair("2019年", "2019"),
|
||||||
Pair("2018年", "2018"),
|
Pair("2018年", "2018"),
|
||||||
|
@ -698,6 +734,8 @@ class Manhuagui(
|
||||||
private const val IMAGE_CDN_RATELIMIT_PREF_SUMMARY = "此值影响加载图片时发起连接请求的数量。调低此值可能减小IP被屏蔽的几率,但加载速度也会变慢。需要重启软件以生效。\n当前值:%s" // "This value affects network request amount for loading image. Lower this value may reduce the chance to get IP Ban, but loading speed will be slower too. Tachiyomi restart required."
|
private const val IMAGE_CDN_RATELIMIT_PREF_SUMMARY = "此值影响加载图片时发起连接请求的数量。调低此值可能减小IP被屏蔽的几率,但加载速度也会变慢。需要重启软件以生效。\n当前值:%s" // "This value affects network request amount for loading image. Lower this value may reduce the chance to get IP Ban, but loading speed will be slower too. Tachiyomi restart required."
|
||||||
private const val IMAGE_CDN_RATELIMIT_DEFAULT_VALUE = "4"
|
private const val IMAGE_CDN_RATELIMIT_DEFAULT_VALUE = "4"
|
||||||
|
|
||||||
|
private const val RANK_PREFIX = "rank_"
|
||||||
|
|
||||||
private val ENTRIES_ARRAY = (1..10).map { i -> i.toString() }.toTypedArray()
|
private val ENTRIES_ARRAY = (1..10).map { i -> i.toString() }.toTypedArray()
|
||||||
const val PREFIX_ID_SEARCH = "id:"
|
const val PREFIX_ID_SEARCH = "id:"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,13 @@ package eu.kanade.tachiyomi.extension.zh.manhuagui
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class Comic(
|
class Sl(
|
||||||
|
val e: Int? = 0,
|
||||||
|
val m: String? = "",
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
class Comic(
|
||||||
val bid: Int? = 0,
|
val bid: Int? = 0,
|
||||||
val block_cc: String? = "",
|
val block_cc: String? = "",
|
||||||
val bname: String? = "",
|
val bname: String? = "",
|
|
@ -1,9 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.zh.manhuagui
|
|
||||||
|
|
||||||
import kotlinx.serialization.Serializable
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class Sl(
|
|
||||||
val e: Int? = 0,
|
|
||||||
val m: String? = "",
|
|
||||||
)
|
|
Loading…
Reference in New Issue