From c0ecc14dbd2728e53c4b7d0e25606976414f6e27 Mon Sep 17 00:00:00 2001 From: beerpsi <92439990+beerpiss@users.noreply.github.com> Date: Wed, 4 Jan 2023 21:20:04 +0700 Subject: [PATCH] LXHentai (#14793) * LXHentai * fix: wrong sort state for latestUpdatesRequest * fix: manga description selector * remove random newline * Revert "remove random newline" This reverts commit b1f0202aea80b37f524944b8dad8be5d78602235. * Update LxHentai.kt --- src/vi/lxhentai/AndroidManifest.xml | 24 ++ src/vi/lxhentai/build.gradle | 12 + .../lxhentai/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1861 bytes .../lxhentai/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1037 bytes .../lxhentai/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2645 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4815 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 7160 bytes src/vi/lxhentai/res/web_hi_res_512.png | Bin 0 -> 28260 bytes .../extension/vi/lxhentai/LxHentai.kt | 303 ++++++++++++++++++ .../vi/lxhentai/LxHentaiUrlActivity.kt | 35 ++ 10 files changed, 374 insertions(+) create mode 100644 src/vi/lxhentai/AndroidManifest.xml create mode 100644 src/vi/lxhentai/build.gradle create mode 100644 src/vi/lxhentai/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/vi/lxhentai/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/vi/lxhentai/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/vi/lxhentai/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/vi/lxhentai/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/vi/lxhentai/res/web_hi_res_512.png create mode 100644 src/vi/lxhentai/src/eu/kanade/tachiyomi/extension/vi/lxhentai/LxHentai.kt create mode 100644 src/vi/lxhentai/src/eu/kanade/tachiyomi/extension/vi/lxhentai/LxHentaiUrlActivity.kt diff --git a/src/vi/lxhentai/AndroidManifest.xml b/src/vi/lxhentai/AndroidManifest.xml new file mode 100644 index 000000000..14f660088 --- /dev/null +++ b/src/vi/lxhentai/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/vi/lxhentai/build.gradle b/src/vi/lxhentai/build.gradle new file mode 100644 index 000000000..86588bd15 --- /dev/null +++ b/src/vi/lxhentai/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'LXHentai' + pkgNameSuffix = 'vi.lxhentai' + extClass = '.LxHentai' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" \ No newline at end of file diff --git a/src/vi/lxhentai/res/mipmap-hdpi/ic_launcher.png b/src/vi/lxhentai/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..537f29002b77ca9783fe9aed6506bda7c0337060 GIT binary patch literal 1861 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 literal 0 HcmV?d00001 diff --git a/src/vi/lxhentai/res/mipmap-xxxhdpi/ic_launcher.png b/src/vi/lxhentai/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..739b0bc271b98be91980262954e8744a391d518d GIT binary patch literal 7160 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 z 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 T!*OvC_^~-)XO+K?c;o*83dVp# literal 0 HcmV?d00001 diff --git a/src/vi/lxhentai/src/eu/kanade/tachiyomi/extension/vi/lxhentai/LxHentai.kt b/src/vi/lxhentai/src/eu/kanade/tachiyomi/extension/vi/lxhentai/LxHentai.kt new file mode 100644 index 000000000..b5f0e7d1a --- /dev/null +++ b/src/vi/lxhentai/src/eu/kanade/tachiyomi/extension/vi/lxhentai/LxHentai.kt @@ -0,0 +1,303 @@ +package eu.kanade.tachiyomi.extension.vi.lxhentai + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import okhttp3.Headers +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import org.jsoup.select.Evaluator +import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale + +class LxHentai : ParsedHttpSource() { + + override val name = "LXHentai" + + override val baseUrl = "https://lxmanga.net" + + override val lang = "vi" + + override val supportsLatest = true + + override val client: OkHttpClient = network.cloudflareClient + + override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl) + + override fun popularMangaRequest(page: Int) = + searchMangaRequest(page, "", FilterList(SortBy(3))) + + override fun popularMangaSelector() = searchMangaSelector() + + override fun popularMangaFromElement(element: Element) = + searchMangaFromElement(element) + + override fun popularMangaNextPageSelector() = + searchMangaNextPageSelector() + + override fun latestUpdatesRequest(page: Int) = + searchMangaRequest(page, "", FilterList(SortBy(0))) + + override fun latestUpdatesSelector() = searchMangaSelector() + + override fun latestUpdatesFromElement(element: Element) = + searchMangaFromElement(element) + + override fun latestUpdatesNextPageSelector() = + searchMangaNextPageSelector() + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return when { + query.startsWith(PREFIX_ID_SEARCH) -> { + val id = query.removePrefix(PREFIX_ID_SEARCH).trim() + fetchMangaDetails( + SManga.create().apply { + url = "/truyen/$id" + } + ) + .map { MangasPage(listOf(it), false) } + } + else -> super.fetchSearchManga(page, query, filters) + } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = baseUrl.toHttpUrl().newBuilder().apply { + var canAddTextFilter = true + + addPathSegment("tim-kiem") + addQueryParameter("page", page.toString()) + + if (query.isNotEmpty()) { + addQueryParameter("filter[name]", query) + canAddTextFilter = false + } + + (if (filters.isEmpty()) getFilterList() else filters).forEach { + when (it) { + is GenreList -> it.state.forEach { genre -> + when (genre.state) { + Filter.TriState.STATE_INCLUDE -> addQueryParameter("filter[accept_genres]", genre.id.toString()) + Filter.TriState.STATE_EXCLUDE -> addQueryParameter("filter[reject_genres]", genre.id.toString()) + } + } + is Author -> if (canAddTextFilter && it.state.isNotEmpty()) { + addQueryParameter("filter[artist]", it.state) + canAddTextFilter = false + } + is Doujinshi -> if (canAddTextFilter && it.state.isNotEmpty()) { + addQueryParameter("filter[doujinshi]", it.state) + canAddTextFilter = false + } + is Status -> addQueryParameter("filter[status]", it.toUriPart()) + is SortBy -> addQueryParameter("sort", it.toUriPart()) + else -> return@forEach + } + } + }.build().toString() + return GET(url, headers) + } + + override fun searchMangaSelector(): String = "div.grid div.manga-vertical" + + override fun searchMangaFromElement(element: Element) = SManga.create().apply { + setUrlWithoutDomain(element.select("div.p-2.truncate a").first().attr("href")) + title = element.select("div.p-2.truncate a").first().text() + thumbnail_url = element.select("div.cover") + .first() + .attr("style") + .substringAfter("url('") + .substringBefore("')") + } + + override fun searchMangaNextPageSelector() = "li:contains(Cuối)" + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.select("span.text-lg.ml-1.font-semibold").first().text() + author = document.select("div.grow div.mt-2:contains(Tác giả) span a") + .joinToString { it.text().trim(',', ' ') } + genre = document.select("div.grow div.mt-2:contains(Thể loại) span a") + .joinToString { it.text().trim(',', ' ') } + + description = "" + document.select("div.grow div.mt-2").forEach { + val key = it.select("span.mr-2").text().trim(':', ' ') + if (key in arrayOf("Tác giả", "Thể loại", "Tình trạng", "Lần cuối")) { + return@forEach + } + val value = it.select("span:not(.mr-2)").text() + description += "$key: $value\n" + } + description += "\n" + description += document.select("p:contains(Tóm tắt) ~ p").joinToString("\n") { + it.run { + select(Evaluator.Tag("br")).prepend("\\n") + this.text().replace("\\n", "\n").replace("\n ", "\n") + } + }.trim() + + thumbnail_url = document.select(".cover") + .first() + .attr("style") + .substringAfter("url('") + .substringBefore("')") + + val statusString = document.select("div.grow div.mt-2:contains(Tình trạng) a").first().text() + status = when (statusString) { + "Đã hoàn thành" -> SManga.COMPLETED + "Đang tiến hành" -> SManga.ONGOING + else -> SManga.UNKNOWN + } + } + + override fun chapterListSelector(): String = "ul.overflow-y-auto.overflow-x-hidden a" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + setUrlWithoutDomain(element.attr("href")) + name = element.select("span.text-ellipsis").text() + date_upload = kotlin.runCatching { + dateFormat.parse(element.select("span.timeago").attr("datetime"))?.time + }.getOrNull() ?: 0L + + val match = CHAPTER_NUMBER_REGEX.findAll(name) + chapter_number = if (match.count() > 1 && name.lowercase().startsWith("vol")) { + match.elementAt(1) + } else { + match.elementAtOrNull(0) + }?.value?.toFloat() ?: -1f + } + + override fun pageListParse(document: Document): List = document + .select("div.text-center img.lazy") + .mapIndexed { idx, element -> Page(idx, "", element.attr("abs:src")) } + + override fun imageUrlParse(document: Document) = throw Exception("Not used") + + private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US) + + private open class UriPartFilter(displayName: String, val vals: Array>, state: Int = 0) : + Filter.Select(displayName, vals.map { it.first }.toTypedArray(), state) { + fun toUriPart() = vals[state].second + } + + private class SortBy(state: Int = 0) : UriPartFilter( + "Sắp xếp theo", + arrayOf( + Pair("Mới cập nhật", "-updated_at"), + Pair("Mới nhất", "-created_at"), + Pair("Cũ nhất", "created_at"), + Pair("Xem nhiều", "-views"), + Pair("A-Z", "name"), + Pair("Z-A", "-name"), + ), + state + ) + + private class Status : UriPartFilter( + "Trạng thái", + arrayOf( + Pair("Tất cả", "1,2"), + Pair("Đang tiến hành", "2"), + Pair("Đã hoàn thành", "1"), + ), + ) + + private class Genre(name: String, val id: Int) : Filter.TriState(name) + private class GenreList(genres: List) : Filter.Group("Thể loại", genres) + + private class Author : Filter.Text("Tác giả", "") + private class Doujinshi : Filter.Text("Doujinshi", "") + + override fun getFilterList(): FilterList = FilterList( + SortBy(3), + GenreList(getGenreList()), + Filter.Header("Không dùng được với nhau và với tìm tựa đề"), + Author(), + 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")) + private fun getGenreList(): List = listOf( + Genre("Mature", 1), + Genre("Manhwa", 2), + Genre("Group", 3), + Genre("Housewife", 4), + Genre("NTR", 5), + Genre("Adult", 6), + Genre("Series", 7), + Genre("Complete", 8), + Genre("Ngực Lớn", 9), + Genre("Lãng Mạn", 10), + Genre("Truyện Màu", 11), + Genre("Mind Break", 12), + Genre("Mắt Kính", 13), + Genre("Ngực Nhỏ", 14), + Genre("Fantasy", 15), + Genre("Ecchi", 16), + Genre("Bạo Dâm", 17), + Genre("Harem", 18), + Genre("Hài Hước", 19), + Genre("Cosplay", 20), + Genre("Hầu Gái", 21), + Genre("Loli", 22), + Genre("Shota", 23), + Genre("Gangbang", 24), + Genre("Doujinshi", 25), + Genre("Guro", 26), + Genre("Virgin", 27), + Genre("OneShot", 28), + Genre("Chơi Hai Lỗ", 29), + Genre("Hậu Môn", 30), + Genre("Nữ Sinh", 31), + Genre("Mang Thai", 32), + Genre("Giáo Viên", 33), + Genre("Loạn Luân", 34), + Genre("Truyện Không Che", 35), + Genre("Futanari", 36), + Genre("Yuri", 37), + Genre("Nô Lệ", 38), + Genre("Đồ Bơi", 39), + Genre("Thể Thao", 40), + Genre("Truyện Ngắn", 41), + Genre("Lão Gìa Dâm", 42), + Genre("Hãm Hiếp", 43), + Genre("Monster Girl", 44), + Genre("Y Tá", 45), + Genre("Supernatural", 46), + Genre("3D", 47), + Genre("Truyện Comic", 48), + Genre("Animal girl", 49), + Genre("Thú Vật", 50), + Genre("Kinh Dị", 51), + Genre("Quái Vật", 52), + Genre("Xúc Tua", 53), + Genre("Gender Bender", 54), + Genre("Yaoi", 55), + Genre("CG", 56), + Genre("Trap", 57), + Genre("Furry", 58), + Genre("Mind Control", 59), + Genre("Elf", 60), + Genre("Côn Trùng", 61), + Genre("Kogal", 62), + Genre("Artist", 63), + Genre("Scat", 64), + Genre("Milf", 65), + Genre("LXHENTAI", 66), + ) + + companion object { + const val PREFIX_ID_SEARCH = "id:" + + val CHAPTER_NUMBER_REGEX = Regex("""[+\-]?([0-9]*[.])?[0-9]+""", RegexOption.IGNORE_CASE) + } +} diff --git a/src/vi/lxhentai/src/eu/kanade/tachiyomi/extension/vi/lxhentai/LxHentaiUrlActivity.kt b/src/vi/lxhentai/src/eu/kanade/tachiyomi/extension/vi/lxhentai/LxHentaiUrlActivity.kt new file mode 100644 index 000000000..aa47cbc94 --- /dev/null +++ b/src/vi/lxhentai/src/eu/kanade/tachiyomi/extension/vi/lxhentai/LxHentaiUrlActivity.kt @@ -0,0 +1,35 @@ +package eu.kanade.tachiyomi.extension.vi.lxhentai + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +class LxHentaiUrlActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val pathSegments = intent?.data?.pathSegments + if (pathSegments != null && pathSegments.size > 1) { + val id = pathSegments[1] + try { + startActivity( + Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", "id:$id") + putExtra("filter", packageName) + } + ) + } catch (e: ActivityNotFoundException) { + Log.e("LxHentaiUrlActivity", e.toString()) + } + } else { + Log.e("LxHentaiUrlActivity", "Could not parse URI from intent $intent") + } + + finish() + exitProcess(0) + } +}