LxHentai: Update List Genre and add rate limit (#10491)

This commit is contained in:
are-are-are 2025-09-13 21:04:29 +07:00 committed by Draff
parent ae0992fc73
commit 8fded6cbf7
Signed by: Draff
GPG Key ID: E8A89F3211677653
2 changed files with 124 additions and 76 deletions

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'LXManga' extName = 'LXManga'
extClass = '.LxHentai' extClass = '.LxHentai'
extVersionCode = 22 extVersionCode = 23
isNsfw = true isNsfw = true
} }

View File

@ -4,6 +4,7 @@ import android.content.SharedPreferences
import android.widget.Toast import android.widget.Toast
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
@ -38,7 +39,9 @@ class LxHentai : ParsedHttpSource(), ConfigurableSource {
override val supportsLatest = true override val supportsLatest = true
override val client: OkHttpClient = network.cloudflareClient override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.rateLimit(3)
.build()
override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl) override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl)
@ -92,8 +95,8 @@ class LxHentai : ParsedHttpSource(), ConfigurableSource {
when (it) { when (it) {
is GenreList -> it.state.forEach { genre -> is GenreList -> it.state.forEach { genre ->
when (genre.state) { when (genre.state) {
Filter.TriState.STATE_INCLUDE -> addQueryParameter("filter[accept_genres]", genre.id.toString()) Filter.TriState.STATE_INCLUDE -> addQueryParameter("filter[accept_genres]", genre.id)
Filter.TriState.STATE_EXCLUDE -> addQueryParameter("filter[reject_genres]", genre.id.toString()) Filter.TriState.STATE_EXCLUDE -> addQueryParameter("filter[reject_genres]", genre.id)
} }
} }
is Author -> if (canAddTextFilter && it.state.isNotEmpty()) { is Author -> if (canAddTextFilter && it.state.isNotEmpty()) {
@ -185,97 +188,142 @@ class LxHentai : ParsedHttpSource(), ConfigurableSource {
state, state,
) )
private class Status : UriPartFilter( private class Status() : UriPartFilter(
"Trạng thái", "Trạng thái",
arrayOf( arrayOf(
Pair("Tất cả", "1,2"), Pair("Tất cả", "ongoing,completed,paused"),
Pair("Đang tiến hành", "2"), Pair("Đang tiến hành", "ongoing"),
Pair("Đã hoàn thành", "1"), Pair("Đã hoàn thành", "completed"),
Pair("Tạm ngưng", "paused"),
), ),
) )
private class Genre(name: String, val id: Int) : Filter.TriState(name) private class Genre(name: String, val id: String) : Filter.TriState(name)
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Thể loại", genres) private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Thể loại", genres)
private class Author : Filter.Text("Tác giả", "") private class Author : Filter.Text("Tác giả", "")
private class Doujinshi : Filter.Text("Doujinshi", "") private class Doujinshi : Filter.Text("Doujinshi", "")
override fun getFilterList(): FilterList = FilterList( override fun getFilterList(): FilterList = FilterList(
SortBy(3), SortBy(),
GenreList(getGenreList()), GenreList(getGenreList()),
Filter.Header("Không dùng được với nhau và với tìm tựa đề"), Filter.Header("Không dùng được với nhau và với tìm tựa đề"),
Status(),
Author(), Author(),
Doujinshi(), Doujinshi(),
) )
// console.log([...document.querySelectorAll("label.ml-3.inline-flex.items-center.cursor-pointer")].map(e => `Genre("${e.querySelector(".truncate").innerText}", ${e.getAttribute("@click").replace('toggleGenre(\'', '').replace('\')', '')}),`).join("\n")) // console.log([...document.querySelectorAll("label.ml-3.inline-flex.items-center.cursor-pointer")].map(e => `Genre("${e.querySelector(".truncate").innerText}", ${e.getAttribute("@click").replace('toggleGenre(\'', '').replace('\')', '')}),`).join("\n"))
private fun getGenreList(): List<Genre> = listOf( private fun getGenreList(): List<Genre> = listOf(
Genre("Mature", 1), Genre("3D", "3d"),
Genre("Manhwa", 2), Genre("Adult", "adult"),
Genre("Group", 3), Genre("Ahegao", "ahegao"),
Genre("Housewife", 4), Genre("Anal", "anal"),
Genre("NTR", 5), Genre("Animal ", "animal-girl"),
Genre("Adult", 6), Genre("Art Book", "art-book"),
Genre("Series", 7), Genre("Artist", "artist"),
Genre("Complete", 8), Genre("Bbm", "bbm"),
Genre("Ngực Lớn", 9), Genre("BDSM", "bdsm"),
Genre("Lãng Mạn", 10), Genre("Beach", "beach"),
Genre("Truyện Màu", 11), Genre("Beast", "beast"),
Genre("Mind Break", 12), Genre("Big breasts ", "big-breasts"),
Genre("Mắt Kính", 13), Genre("Big dick", "big-dick"),
Genre("Ngực Nhỏ", 14), Genre("Big vagina", "big-vagina"),
Genre("Fantasy", 15), Genre("Blowjob", "blowjob"),
Genre("Ecchi", 16), Genre("Body modifications", "body-modifications"),
Genre("Bạo Dâm", 17), Genre("Breast Sucking", "breast-sucking"),
Genre("Harem", 18), Genre("Bukkake", "bukkake"),
Genre("Hài Hước", 19), Genre("CG", "cg"),
Genre("Cosplay", 20), Genre("Chikan", "chikan"),
Genre("Hầu Gái", 21), Genre("Comic 18+", "comic-18+"),
Genre("Loli", 22), Genre("Condom", "condom"),
Genre("Shota", 23), Genre("Cosplay", "cosplay"),
Genre("Gangbang", 24), Genre("Creampie", "creampie"),
Genre("Doujinshi", 25), Genre("Đam mỹ", "dam-my"),
Genre("Guro", 26), Genre("Defloration", "defloration"),
Genre("Virgin", 27), Genre("Dirty old man", "dirty-old-man"),
Genre("OneShot", 28), Genre("Double", "double-penetration"),
Genre("Chơi Hai Lỗ", 29), Genre("Doujinshi", "doujinshi"),
Genre("Hậu Môn", 30), Genre("Drama", "drama"),
Genre("Nữ Sinh", 31), Genre("Elf", "elf"),
Genre("Mang Thai", 32), Genre("Fantasy", "fantasy"),
Genre("Giáo Viên", 33), Genre("Femdom", "femdom"),
Genre("Loạn Luân", 34), Genre("Fingering", "fingering"),
Genre("Truyện Không Che", 35), Genre("First time", "first-time"),
Genre("Futanari", 36), Genre("Footjob", "footjob"),
Genre("Yuri", 37), Genre("Foursome", "foursome"),
Genre("Nô Lệ", 38), Genre("Full color", "full-color"),
Genre("Đồ Bơi", 39), Genre("Funny", "funny"),
Genre("Thể Thao", 40), Genre("Furry", "furry"),
Genre("Truyện Ngắn", 41), Genre("Futanari", "futanari"),
Genre("Lão Gìa Dâm", 42), Genre("Gangbang", "gangbang"),
Genre("Hãm Hiếp", 43), Genre("Gender bender", "gender-bender"),
Genre("Monster Girl", 44), Genre("Girl love", "girl-love"),
Genre("Y Tá", 45), Genre("glasses", "glasses"),
Genre("Supernatural", 46), Genre("Group", "group"),
Genre("3D", 47), Genre("Handjob", "handjob"),
Genre("Truyện Comic", 48), Genre("Harem", "harem"),
Genre("Animal girl", 49), Genre("Housewife", "housewife"),
Genre("Thú Vật", 50), Genre("Incest", "incest"),
Genre("Kinh Dị", 51), Genre("Incomplete", "incomplete"),
Genre("Quái Vật", 52), Genre("Insect", "insect"),
Genre("Xúc Tua", 53), Genre("Inseki", "inseki"),
Genre("Gender Bender", 54), Genre("Kinh dị", "kinh dị"),
Genre("Yaoi", 55), Genre("Kogal", "kogal"),
Genre("CG", 56), Genre("Lãng mãn", "lang-man"),
Genre("Trap", 57), Genre("Lếu lều", "leu-leu"),
Genre("Furry", 58), Genre("Lingerie", "lingerie"),
Genre("Mind Control", 59), Genre("Loạn luân chị em", "loan-luan-chi-em"),
Genre("Elf", 60), Genre("Loli", "loli"),
Genre("Côn Trùng", 61), Genre("LXHENTAI", "lxhentai"),
Genre("Kogal", 62), Genre("Maid", "maid"),
Genre("Artist", 63), Genre("Manhwa", "manhwa"),
Genre("Scat", 64), Genre("Masturbation", "masturbation"),
Genre("Milf", 65), Genre("Mature", "mature"),
Genre("LXHENTAI", 66), Genre("Milf", "milf"),
Genre("Mind break", "mind-break"),
Genre("Mind control", "mind-control"),
Genre("Monster", "monster"),
Genre("Monster Girl", "monster-girl"),
Genre("mother", "mother"),
Genre("No sex ", "no-sex"),
Genre("NTR", "ntr"),
Genre("NUN", "nun"),
Genre("Nurse", "nurse"),
Genre("Office", "office-lady"),
Genre("OneShot", "oneshot"),
Genre("Orgasm denial", "orgasm-denial"),
Genre("Pregnant", "pregnant"),
Genre("Rape", "rape"),
Genre("SCAT", "scat"),
Genre("Schoolboy outfit", "schoolboy-outfit"),
Genre("Schoolgirl outfit", "schoolgirl-outfit"),
Genre("Series", "series"),
Genre("Shota", "shota"),
Genre("Slave", "slave"),
Genre("Small", "small-breasts"),
Genre("Socks", "socks"),
Genre("Sole female", "sole-female"),
Genre("Sole male", "sole-male"),
Genre("Sport", "sport"),
Genre("Squirting", "squirting"),
Genre("Story arc", "story-arc"),
Genre("Succubus", "succubus"),
Genre("Supernatural", "supernatural"),
Genre("swimsuit", "swimsuit"),
Genre("Swinging", "swinging"),
Genre("Teacher", "teacher"),
Genre("Three some", "three-some"),
Genre("Toys", "toys"),
Genre("Trap", "trap"),
Genre("Truyện ngắn", "truyen-ngan"),
Genre("Tự sướng", "tu-suong"),
Genre("Uncensored", "uncensored"),
Genre("Vanilla", "vanilla"),
Genre("virginity", "virginity"),
Genre("Xúc tua", "xuc-tua"),
Genre("Yaoi", "yaoi"),
Genre("Yuri", "yuri"),
) )
private val preferences: SharedPreferences = getPreferences() private val preferences: SharedPreferences = getPreferences()