From a0fa7fa4586576b75b69227c9145c2c36ed2c6dc Mon Sep 17 00:00:00 2001 From: "Cuong M. Tran" Date: Tue, 19 Mar 2024 23:06:03 +0700 Subject: [PATCH] WPComics update & add new sources (#1909) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * remove non-relevant query * WPComics: query for genres instead of hard-code * language assets to support dual-lang * update XoxoComics, Nhattruyen, Nettruyen to support updated WPComics * remove unused status * JManga with new WPComics * Fix JManga NextPageSelector * Allow override some more methods * correct jmanga's location * remove redundant XoxoComics override * Get alternative name and JManga's description * add sources: - NetTruyenX - NhatTruyenS - NetTruyenCO * revert format changes * Update NetTruyen to latest domain * Minor changes: - Named parameters; - intl, lazy; * Remove NetTruyen’s replaceSearchPath. It’s not necessary * remove the japanese’s mtl * remove hard-code user-agent * remove some unnecessary named parameters * Use super.headersBuilder & fix Referer * remove redundant import --- .../assets/i18n/messages_en.properties | 7 + .../assets/i18n/messages_ja.properties | 5 + .../assets/i18n/messages_vi.properties | 7 + lib-multisrc/wpcomics/build.gradle.kts | 6 +- .../tachiyomi/multisrc/wpcomics/WPComics.kt | 215 +++++++++--------- .../extension/en/xoxocomics/XoxoComics.kt | 80 ++----- .../{ => extension}/ja/jmanga/JManga.kt | 55 +++-- .../extension/vi/nettruyen/NetTruyen.kt | 68 +----- src/vi/nettruyenco/build.gradle | 9 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3194 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1923 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4296 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7587 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10588 bytes .../extension/vi/nettruyenco/NetTruyenCO.kt | 32 +++ src/vi/nettruyenx/build.gradle | 9 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3194 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1923 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4296 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7587 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10588 bytes .../extension/vi/nettruyenx/NetTruyenX.kt | 32 +++ .../extension/vi/nhattruyen/NhatTruyen.kt | 66 +----- src/vi/nhattruyens/build.gradle | 9 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3194 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1923 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4296 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7587 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10588 bytes .../extension/vi/nhattruyens/NhatTruyenS.kt | 54 +++++ 30 files changed, 330 insertions(+), 324 deletions(-) create mode 100644 lib-multisrc/wpcomics/assets/i18n/messages_en.properties create mode 100644 lib-multisrc/wpcomics/assets/i18n/messages_ja.properties create mode 100644 lib-multisrc/wpcomics/assets/i18n/messages_vi.properties rename src/ja/jmanga/src/eu/kanade/tachiyomi/{ => extension}/ja/jmanga/JManga.kt (75%) create mode 100644 src/vi/nettruyenco/build.gradle create mode 100644 src/vi/nettruyenco/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/vi/nettruyenco/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/vi/nettruyenco/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/vi/nettruyenco/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/vi/nettruyenco/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/vi/nettruyenco/src/eu/kanade/tachiyomi/extension/vi/nettruyenco/NetTruyenCO.kt create mode 100644 src/vi/nettruyenx/build.gradle create mode 100644 src/vi/nettruyenx/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/vi/nettruyenx/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/vi/nettruyenx/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/vi/nettruyenx/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/vi/nettruyenx/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/vi/nettruyenx/src/eu/kanade/tachiyomi/extension/vi/nettruyenx/NetTruyenX.kt create mode 100644 src/vi/nhattruyens/build.gradle create mode 100644 src/vi/nhattruyens/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/vi/nhattruyens/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/vi/nhattruyens/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/vi/nhattruyens/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/vi/nhattruyens/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/vi/nhattruyens/src/eu/kanade/tachiyomi/extension/vi/nhattruyens/NhatTruyenS.kt diff --git a/lib-multisrc/wpcomics/assets/i18n/messages_en.properties b/lib-multisrc/wpcomics/assets/i18n/messages_en.properties new file mode 100644 index 000000000..9787c3889 --- /dev/null +++ b/lib-multisrc/wpcomics/assets/i18n/messages_en.properties @@ -0,0 +1,7 @@ +STATUS=Status +STATUS_ALL=All +STATUS_ONGOING=Ongoing +STATUS_COMPLETED=Completed +GENRE=Genre +GENRES_RESET=Tap 'Reset' to load genres +OTHER_NAME=Alternate Name diff --git a/lib-multisrc/wpcomics/assets/i18n/messages_ja.properties b/lib-multisrc/wpcomics/assets/i18n/messages_ja.properties new file mode 100644 index 000000000..add01ca37 --- /dev/null +++ b/lib-multisrc/wpcomics/assets/i18n/messages_ja.properties @@ -0,0 +1,5 @@ +STATUS=状態 +STATUS_ALL=全て +STATUS_ONGOING=連載中 +STATUS_COMPLETED=完結済み +GENRE=ジャンル diff --git a/lib-multisrc/wpcomics/assets/i18n/messages_vi.properties b/lib-multisrc/wpcomics/assets/i18n/messages_vi.properties new file mode 100644 index 000000000..72cbffe65 --- /dev/null +++ b/lib-multisrc/wpcomics/assets/i18n/messages_vi.properties @@ -0,0 +1,7 @@ +STATUS=Trạng thái +STATUS_ALL=Tất cả +STATUS_ONGOING=Đang tiến hành +STATUS_COMPLETED=Hoàn thành +GENRE=Thể loại +GENRES_RESET=Ấn 'Reset' để tải danh sách thể loại +OTHER_NAME=Tên khác diff --git a/lib-multisrc/wpcomics/build.gradle.kts b/lib-multisrc/wpcomics/build.gradle.kts index 6e70fd158..b21dd0bb4 100644 --- a/lib-multisrc/wpcomics/build.gradle.kts +++ b/lib-multisrc/wpcomics/build.gradle.kts @@ -2,4 +2,8 @@ plugins { id("lib-multisrc") } -baseVersionCode = 4 +baseVersionCode = 5 + +dependencies { + api(project(":lib:i18n")) +} diff --git a/lib-multisrc/wpcomics/src/eu/kanade/tachiyomi/multisrc/wpcomics/WPComics.kt b/lib-multisrc/wpcomics/src/eu/kanade/tachiyomi/multisrc/wpcomics/WPComics.kt index 2b3c7c688..92962053e 100644 --- a/lib-multisrc/wpcomics/src/eu/kanade/tachiyomi/multisrc/wpcomics/WPComics.kt +++ b/lib-multisrc/wpcomics/src/eu/kanade/tachiyomi/multisrc/wpcomics/WPComics.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.multisrc.wpcomics +import eu.kanade.tachiyomi.lib.i18n.Intl import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList @@ -7,7 +8,10 @@ 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 eu.kanade.tachiyomi.util.asJsoup +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient import okhttp3.Request @@ -20,23 +24,28 @@ import java.util.Locale abstract class WPComics( override val name: String, override val baseUrl: String, - override val lang: String, - private val dateFormat: SimpleDateFormat = SimpleDateFormat("HH:mm - dd/MM/yyyy Z", Locale.US), - private val gmtOffset: String? = "+0500", + final override val lang: String, + protected val dateFormat: SimpleDateFormat = SimpleDateFormat("HH:mm - dd/MM/yyyy Z", Locale.US), + protected val gmtOffset: String? = "+0500", ) : ParsedHttpSource() { override val supportsLatest = true override val client: OkHttpClient = network.cloudflareClient - override fun headersBuilder(): Headers.Builder = Headers.Builder() - .add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0") - .add("Referer", baseUrl) + override fun headersBuilder() = super.headersBuilder() + .add("Referer", "$baseUrl/") - private fun List.doesInclude(thisWord: String): Boolean = this.any { it.contains(thisWord, ignoreCase = true) } + open val intl = Intl( + language = lang, + baseLanguage = "en", + availableLanguages = setOf("en", "vi", "ja"), + classLoader = this::class.java.classLoader!!, + ) + + protected fun List.doesInclude(thisWord: String): Boolean = this.any { it.contains(thisWord, ignoreCase = true) } // Popular - open val popularPath = "hot" override fun popularMangaRequest(page: Int): Request { @@ -58,7 +67,6 @@ abstract class WPComics( override fun popularMangaNextPageSelector() = "a.next-page, a[rel=next]" // Latest - override fun latestUpdatesRequest(page: Int): Request { return GET(baseUrl + if (page > 1) "?page=$page" else "", headers) } @@ -70,35 +78,27 @@ abstract class WPComics( override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() // Search - protected open val searchPath = "tim-truyen" protected open val queryParam = "keyword" - protected open fun String.replaceSearchPath() = this - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val filterList = filters.let { if (it.isEmpty()) getFilterList() else it } - return if (filterList.isEmpty()) { - GET("$baseUrl/?s=$query&post_type=comics&page=$page") - } else { - val url = "$baseUrl/$searchPath".toHttpUrl().newBuilder() + val url = "$baseUrl/$searchPath".toHttpUrl().newBuilder() - filterList.forEach { filter -> - when (filter) { - is GenreFilter -> filter.toUriPart()?.let { url.addPathSegment(it) } - is StatusFilter -> filter.toUriPart()?.let { url.addQueryParameter("status", it) } - else -> {} - } + filters.forEach { filter -> + when (filter) { + is GenreFilter -> filter.toUriPart()?.let { url.addPathSegment(it) } + is StatusFilter -> filter.toUriPart()?.let { url.addQueryParameter("status", it) } + else -> {} } - - url.apply { - addQueryParameter(queryParam, query) - addQueryParameter("page", page.toString()) - addQueryParameter("sort", "0") - } - - GET(url.toString().replaceSearchPath(), headers) } + + url.apply { + addQueryParameter(queryParam, query) + addQueryParameter("page", page.toString()) + addQueryParameter("sort", "0") + } + + return GET(url.toString(), headers) } override fun searchMangaSelector() = "div.items div.item" @@ -116,22 +116,23 @@ abstract class WPComics( override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() // Details - override fun mangaDetailsParse(document: Document): SManga { return SManga.create().apply { document.select("article#item-detail").let { info -> author = info.select("li.author p.col-xs-8").text() status = info.select("li.status p.col-xs-8").text().toStatus() genre = info.select("li.kind p.col-xs-8 a").joinToString { it.text() } - description = info.select("div.detail-content p").text() + val otherName = info.select("h2.other-name").text() + description = info.select("div.detail-content p").text() + + if (otherName.isNotBlank()) "\n\n ${intl["OTHER_NAME"]}: $otherName" else "" thumbnail_url = imageOrNull(info.select("div.col-image img").first()!!) } } } open fun String?.toStatus(): Int { - val ongoingWords = listOf("Ongoing", "Updating", "Đang tiến hành") - val completedWords = listOf("Complete", "Completed", "Hoàn thành") + val ongoingWords = listOf("Ongoing", "Updating", "Đang tiến hành", "連載中") + val completedWords = listOf("Complete", "Completed", "Hoàn thành", "完結済み") return when { this == null -> SManga.UNKNOWN ongoingWords.doesInclude(this) -> SManga.ONGOING @@ -141,7 +142,6 @@ abstract class WPComics( } // Chapters - override fun chapterListSelector() = "div.list-chapter li.row:not(.heading)" override fun chapterFromElement(element: Element): SChapter { @@ -154,10 +154,10 @@ abstract class WPComics( } } - private val currentYear by lazy { Calendar.getInstance(Locale.US)[1].toString().takeLast(2) } + protected val currentYear by lazy { Calendar.getInstance(Locale.US)[1].toString().takeLast(2) } - protected fun String?.toDate(): Long { - this ?: return 0 + protected open fun String?.toDate(): Long { + this ?: return 0L val secondWords = listOf("second", "giây") val minuteWords = listOf("minute", "phút") @@ -182,10 +182,10 @@ abstract class WPComics( (if (gmtOffset == null) this.substringAfterLast(" ") else "$this $gmtOffset").let { // timestamp has year if (Regex("""\d+/\d+/\d\d""").find(it)?.value != null) { - dateFormat.parse(it)?.time ?: 0 + dateFormat.parse(it)?.time ?: 0L } else { // MangaSum - timestamp sometimes doesn't have year (current year implied) - dateFormat.parse("$it/$currentYear")?.time ?: 0 + dateFormat.parse("$it/$currentYear")?.time ?: 0L } } } @@ -195,9 +195,8 @@ abstract class WPComics( } // Pages - - // sources sometimes have an image element with an empty attr that isn't really an image open fun imageOrNull(element: Element): String? { + // sources sometimes have an image element with an empty attr that isn't really an image fun Element.hasValidAttr(attr: String): Boolean { val regex = Regex("""https?://.*""", RegexOption.IGNORE_CASE) return when { @@ -226,80 +225,74 @@ abstract class WPComics( override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException() // Filters + protected class StatusFilter(name: String, pairs: List>) : UriPartFilter(name, pairs) - protected class StatusFilter(vals: Array>) : UriPartFilter("Status", vals) - protected class GenreFilter(vals: Array>) : UriPartFilter("Genre", vals) + protected class GenreFilter(name: String, pairs: List>) : UriPartFilter(name, pairs) - protected open fun getStatusList(): Array> = arrayOf( - Pair(null, "Tất cả"), - Pair("1", "Đang tiến hành"), - Pair("2", "Đã hoàn thành"), - Pair("3", "Tạm ngừng"), - ) - protected open fun getGenreList(): Array> = arrayOf( - null to "Tất cả", - "action" to "Action", - "adult" to "Adult", - "adventure" to "Adventure", - "anime" to "Anime", - "chuyen-sinh" to "Chuyển Sinh", - "comedy" to "Comedy", - "comic" to "Comic", - "cooking" to "Cooking", - "co-dai" to "Cổ Đại", - "doujinshi" to "Doujinshi", - "drama" to "Drama", - "dam-my" to "Đam Mỹ", - "ecchi" to "Ecchi", - "fantasy" to "Fantasy", - "gender-bender" to "Gender Bender", - "harem" to "Harem", - "historical" to "Historical", - "horror" to "Horror", - "josei" to "Josei", - "live-action" to "Live action", - "manga" to "Manga", - "manhua" to "Manhua", - "manhwa" to "Manhwa", - "martial-arts" to "Martial Arts", - "mature" to "Mature", - "mecha" to "Mecha", - "mystery" to "Mystery", - "ngon-tinh" to "Ngôn Tình", - "one-shot" to "One shot", - "psychological" to "Psychological", - "romance" to "Romance", - "school-life" to "School Life", - "sci-fi" to "Sci-fi", - "seinen" to "Seinen", - "shoujo" to "Shoujo", - "shoujo-ai" to "Shoujo Ai", - "shounen" to "Shounen", - "shounen-ai" to "Shounen Ai", - "slice-of-life" to "Slice of Life", - "smut" to "Smut", - "soft-yaoi" to "Soft Yaoi", - "soft-yuri" to "Soft Yuri", - "sports" to "Sports", - "supernatural" to "Supernatural", - "thieu-nhi" to "Thiếu Nhi", - "tragedy" to "Tragedy", - "trinh-tham" to "Trinh Thám", - "truyen-scan" to "Truyện scan", - "truyen-mau" to "Truyện Màu", - "webtoon" to "Webtoon", - "xuyen-khong" to "Xuyên Không", - ) + protected open fun getStatusList(): List> = + listOf( + Pair(null, intl["STATUS_ALL"]), + Pair("1", intl["STATUS_ONGOING"]), + Pair("2", intl["STATUS_COMPLETED"]), + ) + + protected var genreList: List> = emptyList() + + private val scope = CoroutineScope(Dispatchers.IO) + + protected fun launchIO(block: () -> Unit) = scope.launch { block() } + + private var fetchGenresAttempts: Int = 0 + + protected fun fetchGenres() { + if (fetchGenresAttempts < 3 && genreList.isEmpty()) { + try { + genreList = + client.newCall(genresRequest()).execute() + .asJsoup() + .let(::parseGenres) + } catch (_: Exception) { + } finally { + fetchGenresAttempts++ + } + } + } + + protected open fun genresRequest() = GET("$baseUrl/$searchPath", headers) + + protected open val genresSelector = ".genres ul.nav li:not(.active) a" + + protected open val genresUrlDelimiter = "/" + + protected open fun parseGenres(document: Document): List> { + val items = document.select(genresSelector) + return buildList(items.size + 1) { + add(Pair(null, intl["STATUS_ALL"])) + items.mapTo(this) { + Pair( + it.attr("href") + .removeSuffix("/") + .substringAfterLast(genresUrlDelimiter), + it.text(), + ) + } + } + } override fun getFilterList(): FilterList { + launchIO { fetchGenres() } return FilterList( - StatusFilter(getStatusList()), - GenreFilter(getGenreList()), + StatusFilter(intl["STATUS"], getStatusList()), + if (genreList.isEmpty()) { + Filter.Header(intl["GENRES_RESET"]) + } else { + GenreFilter(intl["GENRE"], genreList) + }, ) } - protected open class UriPartFilter(displayName: String, val vals: Array>) : - Filter.Select(displayName, vals.map { it.second }.toTypedArray()) { - fun toUriPart() = vals[state].first + protected open class UriPartFilter(displayName: String, private val pairs: List>) : + Filter.Select(displayName, pairs.map { it.second }.toTypedArray()) { + fun toUriPart() = pairs[state].first } } diff --git a/src/en/xoxocomics/src/eu/kanade/tachiyomi/extension/en/xoxocomics/XoxoComics.kt b/src/en/xoxocomics/src/eu/kanade/tachiyomi/extension/en/xoxocomics/XoxoComics.kt index dce0050fc..d193fa479 100644 --- a/src/en/xoxocomics/src/eu/kanade/tachiyomi/extension/en/xoxocomics/XoxoComics.kt +++ b/src/en/xoxocomics/src/eu/kanade/tachiyomi/extension/en/xoxocomics/XoxoComics.kt @@ -15,7 +15,13 @@ import org.jsoup.nodes.Element import java.text.SimpleDateFormat import java.util.Locale -class XoxoComics : WPComics("XOXO Comics", "https://xoxocomic.com", "en", SimpleDateFormat("MM/dd/yyyy", Locale.US), null) { +class XoxoComics : WPComics( + "XOXO Comics", + "https://xoxocomic.com", + "en", + dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US), + gmtOffset = null, +) { override val searchPath = "search-comic" override val popularPath = "hot-comic" override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/comic-update?page=$page", headers) @@ -84,72 +90,20 @@ class XoxoComics : WPComics("XOXO Comics", "https://xoxocomic.com", "en", Simple override fun pageListRequest(chapter: SChapter): Request = GET(baseUrl + "${chapter.url}/all") - override fun getStatusList(): Array> = arrayOf( - Pair(null, "All"), - Pair("ongoing", "Ongoing"), - Pair("completed", "Completed"), - ) - override fun getGenreList(): Array> = arrayOf( - null to "All", - "marvel-comic" to "Marvel", - "dc-comics-comic" to "DC Comics", - "dark-horse-comic" to "Dark Horse", - "action-comic" to "Action", - "adventure-comic" to "Adventure", - "anthology-comic" to "Anthology", - "anthropomorphic-comic" to "Anthropomorphic", - "biography-comic" to "Biography", - "children-comic" to "Children", - "comedy-comic" to "Comedy", - "crime-comic" to "Crime", - "drama-comic" to "Drama", - "family-comic" to "Family", - "fantasy-comic" to "Fantasy", - "fighting-comic" to "Fighting", - "graphic-novels-comic" to "Graphic Novels", - "historical-comic" to "Historical", - "horror-comic" to "Horror", - "leading-ladies-comic" to "Leading Ladies", - "lgbtq-comic" to "LGBTQ", - "literature-comic" to "Literature", - "manga-comic" to "Manga", - "martial-arts-comic" to "Martial Arts", - "military-comic" to "Military", - "mini-series-comic" to "Mini-Series", - "movies-tv-comic" to "Movies & TV", - "music-comic" to "Music", - "mystery-comic" to "Mystery", - "mythology-comic" to "Mythology", - "personal-comic" to "Personal", - "political-comic" to "Political", - "post-apocalyptic-comic" to "Post-Apocalyptic", - "psychological-comic" to "Psychological", - "pulp-comic" to "Pulp", - "religious-comic" to "Religious", - "robots-comic" to "Robots", - "romance-comic" to "Romance", - "school-life-comic" to "School Life", - "sci-fi-comic" to "Sci-Fi", - "slice-of-life-comic" to "Slice of Life", - "sport-comic" to "Sport", - "spy-comic" to "Spy", - "superhero-comic" to "Superhero", - "supernatural-comic" to "Supernatural", - "suspense-comic" to "Suspense", - "teen-comic" to "Teen", - "thriller-comic" to "Thriller", - "vampires-comic" to "Vampires", - "video-games-comic" to "Video Games", - "war-comic" to "War", - "western-comic" to "Western", - "zombies-comic" to "Zombies", - ) + override fun genresRequest() = GET("$baseUrl/comic-list", headers) + + override val genresSelector = ".genres h2:contains(Genres) + ul.nav li a" override fun getFilterList(): FilterList { + launchIO { fetchGenres() } return FilterList( Filter.Header("Search query won't use Genre/Status filter"), - StatusFilter(getStatusList()), - GenreFilter(getGenreList()), + StatusFilter("Status", getStatusList()), + if (genreList.isEmpty()) { + Filter.Header("Tap 'Reset' to load genres") + } else { + GenreFilter("Genre", genreList) + }, ) } } diff --git a/src/ja/jmanga/src/eu/kanade/tachiyomi/ja/jmanga/JManga.kt b/src/ja/jmanga/src/eu/kanade/tachiyomi/extension/ja/jmanga/JManga.kt similarity index 75% rename from src/ja/jmanga/src/eu/kanade/tachiyomi/ja/jmanga/JManga.kt rename to src/ja/jmanga/src/eu/kanade/tachiyomi/extension/ja/jmanga/JManga.kt index 592f7012e..31eeb15d7 100644 --- a/src/ja/jmanga/src/eu/kanade/tachiyomi/ja/jmanga/JManga.kt +++ b/src/ja/jmanga/src/eu/kanade/tachiyomi/extension/ja/jmanga/JManga.kt @@ -13,27 +13,36 @@ import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale -class JManga : WPComics("JManga", "https://jmanga.vip", "ja", SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'", Locale.JAPANESE), null) { +class JManga : WPComics( + "JManga", + "https://jmanga.vip", + "ja", + dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'", Locale.JAPANESE), + gmtOffset = null, +) { override fun popularMangaSelector() = "div.items article.item" - override fun popularMangaNextPageSelector() = "li:nth-last-child(2) a.page-link" + + override fun popularMangaNextPageSelector() = "li.active + li.page-item a.page-link" + override fun mangaDetailsParse(document: Document): SManga { return SManga.create().apply { document.select("article#item-detail").let { info -> author = info.select("li.author p.col-xs-8").text() - status = when { - info.select("li.status p.col-xs-8").text().contains("連載中", true) -> SManga.ONGOING - info.select("li.status p.col-xs-8").text().contains("完結済み", true) -> SManga.COMPLETED - else -> SManga.UNKNOWN - } + status = info.select("li.status p.col-xs-8").text().toStatus() genre = info.select("li.kind p.col-xs-8 a").joinToString { it.text() } - description = info.select("div.detail-content").text() + val otherName = info.select("h2.other-name").text() + description = info.select("div.detail-content").text() + + if (otherName.isNotBlank()) "\n\n ${intl["OTHER_NAME"]}: $otherName" else "" thumbnail_url = imageOrNull(info[0].selectFirst("div.col-image img")!!) } } } + + override val searchPath = "search/manga" + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val filterList = filters.let { if (it.isEmpty()) getFilterList() else it } - val url = "$baseUrl/search/manga".toHttpUrl().newBuilder() + val url = "$baseUrl/$searchPath".toHttpUrl().newBuilder() filterList.forEach { filter -> when (filter) { @@ -51,6 +60,7 @@ class JManga : WPComics("JManga", "https://jmanga.vip", "ja", SimpleDateFormat(" return GET(url.build(), headers) } + override fun chapterFromElement(element: Element): SChapter { val minuteWords = listOf("minute", "分") val hourWords = listOf("hour", "時間") @@ -111,28 +121,15 @@ class JManga : WPComics("JManga", "https://jmanga.vip", "ja", SimpleDateFormat(" } } } - override fun getStatusList(): Array> { - return arrayOf( + + override fun getStatusList(): List> = + listOf( Pair("-1", "全て"), Pair("0", "完結済み"), Pair("1", "連載中"), ) - } - override fun getGenreList(): Array> { - return arrayOf( - null to "全てのジャンル", - "TL" to "TL", - "BL" to "BL", - " ファンタジー " to " ファンタジー ", - "恋愛" to "恋愛", - "ドラマ" to "ドラマ", - "アクション" to "アクション", - "ホラー・ミステリー" to "ホラー・ミステリー", - "裏社会・アングラ" to "裏社会・アングラ", - "スポーツ" to "スポーツ", - "グルメ" to "グルメ", - "日常" to "日常", - "SF" to "SF", - ) - } + + override val genresSelector = ".genres ul.nav li:not(.active) a" + + override val genresUrlDelimiter = "=" } diff --git a/src/vi/nettruyen/src/eu/kanade/tachiyomi/extension/vi/nettruyen/NetTruyen.kt b/src/vi/nettruyen/src/eu/kanade/tachiyomi/extension/vi/nettruyen/NetTruyen.kt index 0aaa4cbee..90473e491 100644 --- a/src/vi/nettruyen/src/eu/kanade/tachiyomi/extension/vi/nettruyen/NetTruyen.kt +++ b/src/vi/nettruyen/src/eu/kanade/tachiyomi/extension/vi/nettruyen/NetTruyen.kt @@ -6,9 +6,13 @@ import okhttp3.Response import java.text.SimpleDateFormat import java.util.Locale -class NetTruyen : WPComics("NetTruyen", "https://www.nettruyenff.com", "vi", SimpleDateFormat("dd/MM/yy", Locale.getDefault()), null) { - override fun String.replaceSearchPath() = replace("/$searchPath?status=2&", "/truyen-full?") - +class NetTruyen : WPComics( + "NetTruyen", + "https://www.nettruyenff.com", + "vi", + dateFormat = SimpleDateFormat("dd/MM/yy", Locale.getDefault()), + gmtOffset = null, +) { /** * NetTruyen/NhatTruyen redirect back to catalog page if searching query is not found. * That makes both sites always return un-relevant results when searching should return empty. @@ -19,62 +23,4 @@ class NetTruyen : WPComics("NetTruyen", "https://www.nettruyenff.com", "vi", Sim } return super.searchMangaParse(response) } - - override fun getGenreList(): Array> = arrayOf( - null to "Tất cả", - "action-95" to "Action", - "truong-thanh" to "Adult", - "adventure" to "Adventure", - "anime" to "Anime", - "chuyen-sinh-2131" to "Chuyển Sinh", - "comedy-99" to "Comedy", - "comic" to "Comic", - "cooking-101" to "Cooking", - "co-dai-207" to "Cổ Đại", - "doujinshi" to "Doujinshi", - "drama-103" to "Drama", - "dam-my" to "Đam Mỹ", - "ecchi-104" to "Ecchi", - "fantasy-1050" to "Fantasy", - "gender-bender-106" to "Gender Bender", - "harem-107" to "Harem", - "historical" to "Historical", - "horror" to "Horror", - "josei" to "Josei", - "live-action" to "Live action", - "manga-112" to "Manga", - "manhua" to "Manhua", - "manhwa-11400" to "Manhwa", - "martial-arts" to "Martial Arts", - "mature" to "Mature", - "mecha-117" to "Mecha", - "mystery" to "Mystery", - "ngon-tinh" to "Ngôn Tình", - "one-shot" to "One shot", - "psychological" to "Psychological", - "romance-121" to "Romance", - "school-life" to "School Life", - "sci-fi" to "Sci-fi", - "seinen" to "Seinen", - "shoujo" to "Shoujo", - "shoujo-ai-126" to "Shoujo Ai", - "shounen-127" to "Shounen", - "shounen-ai" to "Shounen Ai", - "slice-of-life" to "Slice of Life", - "smut" to "Smut", - "soft-yaoi" to "Soft Yaoi", - "soft-yuri" to "Soft Yuri", - "sports" to "Sports", - "supernatural" to "Supernatural", - "tap-chi-truyen-tranh" to "Tạp chí truyện tranh", - "thieu-nhi" to "Thiếu Nhi", - "tragedy-136" to "Tragedy", - "trinh-tham" to "Trinh Thám", - "truyen-scan" to "Truyện scan", - "truyen-mau-214" to "Truyện Màu", - "viet-nam" to "Việt Nam", - "webtoon-140" to "Webtoon", - "xuyen-khong-205" to "Xuyên Không", - "16" to "16+", - ) } diff --git a/src/vi/nettruyenco/build.gradle b/src/vi/nettruyenco/build.gradle new file mode 100644 index 000000000..a1407d941 --- /dev/null +++ b/src/vi/nettruyenco/build.gradle @@ -0,0 +1,9 @@ +ext { + extName = 'NetTruyenCO (unoriginal)' + extClass = '.NetTruyenCO' + themePkg = 'wpcomics' + baseUrl = 'https://nettruyenco.vn' + overrideVersionCode = 0 +} + +apply from: "$rootDir/common.gradle" diff --git a/src/vi/nettruyenco/res/mipmap-hdpi/ic_launcher.png b/src/vi/nettruyenco/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c4921b8621f2b3b43d48e6afc283f86facafe502 GIT binary patch literal 3194 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 literal 0 HcmV?d00001 diff --git a/src/vi/nettruyenco/res/mipmap-mdpi/ic_launcher.png b/src/vi/nettruyenco/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..eabad57a12f8a905f60e0138556e1275f2f8ae92 GIT binary patch literal 1923 zcmV-}2YmR6P)J%3`n6q6;Z@T5nrSaO0XhP zDB22w4=wm$+Xr6-X;Xx@t1T^<*0f2QHoKc_c4vOY0a%IJngIKM0B8a>82|$VhlaIeDa}OU&5DD= zN%Dj^0Bn4G+!`AjJ7${Zn*cgj!uC3hU8q*8KTb?c96fU6NGZI28~~$SE+5b5^JD8E zOnXampt4w*uq^8^fV#g(j1vwrYprrGLfraKU#<~H_ zB{Sga#s$#qX{P;F0j^}6w_gN+&p;!5r2^nQC9iXUv5+biz>)c(&>5MlnB=M%a2yBD z(iFJe2m}$6XB=8?3p70!0pi%pa2BT^L8z)A_hY&NE%z8SjnYr_@d1#hdXvLem&gEZ zTCdkp{r!39^}C_G!r>C*uFAH(i_E}#&~@DhLEx9>F9VaWDRUJFoWnMHk$d(x7={sL zk=70SKvO4H6~F=8u~Ds7VgIoYhC=}4<0(S{0Nnx`ISte56WS#3wr!(4^CvQw4*-mN zSfv^{DA(5YZs^aPN6yR%@R6jY0`N>PE{sN;m;@jVRw@chixl{vk0oAq5z}~a4EK2|n`$M`3xp^QFK)GB7F78K0q={tV zg@jrj*nJvipyTXJF_K*?pm zaAcYY38MIg>&-b}$Y0&uWl zZffLG02B&^=1#2GU~49%Fu=))MHuzy4{6@!26WT{VbvO~;1Ogj&dFpi~B*Bmj2;0{U_=U`Bfm-S+vQQ?m?eyM9J(aT@t+ z?&C^W)xYvU*Ay8jhA_*4L7t?Lz3H@twt z&BKY&D-nQO=wyX&U0eVF=u-|hf|$G&;4To7C19d>UkfX)1O82fcGZVgxW2q zqYNkj0@W$U{cYo@nZxM3{x(d0E5Jfs-vXn4JH8eYd4No)i4Uv^07_(h+6|q7$Njs! z{Tr~tE>x#}Lf4$af*`sIFU6y zQm!t zpzE3tym#v$Ow&w1)GIEi=F`-+3dMIi-;#N#O)AnDbrQ1KtT@Qa-j4JiIgfzHHOFW? z&7=7(w^d@=tW7&}QkbytQUj9qaAQi0cQ_pG#0pRIMPo~2v8Lk(ymrHAu;!sMC>sA8 zQ8m0&j#cl4~x$}vW zCr^GlFfj0vVHo*n*^stf3*W1I#@$YOOVsQ2%8eU0eiuPVRr_MGx0C=# z=q~Su(rs?8=4m2e3(HcAgS1XpOO{cR3-Wd7MhDy$8~{Rh$Rb#q`ZM)?2$002ov JPDHLkV1mCHjY|Lk literal 0 HcmV?d00001 diff --git a/src/vi/nettruyenco/res/mipmap-xhdpi/ic_launcher.png b/src/vi/nettruyenco/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cd103ae219e6a6ffae65081737e40885aa04835e GIT binary patch literal 4296 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 FV1g0ZN00yj literal 0 HcmV?d00001 diff --git a/src/vi/nettruyenco/res/mipmap-xxxhdpi/ic_launcher.png b/src/vi/nettruyenco/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbc8104d33c3ef892eb5b24abdb46ccc85258f8 GIT binary patch literal 10588 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 literal 0 HcmV?d00001 diff --git a/src/vi/nettruyenco/src/eu/kanade/tachiyomi/extension/vi/nettruyenco/NetTruyenCO.kt b/src/vi/nettruyenco/src/eu/kanade/tachiyomi/extension/vi/nettruyenco/NetTruyenCO.kt new file mode 100644 index 000000000..57d396724 --- /dev/null +++ b/src/vi/nettruyenco/src/eu/kanade/tachiyomi/extension/vi/nettruyenco/NetTruyenCO.kt @@ -0,0 +1,32 @@ +package eu.kanade.tachiyomi.extension.vi.nettruyenco + +import eu.kanade.tachiyomi.multisrc.wpcomics.WPComics +import eu.kanade.tachiyomi.source.model.SManga +import org.jsoup.nodes.Document +import java.text.SimpleDateFormat +import java.util.Locale + +class NetTruyenCO : WPComics( + "NetTruyenCO (unoriginal)", + "https://nettruyenco.vn", + "vi", + dateFormat = SimpleDateFormat("dd/MM/yy", Locale.getDefault()), + gmtOffset = null, +) { + override val popularPath = "truyen-tranh-hot" + + // Details + override fun mangaDetailsParse(document: Document): SManga { + return SManga.create().apply { + document.select("article#item-detail").let { info -> + author = info.select("li.author p.col-xs-8").text() + status = info.select("li.status p.col-xs-8").text().toStatus() + genre = info.select("li.kind p.col-xs-8 a").joinToString { it.text() } + val otherName = info.select("h2.other-name").text() + description = info.select("div.detail-content div div.nth-child(3)").text() + + if (otherName.isNotBlank()) "\n\n ${intl["OTHER_NAME"]}: $otherName" else "" + thumbnail_url = imageOrNull(info.select("div.col-image img").first()!!) + } + } + } +} diff --git a/src/vi/nettruyenx/build.gradle b/src/vi/nettruyenx/build.gradle new file mode 100644 index 000000000..da410c7b1 --- /dev/null +++ b/src/vi/nettruyenx/build.gradle @@ -0,0 +1,9 @@ +ext { + extName = 'NetTruyenX (unoriginal)' + extClass = '.NetTruyenX' + themePkg = 'wpcomics' + baseUrl = 'https://nettruyenx.com' + overrideVersionCode = 0 +} + +apply from: "$rootDir/common.gradle" diff --git a/src/vi/nettruyenx/res/mipmap-hdpi/ic_launcher.png b/src/vi/nettruyenx/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c4921b8621f2b3b43d48e6afc283f86facafe502 GIT binary patch literal 3194 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 literal 0 HcmV?d00001 diff --git a/src/vi/nettruyenx/res/mipmap-mdpi/ic_launcher.png b/src/vi/nettruyenx/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..eabad57a12f8a905f60e0138556e1275f2f8ae92 GIT binary patch literal 1923 zcmV-}2YmR6P)J%3`n6q6;Z@T5nrSaO0XhP zDB22w4=wm$+Xr6-X;Xx@t1T^<*0f2QHoKc_c4vOY0a%IJngIKM0B8a>82|$VhlaIeDa}OU&5DD= zN%Dj^0Bn4G+!`AjJ7${Zn*cgj!uC3hU8q*8KTb?c96fU6NGZI28~~$SE+5b5^JD8E zOnXampt4w*uq^8^fV#g(j1vwrYprrGLfraKU#<~H_ zB{Sga#s$#qX{P;F0j^}6w_gN+&p;!5r2^nQC9iXUv5+biz>)c(&>5MlnB=M%a2yBD z(iFJe2m}$6XB=8?3p70!0pi%pa2BT^L8z)A_hY&NE%z8SjnYr_@d1#hdXvLem&gEZ zTCdkp{r!39^}C_G!r>C*uFAH(i_E}#&~@DhLEx9>F9VaWDRUJFoWnMHk$d(x7={sL zk=70SKvO4H6~F=8u~Ds7VgIoYhC=}4<0(S{0Nnx`ISte56WS#3wr!(4^CvQw4*-mN zSfv^{DA(5YZs^aPN6yR%@R6jY0`N>PE{sN;m;@jVRw@chixl{vk0oAq5z}~a4EK2|n`$M`3xp^QFK)GB7F78K0q={tV zg@jrj*nJvipyTXJF_K*?pm zaAcYY38MIg>&-b}$Y0&uWl zZffLG02B&^=1#2GU~49%Fu=))MHuzy4{6@!26WT{VbvO~;1Ogj&dFpi~B*Bmj2;0{U_=U`Bfm-S+vQQ?m?eyM9J(aT@t+ z?&C^W)xYvU*Ay8jhA_*4L7t?Lz3H@twt z&BKY&D-nQO=wyX&U0eVF=u-|hf|$G&;4To7C19d>UkfX)1O82fcGZVgxW2q zqYNkj0@W$U{cYo@nZxM3{x(d0E5Jfs-vXn4JH8eYd4No)i4Uv^07_(h+6|q7$Njs! z{Tr~tE>x#}Lf4$af*`sIFU6y zQm!t zpzE3tym#v$Ow&w1)GIEi=F`-+3dMIi-;#N#O)AnDbrQ1KtT@Qa-j4JiIgfzHHOFW? z&7=7(w^d@=tW7&}QkbytQUj9qaAQi0cQ_pG#0pRIMPo~2v8Lk(ymrHAu;!sMC>sA8 zQ8m0&j#cl4~x$}vW zCr^GlFfj0vVHo*n*^stf3*W1I#@$YOOVsQ2%8eU0eiuPVRr_MGx0C=# z=q~Su(rs?8=4m2e3(HcAgS1XpOO{cR3-Wd7MhDy$8~{Rh$Rb#q`ZM)?2$002ov JPDHLkV1mCHjY|Lk literal 0 HcmV?d00001 diff --git a/src/vi/nettruyenx/res/mipmap-xhdpi/ic_launcher.png b/src/vi/nettruyenx/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cd103ae219e6a6ffae65081737e40885aa04835e GIT binary patch literal 4296 zcmV;(5I66MP)1hN9skW<-t|EY_{1hAX`(>Dq^SKun-59zp;eoPkfso#Tq;+aO0A+Cw58!lMI%}w z^^n?1L2W~m5U5g=gH-(x!H1;zR+0h+5}L%NwgDS#u-Ucun5q76=FPsjXVznO*UpI5 znw>ZA`2GIZJ4eEFy(9oiLegwBP&kAg!*4y0;(OjDPS@f0W%fA zDQtHz0;WI$W_p%akANwZB3lxty1bC`Hxdw1rWGmG7238^HK5ez!r`Ve!7QoQ;SHp* zvGhOwi3op(18jBXLcr5U*1q}weYM7$05uyO^xeC6&swu)&7;X=a+M@W3nfX4`zmRg zCQ=k7rzpzF@$vEfd-v}B-MV$_E^A~EA)c3C0!Z4U@4WNQ^~;wpe=`z^+~Aq>3``)) z^6B^9d+*L$Z@u+n00oT*S0wxpKxv{+Jn_VwojZ5F`x*G|l0_tJ+O+A*yLRomsFC36 z8@vdh`y~B|!NI{zO-)T(r>$TUOkQaCZ2ZvB(Dvr$=A8ht8VQb1dKF3cV*qNeT)Fbk z+S=Nieb!+{CrhW(J#}?;UjmQ@karuG^&)^tKY)5!mit3D z1HdH!Mvf08842QWN20st~W-UNhE;~;s2O}II~5c0Pr zz-9==uL*M3fFR(_khGPh0U=0KweeP21cZ%Vr4edVpNb(sQA!%6wWUmwyey{mvB{Qi zTc!^IC_4eX;pT4(L_Ws$ISA%&H^mamEroyL?JHYzGm>A}&&m^t_oD@6(*O|w z0wMRoBdE!pR7FacY*7O=$=A&T7r^50I(2nRAuawR;_Q<#vH$|jcOuLHahsY-rRNqeom@gMIsNYgB z9$N^h`$Z&^Nmd>=dwzUDMG!DPJ`Sa49V5UE1m=(x7OQaoXG(4atZ+SP!B;Gx(DQOZ zwf{su5zsKO#Rmaa^Fy`C#BPGLL?s}RNK_XAB!OH5Y6~B#8lXujH!phBqXvq;z-PLU zS_mxOgLtAw*8+|*nLyG$RRa#9VZc0#>LC4=pN#}K`5h-yG<6!_(hC$#5CK3MfS&b8 z6}SeNBYq!}Z(E*%!gbFg*77xj7BC+n63}-L4QIUw5b7kDAIgg~0E_>ER4V1@_zf|& zz{b=O;NpGk2vB;~qqaakKoR15EzT#iBPpu+vGj55B(>-Zl$tJJ>E8^#z?%Snwx2gK z6TJyo;)4JiOe%%|RRbstEne=?ju3`;IM2d@9f-AlUDpEkq@ol}kU<0dfNw0@q5+X8 zq=?!R_qr;E096A{ntHfCZN6xJIBO!2H4C70??)n$)cXYn0t`ODJMLGrE~fKsg8XQJ z!Gy-fg7RG$clCS#! zzfRbX29%8e@&Wmi`oNmKCb~OZy%)zDVH#S^FW8Q_rUjIQdcrIW?Ry;!XSds-Z-cqD z4wa_?E+Hs)fV?-#!%*e}@+Vxj?0SH2hRG-x#dmfjLAV#C`x^hiT>A6fA(jl z9PB$?R+bc`qYEKvQBe6iVzP3^Ywe`H57>ZIzQ_cJp@ z1h9@^-vQL0+abDbhwSYgbUL;O(&9a=A5eY*+|~tYO|&K8#0I2tW&)g~-WY`#uy&l< zRP$2e?U0uqKrEipL(z%8S5bfNSzfz9;8WtNCx8t_^bi5Zty1XI;imJAsEyM4CcDc> zWd7PMh_v3#5;8~J_gB=P|AmnN1II3XgR&E#ddo?Lp+*AOXq(FtaC@yd8@Us+bB9n9 zp>?j}WlgWdTafR51CkVFjyTu95B2AtQ^QbRwrRM*&i3=)riTU`rzl9&0CSUF%#ott zV(onxO-Im$mwjlFg512vAh)bxexNY$3hD=cRqO}wq8!6sV_nj*n;|WJAv_;2)hpx7 zK7cf!aGatbI|AJNfYxgRaItO;24mkq*YKlAMrg6I#~4v`7RDF74jBn3XJ1DB&~I&Q zzq{$-+7dbeHdb^>J7Pr>Bu>h^I9gso!Qqb7KY-C$t00|w1)YVLeEEX$)*m7}=Uzn4 zzliz^e=u?80lrW|<(eP|TW+TTa?eJja!0+*2R92Qd@jv;80p5vH2-Ow3uWPB-?w zfVQlt1Hm#<$cyLR4>dc3|$LK{^4+kG)@I=UFrk`SYy zau8tA0Lv((dssTw^aDt3tJxS2#rBtn2hiI8AYu{$>kNMJPLQ!CA*}+Wk{EoyMF`caJ{S z&lg>d4E3UI;2}iWX#g(1z+t-4(MM?D(|uP0L?UfSEp1ZXI#yxt0|Io!m=n%^U=Na6 zFZA+@=+OoUrF*Pta)V(@1u#U@Me~0KV#hdfChuoc;~ka{K*B zxD{=a4>8su9a}O@qM+=N(w(qC07XJ{iDqbI@ME+MJc6j?;0r7z+nF8J>6));p#d_5 zp|%A0F-ZzWTel+FahJYEpHI5;AA2VaeXmQI&2RMY@3;DxxJ zh9X+GA=&Xw!zKyC;;T#s!-N09{BsXz1O#!o_L9%-Qh5moX-ZP{0d6M99I_Y%d9-aC zQk{1(C(M_fa5KcTAUlCfI)m&-&!VMp(4Q}`ak$0@)db}wK&?>-PI!aS3EQsB5~S9! zR1h!|z_$qTjd*MURwjdy^B*hqLV)k{g6!7} z2GaoA1t6>Yw2CX^HX@bR#)9~k7_-%J(TdA$+fduNLN`I;CONAXoI>aMhwb|u0l}v# zUWqS7wCcu!hyX=fnZ`Ehtw$=yd&1rl&mAD=XtZrBQk{1joG|TXrwt!wEl8)+D17u& zG|7kUOuFYJj@f}!Cjr_{MSYJLEzYIEIBu%MZ$pb6I%0MNXd5KhG^HXVpHnyGQAj#G z@Bun5d=C*tHM?d)tzOzWDkBpV?cT%4uezm)JWekhU#Aja^l$EtQn)+Tz6Ghydl&%v zW@%wts+}(=oO%j#<##6qK8u19w;-kw5O|wvM4AsJ=#gc92ji?_r2k^xsD19tFNcRMD4=f?qOrcTpDUKcN|8qOF}-NT*p>&Ktv+Ac?t@IctDe7d#I@s$jjj12Q5=1fty0{a40|9Q-wUrM*yz` zJ8p^o@eOrOt0L@H4QsYG$T4Li;GSiANP<{y5a4;ZT{a(J*RCKo*!+B;#tRQmrcARY z_|;mIFPTCOaB)7RRCYQ(Q&Ac)9Rc=g(`N*DAvDGJ!zQ3Ho6UX_=c}V^4ZUgq*9DLSn4!+&g)U;5?eg*^Vr94AJLnoV?oA1yFnA8g#=)_X?28~09 z4n29>ZMQw{Rd}HL)kdPv`W`-f__^C}zx|im8#Ib9@+o1H9uYu`GV7NuTh@8tz=7Ag zy1Kdofjq+!_xASou3Wit#gQXN=#3+^x0dEeOMZt8aYl=AQUI=5y?XVc9XobB-__N1 zEnlNE!|-)%E{#9+_V)gF^XAR#_wCz9C)LvHOEQyvixTURYj0AjBU7|!(W2HZTedvV z-QE4w#>U14k|e3CrK;ibX+nZDMNyRe$jHd2M~@!;$1~47^WupUC(dc6hxSpC`Eh-v zq1Rv>)rHc~+%Ub)sulndK_BuBWS-QMt*_?gaQc+*DoplyV?hKknHh4n1Uh}_{bAhp zyDo(CLx4yE0Zzcvdu8Zvl79YHRp0HOMhOXAB7jy06A83$iin`U`Am>&bDasWN(ueK zUh1iRMDYC*IgPMqO;M-XiX;%|{3V`VO8{90L4l+6{F$pO`Qe%kZ$a>1o;b(K3GoGf zDFlcW4@RE<26=;1c`1AYZmxPT5G$|Ym0Kg90ylXAd=^x>NQGFl60n#&0U_3ZCT3N= q1e73cp%ENn+0{!xXlRxyE9c&vr^ygK7G!2zjMyL=ib)P{M1eZ8UVe*%ZE9)!dq5y8i_f3p9WFV>?vsO z-#I*hnjo0_Rt_VfkA1@fD2#B;bLW-@Dj;Wi*&}v#~wyK8)W)DF1c)Eptk2-YH#sg3tl(Nuq7v%XH4?sbluGzNc8fXHj z)+%m9#ta~H6F{{F&^*6>Edb=aW&kwLb6wAc$E$Q^&Q^x!``bJNmK7B)1SJ&ravDk+JB-Nj<*|Lrr$j!{m{A_4w=$k87t~?B& z0DxGDF;ies!T^YYCpI`Z_`54stawz@w64GsG*76z26SB?I&-aaPIT3(RqgW&#_P- zcNX;a3_Qd>6!R><>#n>0Je5k_I1B1)-ZG>Hvf1oUo_zAj&urVa?X18=%2%!wKrsM` zqeqY4a^;m*epl19gz_C(G8y#Ffo{-jtfB#3*Yih?9J%xAtFQh60Ae9NuvWQ5U;-qw zQ&ttHK>5s>Gv8jmeEIJw-Kp7VPHN!n*|SftSh3=60NF}dCMGax&SC`F;MjZ6haa61PXP3j4}Xe76U0b zu}WQ7?EqAF^>H^`px~Wf3^bbnTA=r?FMu?}p<{kBP!mA&AO>2XMx4#Zt}g?b^I%N| znoWyW`QGyuK)SAw22`L-O;gAnst{0DOMWGJE6{^ITQQ%~_==S-o3l|ULa(NADwaKf z@vABCyaJG@{8}4BG(=d#@bXG!56NiNmY2tD!@Dr1aQgK#L{MP40fYU&+pjMvSl(5) zri}P!pmW{i^pf9CR%3Ep(~K|s+gDD728{tAmmVmBr*Pp#=##G*bp*^fh7NSedPP#C z5huxF8h$yHxt`8wX|ykbPSsMY5n1|i+bBT|Bg$SJ{a+Nve`CpHg2-q?_wqEPDXSgv z(J3rWBfwZ^Yps_ddeL=N2hr>RNJE=m3^y0X8=zP$8p@t}^+Cjkslw7(Gfw7bMqrBO zLmcC8&R8t|wlQXxws3)YVmYFhKY>W=Wr#!~fecdyo?;Q%z5|H9^H;*qwhTE8^g@!r z_XYa_O30dCd@IuL-fzgsYD$*L1s!x&ny$ zF!gq7YBh2K$iZoV76aaOH=-B+AtKROAP|YNll+sf?M3Rs-zorzHF3)_OV7#|bYUGa8NBOca)d8Vf)cP4hjN zluutWMCP{-plym4O`1_lV7Fz(8%_^kTA@6vH-#y#xet*QzmHhVWFh*B0V{879{dbE zGcz-odi?-e$NpY{fdqiq4{0)}GaxEC^NI9kq~Cqe01x}JpxR)e3NyXN0ua-W6<{*v zAp_7i_uAKN0P#g}o^DG3hZzrfX;)R&&*s&&Er7B0Z8n@tQV6J2te)GpDGx^J&q{3Ejf!h zb!l3v*!fXtJ*IIO3-L@OG7yW~7<)1RwNE^wAiEc!1$MGoMaOvRMkFuak9a(;B&RBv z!U0HOwAK=YUlZm&7p6d?ZZ3crDEr!j=*az>gT;NbEfu#Vm5Vc0Y%z+L>_w#WnzG)_ z#~5P#!<^1yjQ_5Cf3m!d`y}Hh?S^;xnmmZi`gvH=d+n z=8C5gOJ9OmycAH2gLMR?U<{UzX4+lNFv zfq24X$XNpr*SVFMj@y|dR7Ikj3p0ag6F~KJTc!dy14lbixMVk?i?5YtWJYTx05OOQ z;8DrEBuq&`bbLb<7)Z!S=a&oP0aTT2ONDvFHX4dcZUfeS5wS#@l!ep)R0@FId#Ml` z*$vAUioCI7XwZA?LbG~oXU`Wf(;T@0v_|O#pp%QH$I7I+RVuK z2}~xx7z4>&Sf#G3Tz1OB;&V0z@*hyF**Fj%1LgW2MrZz~mJ2hD=~j~AEwWFrY|yw{ zW@OHR6qkGoSodYb;t89D_+YvWK*tWEV}g%?D#*Ot7>LG!<}`r(BcZwgC~q;4V?K-3 zjR|vGp#UVtJ(B0w5kq0)cM)svwONRz^!!u?4L=y;Km!M{$Pq-lf!NJ$dAqz38c3{0 z3?w}3Jd1&Lpi^*R^>SNIy_z*SdfO)Gz28DCk+#bySUY|W&jio`ESmgB>#*N&fftD6 z=Z?};M(^Hv5Cer=7v`CT_3uDO_Hb?7mdHAeY>2Cj<(3oau}&1$??&vR-zf{G%K@|x zizffcC3uruzl=h?7)wJFK&)?C1`VXl4W8g7q%CRCcozs49Keu&6B)Ys|g?l02x_W?l4yyWfjBws@KnD_!~$D9^c77Oo_alx;Rwh4VpqXR4(LVWH>2&1*LunZzCx!{Ek;Dy1Y$(M* zRhvw0w3VseBhd^%euS>bCfChG=J!7sYDgRWK zdGW4oIB^4#VF4tJLeur_|$5AmJFy8TVTZ*+u zMl7`UAw-s3Z?F(!AXXDy=>HnpGC$@D<0VD%fif>A78f>vc#rOth4t@3NA^eRfv9Us z1&}H2{vl*!i*JIy?g2#N?FI``XJ8}gh5qemoBByv?BeZ36$TrvD~=>LBhkBifijQ+ zfQ*8&K4KslfD`~>-^0Cau8>By*ny7Npzkj1GB>G5(wOOe(pb&P0L0u_q3^3`%X*Ze zl!@i{OwQv?09gk1sz}WD?ZTq$^Q@%@6Db6$d~##`ozYj~0yg1d{E$|J`3Jm`7KQc? zqS*6IL?WgeV=fE>UqS2C&&Xj!%P z*~l8a5%~<(^isk^E$pAD=S-;^H{g zM^$=y%_mchwN6+mN4Bc)!lKdDFy}Oz*ke3TH0F+}c%uSWdK-M(9#8o+ywvs`!(e*gJ z`R`@lfCcb6;Nv! zPJRr@1qmQwEJy|*Vjp8^^Xt3Nk&}(3@b*0{;!j={gcx+oht zR=K9L%}o1;kYD{Eidw7T#^T5CK}+sPNl@t}z3$^JLm2~6(ZA+g%kRh|6j{9f1Bo@N zNHmuR??PwR3qUG{mV<}>Hy67U=awHb8sx{{z|!G8Xpf!_#6I@bwIs4@4q~SDDkG3i zz42M3@~?OhTIJv&<{D1kv_Kh1FpsAT>)Vaa?7wnuMKVw1IWQ&Md`Tl@`xdMQ!2OCM=)C{7HaMfib+RVcCpfkrNBvq7KMsJ=_n~GnKiPa?l zO;6|1^7alaF8)tI!gzXwxmA2SNWSY7j()2Fa;@{bVJ=*`y##N|eJxK4ha zD}wRPJCVx#9P#{d?p*Jz%KKizJeo$6sW&6hyK|1G@$QDGsS9H>+PS_x=wJX+=(}R| zp!X>{GVx8wt$)M!h%Q6f=vK12jS_$_M$Uu0Z4QibUwdG%+u7|U?XSH$;1ax?0&>3$KV$TW;0`m zoH~TA0?np7*`>5^q1zsY4hJ0!fKK0T&7)bJLr6eJQjOrk<|+dzm0tK8ax!@>ikF&O z*|FJlHW@m3_C+io-H$lNT(lqnOWMkhef*9~*vC4h2_O{)>feh_(S@;vVJf=!3W5Pl zCa(i}_S?nrERZHQmYEz!+o}7|TKGQ+G-e4r9G*s!A4hWIPJ4^Hg;kNr=O!L5EZ4se z9kjAR*;VYVB4FT zAcgp2yyYgudUiOr$raBCqy_6Xvb^bV*!A>zkA9>?uNr8W!Og>fCqdp3R_ zI;Y&02m2XBW=-cgV=Xr$-t(|yw|7eCjlF(~1x)A7x}@>Z^XMGB7cGTj!bMeO@M{+g zJS4<$Y70`$Alhd#wT}moHE?IVY|hUhEMSn7e{c{OOMM*i-iHv6nXe0At4zx_O33GN z>W!CiMed7S@x7`Held0VJeP5X>^l|iBZVXTZ&p}dMbA=>zW$6%o3El7Ed1NpxiQL3=|S0vVGe;~tX z27vswNC^%ccE(ux6NqOu>ca1`eRZ-X_kkQ!5zGaS0ux z>D!R#zTdG;9KY{j*~Xc<9Hs`J$FlK5h#9Yv5I-t11P_>HPu>JjRRN@6I0ti??Z?u$ zBi{X02Y~p}4t~=p77LAyyn`jD??I|~vVx4PI^dxgY$QeFK+UNP&yrSSBs#-fSovU@ zlmMhvi!9S|Zt*&n{v_hvUnv6+zg-JIH)d?Rm(Sy!V~5c@vxB?60)Rugt#a2koZ5<1 zH3kxSwa)qdfn=obIho1>h@GrpEY{R!9qt_Vr$!9q4IqB|UK$U|=kmx;=aHElL+tpM z&=sX+J1X+{v@s3`yG~UAB!Gvc2p>fIg&OAZ>IKop{<-EXIP2}Kq_vcVsVLV?aF=s+ zV63$qKy0rcb~XM*x(0|W78*PA-+0&Pc0|Eevj)7sVzyPfs`ELj0-%~?VYLE~1nq_n zJs4=}^}Se}m89{aH{<7wSo&Jj0kcxI)VYNWZnX7wB!n1<0f-ftm9dZopzP!jq9=A@ z30@Z1gA>lnZOPctRrj)i#45Qk;hv4hKoS74iOg&t6_f=T2Xbc{nQhzv#J|Eo1Q25( znj^~&{tK2(Jb{>ug?R9YH@C%9VODvYg~vcHy~}HDd@ulUie|l=e%-eHp)AbBg^4ee zlet%NWuwDqvEk=Ebz&&U`tiQw^Ff+Sa5RRP42X8jmQLlipVsKH3Ilz|*>OUSCE zm3#g%$!O~*r7leNMnWD$#y-%ND?5Mu`{>T^b8aLh%>>IcDeq{(o1Ll(AWo3_0f=^1 zLTv!#SQjRpjSuFkoQ5i$JDR>7i5}-bB0m~!=Y6_vFFYjKXn>IcXkvUAEhp~9;s`Bc zuHHD0UntrHkQLmr4aB7zjT`I2_;L;v1Nk!#YcZC-&6vs%U)shPi2ahA)r&fcdeH!n z)e-8p|@@K~%Ta)JvvL!o)n{xg+UY4FJ(ZFkh0p;9vXAT!gXBZ~yM{H{SSmQr`x) zEymNIK%%!)k;vSD2p|R?`jus5BHi*LL+cj_ochmITNrL==9?LTP7BSmZPL8oh@IHk1o*b)DLFBX6?Cs~8J8UTa{DP@jC`*T_%44ZTo+t``8k zXw(*I#<|Ws-r?Mgb#IpUO9GAIX_Ka#~EN|6t zSr`M5Xc%%4hhX)Ufo7@aS$N2!5+OeL=K*BN?M*oa`{9*`RPBu@*%gJhp zn7m;D#N3h1p3$h$0Yv%PaT$9C0dB)G5Q{JPK$RJTetmniPbDSalNng(mwkEm@rofB zfDCyJw`!*LqO3ey1u>wkE$a+SMqX~-?fQXVMUI995bwsA;(5@BuFH>s+>9W)1Ln?{ zYvYf5DVqle?|K=?nY=vMRE+1=h6fOnm4QigyJ6f{{asiUMxvS07%0RzgLfIcI|u?I zUa5R9l__7v05Vw_kVJ5Wbz!_bBG6@SOGSPMP=yeqVHrpShr?A+*2R^6gze3Inl945 zssVTq$r!X+^77BhGZAyMe9WUNyQxg>&C%RV3;=1EfL@Ovx{3@WG7)c-Y8pfA(R{oU z$N&PMML<KiTV5A9xbf= z0zg9oNX5TX#rC2Bs|k*ZG1%4hy)<2Mr7}; z@>NIBAe!3801)G}q*AH&-Me?+aK{~Y>|ecl^m@1yjl1(dJX6cqKTQ*&F)m59jy1K4RrBW+2O=COu%)TZUpaiD20;=7y}*lY+S<3XTaR1Qr4f`%>J)FXd5RrC9+3@t|X_j6g(yA>a@r z(U$>;K*U(9dMasNNksz;2qJ(8Fa#n79G12#XI}ixgSs$wE<2Ag3|q0vz(oIMU)HwL zd#NbPzs+nIdKl=!J3}aLt7>tehUk0vl0BTgj&kecR`f3Ie`eoxh z;&_igcqH9441jod#@rMOu=#(h-=msJujaM<`E4$@U?AebB>rE;@~a!y`xg9lXmU|3SvH3Ih$Pg8hF*tW$XmXcq$pz$!v<;Fh`JDDZUSf? z7;!cqp$VYb)P5!Ro?{Hx1W+YLY@TClpb4NR7(!{_{{eKxircTjj->zq002ovPDHLk FV1g0ZN00yj literal 0 HcmV?d00001 diff --git a/src/vi/nettruyenx/res/mipmap-xxxhdpi/ic_launcher.png b/src/vi/nettruyenx/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbc8104d33c3ef892eb5b24abdb46ccc85258f8 GIT binary patch literal 10588 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 literal 0 HcmV?d00001 diff --git a/src/vi/nettruyenx/src/eu/kanade/tachiyomi/extension/vi/nettruyenx/NetTruyenX.kt b/src/vi/nettruyenx/src/eu/kanade/tachiyomi/extension/vi/nettruyenx/NetTruyenX.kt new file mode 100644 index 000000000..477c7f9f4 --- /dev/null +++ b/src/vi/nettruyenx/src/eu/kanade/tachiyomi/extension/vi/nettruyenx/NetTruyenX.kt @@ -0,0 +1,32 @@ +package eu.kanade.tachiyomi.extension.vi.nettruyenx + +import eu.kanade.tachiyomi.multisrc.wpcomics.WPComics +import eu.kanade.tachiyomi.source.model.SManga +import org.jsoup.nodes.Document +import java.text.SimpleDateFormat +import java.util.Locale + +class NetTruyenX : WPComics( + "NetTruyenX (unoriginal)", + "https://nettruyenx.com", + "vi", + dateFormat = SimpleDateFormat("dd/MM/yy", Locale.getDefault()), + gmtOffset = null, +) { + override val popularPath = "truyen-tranh-hot" + + // Details + override fun mangaDetailsParse(document: Document): SManga { + return SManga.create().apply { + document.select("article#item-detail").let { info -> + author = info.select("li.author p.col-xs-8").text() + status = info.select("li.status p.col-xs-8").text().toStatus() + genre = info.select("li.kind p.col-xs-8 a").joinToString { it.text() } + val otherName = info.select("h2.other-name").text() + description = info.select("div.detail-content div div:nth-child(4)").text() + + if (otherName.isNotBlank()) "\n\n ${intl["OTHER_NAME"]}: $otherName" else "" + thumbnail_url = imageOrNull(info.select("div.col-image img").first()!!) + } + } + } +} diff --git a/src/vi/nhattruyen/src/eu/kanade/tachiyomi/extension/vi/nhattruyen/NhatTruyen.kt b/src/vi/nhattruyen/src/eu/kanade/tachiyomi/extension/vi/nhattruyen/NhatTruyen.kt index 48499bc5b..089b995c7 100644 --- a/src/vi/nhattruyen/src/eu/kanade/tachiyomi/extension/vi/nhattruyen/NhatTruyen.kt +++ b/src/vi/nhattruyen/src/eu/kanade/tachiyomi/extension/vi/nhattruyen/NhatTruyen.kt @@ -6,7 +6,13 @@ import okhttp3.Response import java.text.SimpleDateFormat import java.util.Locale -class NhatTruyen : WPComics("NhatTruyen", "https://nhattruyenup.com", "vi", SimpleDateFormat("dd/MM/yy", Locale.getDefault()), null) { +class NhatTruyen : WPComics( + "NhatTruyen", + "https://nhattruyenup.com", + "vi", + dateFormat = SimpleDateFormat("dd/MM/yy", Locale.getDefault()), + gmtOffset = null, +) { override val searchPath = "the-loai" /** @@ -19,62 +25,4 @@ class NhatTruyen : WPComics("NhatTruyen", "https://nhattruyenup.com", "vi", Simp } return super.searchMangaParse(response) } - - override fun getGenreList(): Array> = arrayOf( - null to "Tất cả", - "action" to "Action", - "adult" to "Adult", - "adventure" to "Adventure", - "anime" to "Anime", - "chuyen-sinh" to "Chuyển Sinh", - "comedy" to "Comedy", - "comic" to "Comic", - "cooking" to "Cooking", - "co-dai" to "Cổ Đại", - "doujinshi" to "Doujinshi", - "drama" to "Drama", - "dam-my" to "Đam Mỹ", - "ecchi" to "Ecchi", - "fantasy" to "Fantasy", - "gender-bender" to "Gender Bender", - "harem" to "Harem", - "historical" to "Historical", - "horror" to "Horror", - "josei" to "Josei", - "live-action" to "Live action", - "manga-241" to "Manga", - "manhua" to "Manhua", - "manhwa-2431" to "Manhwa", - "martial-arts" to "Martial Arts", - "mature" to "Mature", - "mecha" to "Mecha", - "mystery" to "Mystery", - "ngon-tinh" to "Ngôn Tình", - "one-shot" to "One shot", - "psychological" to "Psychological", - "romance" to "Romance", - "school-life" to "School Life", - "sci-fi" to "Sci-fi", - "seinen" to "Seinen", - "shoujo" to "Shoujo", - "shoujo-ai" to "Shoujo Ai", - "shounen" to "Shounen", - "shounen-ai" to "Shounen Ai", - "slice-of-life" to "Slice of Life", - "smut" to "Smut", - "soft-yaoi" to "Soft Yaoi", - "soft-yuri" to "Soft Yuri", - "sports" to "Sports", - "supernatural" to "Supernatural", - "tap-chi-truyen-tranh" to "Tạp chí truyện tranh", - "thieu-nhi" to "Thiếu Nhi", - "tragedy" to "Tragedy", - "trinh-tham" to "Trinh Thám", - "truyen-scan" to "Truyện scan", - "truyen-mau" to "Truyện Màu", - "viet-nam" to "Việt Nam", - "webtoon" to "Webtoon", - "xuyen-khong" to "Xuyên Không", - "16" to "16+", - ) } diff --git a/src/vi/nhattruyens/build.gradle b/src/vi/nhattruyens/build.gradle new file mode 100644 index 000000000..83a66de5f --- /dev/null +++ b/src/vi/nhattruyens/build.gradle @@ -0,0 +1,9 @@ +ext { + extName = 'NhatTruyenS (unoriginal)' + extClass = '.NhatTruyenS' + themePkg = 'wpcomics' + baseUrl = 'https://nhattruyens.com' + overrideVersionCode = 0 +} + +apply from: "$rootDir/common.gradle" diff --git a/src/vi/nhattruyens/res/mipmap-hdpi/ic_launcher.png b/src/vi/nhattruyens/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c4921b8621f2b3b43d48e6afc283f86facafe502 GIT binary patch literal 3194 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 literal 0 HcmV?d00001 diff --git a/src/vi/nhattruyens/res/mipmap-mdpi/ic_launcher.png b/src/vi/nhattruyens/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..eabad57a12f8a905f60e0138556e1275f2f8ae92 GIT binary patch literal 1923 zcmV-}2YmR6P)J%3`n6q6;Z@T5nrSaO0XhP zDB22w4=wm$+Xr6-X;Xx@t1T^<*0f2QHoKc_c4vOY0a%IJngIKM0B8a>82|$VhlaIeDa}OU&5DD= zN%Dj^0Bn4G+!`AjJ7${Zn*cgj!uC3hU8q*8KTb?c96fU6NGZI28~~$SE+5b5^JD8E zOnXampt4w*uq^8^fV#g(j1vwrYprrGLfraKU#<~H_ zB{Sga#s$#qX{P;F0j^}6w_gN+&p;!5r2^nQC9iXUv5+biz>)c(&>5MlnB=M%a2yBD z(iFJe2m}$6XB=8?3p70!0pi%pa2BT^L8z)A_hY&NE%z8SjnYr_@d1#hdXvLem&gEZ zTCdkp{r!39^}C_G!r>C*uFAH(i_E}#&~@DhLEx9>F9VaWDRUJFoWnMHk$d(x7={sL zk=70SKvO4H6~F=8u~Ds7VgIoYhC=}4<0(S{0Nnx`ISte56WS#3wr!(4^CvQw4*-mN zSfv^{DA(5YZs^aPN6yR%@R6jY0`N>PE{sN;m;@jVRw@chixl{vk0oAq5z}~a4EK2|n`$M`3xp^QFK)GB7F78K0q={tV zg@jrj*nJvipyTXJF_K*?pm zaAcYY38MIg>&-b}$Y0&uWl zZffLG02B&^=1#2GU~49%Fu=))MHuzy4{6@!26WT{VbvO~;1Ogj&dFpi~B*Bmj2;0{U_=U`Bfm-S+vQQ?m?eyM9J(aT@t+ z?&C^W)xYvU*Ay8jhA_*4L7t?Lz3H@twt z&BKY&D-nQO=wyX&U0eVF=u-|hf|$G&;4To7C19d>UkfX)1O82fcGZVgxW2q zqYNkj0@W$U{cYo@nZxM3{x(d0E5Jfs-vXn4JH8eYd4No)i4Uv^07_(h+6|q7$Njs! z{Tr~tE>x#}Lf4$af*`sIFU6y zQm!t zpzE3tym#v$Ow&w1)GIEi=F`-+3dMIi-;#N#O)AnDbrQ1KtT@Qa-j4JiIgfzHHOFW? z&7=7(w^d@=tW7&}QkbytQUj9qaAQi0cQ_pG#0pRIMPo~2v8Lk(ymrHAu;!sMC>sA8 zQ8m0&j#cl4~x$}vW zCr^GlFfj0vVHo*n*^stf3*W1I#@$YOOVsQ2%8eU0eiuPVRr_MGx0C=# z=q~Su(rs?8=4m2e3(HcAgS1XpOO{cR3-Wd7MhDy$8~{Rh$Rb#q`ZM)?2$002ov JPDHLkV1mCHjY|Lk literal 0 HcmV?d00001 diff --git a/src/vi/nhattruyens/res/mipmap-xhdpi/ic_launcher.png b/src/vi/nhattruyens/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cd103ae219e6a6ffae65081737e40885aa04835e GIT binary patch literal 4296 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 FV1g0ZN00yj literal 0 HcmV?d00001 diff --git a/src/vi/nhattruyens/res/mipmap-xxxhdpi/ic_launcher.png b/src/vi/nhattruyens/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbc8104d33c3ef892eb5b24abdb46ccc85258f8 GIT binary patch literal 10588 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 literal 0 HcmV?d00001 diff --git a/src/vi/nhattruyens/src/eu/kanade/tachiyomi/extension/vi/nhattruyens/NhatTruyenS.kt b/src/vi/nhattruyens/src/eu/kanade/tachiyomi/extension/vi/nhattruyens/NhatTruyenS.kt new file mode 100644 index 000000000..744c1b668 --- /dev/null +++ b/src/vi/nhattruyens/src/eu/kanade/tachiyomi/extension/vi/nhattruyens/NhatTruyenS.kt @@ -0,0 +1,54 @@ +package eu.kanade.tachiyomi.extension.vi.nhattruyens + +import eu.kanade.tachiyomi.multisrc.wpcomics.WPComics +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Response +import org.jsoup.nodes.Document +import java.text.SimpleDateFormat +import java.util.Locale + +class NhatTruyenS : WPComics( + "NhatTruyenS (unoriginal)", + "https://nhattruyens.com", + "vi", + dateFormat = SimpleDateFormat("dd/MM/yy", Locale.getDefault()), + gmtOffset = null, +) { + override val popularPath = "truyen-hot" + + /** + * Remove fake-manga ads + */ + override fun searchMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + + val mangas = document.select(searchMangaSelector()) + .filter { element -> element.select("figure > div > a[rel='nofollow']").isNullOrEmpty() } + .map { element -> + searchMangaFromElement(element) + } + + val hasNextPage = searchMangaNextPageSelector().let { selector -> + document.select(selector).first() + } != null + + return MangasPage(mangas, hasNextPage) + } + + // Details + override fun mangaDetailsParse(document: Document): SManga { + return SManga.create().apply { + document.select("article#item-detail").let { info -> + author = info.select("li.author p.col-xs-8").text() + status = info.select("li.status p.col-xs-8").text().toStatus() + genre = info.select("li.kind p.col-xs-8 a").joinToString { it.text() } + val otherName = info.select("h2.other-name").text() + description = info.select("div.detail-content div.about:nth-child(3)").text() + + if (otherName.isNotBlank()) "\n\n ${intl["OTHER_NAME"]}: $otherName" else "" + thumbnail_url = imageOrNull(info.select("div.col-image img").first()!!) + } + } + } +}