zh/boylove: fix unscrambler/filter selectors, Add VIP manga filter (#10206)

zh/boylove: fix unscrambler/filter selectors and add filter entry for VIP manga
This commit is contained in:
morallkat 2025-08-22 03:16:58 +08:00 committed by Draff
parent 510d50ab58
commit 508414951e
Signed by: Draff
GPG Key ID: E8A89F3211677653
3 changed files with 16 additions and 7 deletions

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'BoyLove' extName = 'BoyLove'
extClass = '.BoyLove' extClass = '.BoyLove'
extVersionCode = 14 extVersionCode = 15
isNsfw = true isNsfw = true
} }

View File

@ -137,9 +137,9 @@ class BoyLove : HttpSource(), ConfigurableSource {
} }
private fun Document.getPartsCount(): Int? { private fun Document.getPartsCount(): Int? {
return selectFirst("script:containsData(do_mergeImg):containsData(context0 =)")?.data()?.run { return selectFirst("script:containsData(firstMergeImg):containsData(imageData)")?.data()?.run {
substringBefore("canvas0.width") substringBefore("var scrollTop")
.substringAfterLast("var ") .substringAfterLast("var randomClass = ")
.substringBefore(';') .substringBefore(';')
.trim() .trim()
.substringAfterLast(" ") .substringAfterLast(" ")
@ -169,6 +169,8 @@ class BoyLove : HttpSource(), ConfigurableSource {
StatusFilter(), StatusFilter(),
TypeFilter(), TypeFilter(),
genreFilter, genreFilter,
Filter.Header("若要观看VIP漫画请先在Webview中登录网站并确认您的账户已达到Lv3"),
VipFilter(),
// SortFilter(), // useless // SortFilter(), // useless
) )
} }
@ -179,7 +181,7 @@ class BoyLove : HttpSource(), ConfigurableSource {
try { try {
val request = client.newCall(GET("$baseUrl/home/book/cate.html", headers)) val request = client.newCall(GET("$baseUrl/home/book/cate.html", headers))
val document = request.execute().asJsoup() val document = request.execute().asJsoup()
genres = document.select("ul[data-str=tag] > li[class] > a") genres = document.select("div[data-str=tag] > a.button")
.map { it.ownText() }.toTypedArray() .map { it.ownText() }.toTypedArray()
} catch (e: Throwable) { } catch (e: Throwable) {
isFetchingGenres = false isFetchingGenres = false

View File

@ -12,23 +12,25 @@ import eu.kanade.tachiyomi.source.model.FilterList
* [4] page, index from 1 * [4] page, index from 1
* [5] type, 0=all, 1=清水, 2=有肉 * [5] type, 0=all, 1=清水, 2=有肉
* [6] 1=manga, 2=novel, else=manga * [6] 1=manga, 2=novel, else=manga
* [7] vip, 0=default, useless * [7] vip, 2=all, 0=without, 1=hasvip
*/ */
internal fun parseFilters(page: Int, filters: FilterList): String { internal fun parseFilters(page: Int, filters: FilterList): String {
var status = '2' var status = '2'
var type = '0' var type = '0'
var genre = "0" var genre = "0"
var sort = '1' var sort = '1'
var vip = '2'
for (filter in filters) { for (filter in filters) {
when (filter) { when (filter) {
is StatusFilter -> status = STATUS_KEYS[filter.state] is StatusFilter -> status = STATUS_KEYS[filter.state]
is TypeFilter -> type = TYPE_KEYS[filter.state] is TypeFilter -> type = TYPE_KEYS[filter.state]
is GenreFilter -> if (filter.state > 0) genre = filter.values[filter.state] is GenreFilter -> if (filter.state > 0) genre = filter.values[filter.state]
is SortFilter -> sort = SORT_KEYS[filter.state] is SortFilter -> sort = SORT_KEYS[filter.state]
is VipFilter -> vip = VIP_KEYS[filter.state]
else -> {} else -> {}
} }
} }
return "1-$genre-$status-$sort-$page-$type-1-0" return "1-$genre-$status-$sort-$page-$type-1-$vip"
} }
internal class StatusFilter : Filter.Select<String>("状态", STATUS_NAMES) internal class StatusFilter : Filter.Select<String>("状态", STATUS_NAMES)
@ -47,3 +49,8 @@ internal class SortFilter : Filter.Select<String>("排序", SORT_NAMES)
private val SORT_NAMES = arrayOf("顺序", "类似排行榜") private val SORT_NAMES = arrayOf("顺序", "类似排行榜")
private val SORT_KEYS = arrayOf('1', '2') private val SORT_KEYS = arrayOf('1', '2')
internal class VipFilter : Filter.Select<String>("漫画权限", VIP_NAMES)
private val VIP_NAMES = arrayOf("全部", "非会员可观看", "VIP 漫画")
private val VIP_KEYS = arrayOf('2', '0', '1')