From efdaf2f6f5bf8f4b4c4c01bb0987fbac435d7fda Mon Sep 17 00:00:00 2001 From: are-are-are <62763969+dejavui@users.noreply.github.com> Date: Mon, 20 Jan 2025 13:06:12 +0700 Subject: [PATCH] Add GocTruyenTranh (#7205) * Add Goctruyentranh * Fix duplicate title latestUpdates&popularManga * Fix lint & add chapter date upload and add change requests * case insensitive * use selectFirst for chapterFromElement * Use .selectFirst() title & update parseDate * Use Calendar --- src/vi/goctruyentranh/build.gradle | 8 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3827 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1994 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5480 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 10495 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 16120 bytes .../vi/goctruyentranh/GocTruyenTranh.kt | 349 ++++++++++++++++++ .../extension/vi/goctruyentranh/SearchDTO.kt | 22 ++ 8 files changed, 379 insertions(+) create mode 100644 src/vi/goctruyentranh/build.gradle create mode 100644 src/vi/goctruyentranh/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/vi/goctruyentranh/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/vi/goctruyentranh/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/vi/goctruyentranh/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/vi/goctruyentranh/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/vi/goctruyentranh/src/eu/kanade/tachiyomi/extension/vi/goctruyentranh/GocTruyenTranh.kt create mode 100644 src/vi/goctruyentranh/src/eu/kanade/tachiyomi/extension/vi/goctruyentranh/SearchDTO.kt diff --git a/src/vi/goctruyentranh/build.gradle b/src/vi/goctruyentranh/build.gradle new file mode 100644 index 000000000..de2d6c172 --- /dev/null +++ b/src/vi/goctruyentranh/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Goc Truyen Tranh' + extClass = '.GocTruyenTranh' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/vi/goctruyentranh/res/mipmap-hdpi/ic_launcher.png b/src/vi/goctruyentranh/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e7163049fa4acc36979c7c5900c97fedc877f7 GIT binary patch literal 3827 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 literal 0 HcmV?d00001 diff --git a/src/vi/goctruyentranh/res/mipmap-xhdpi/ic_launcher.png b/src/vi/goctruyentranh/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f8bdd4e9d5515de991f397c1b17ca5af794bc9 GIT binary patch literal 5480 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 bf5C>k;e2lmP>FoCvI7b-%F-2*CV~GC2Wf}m literal 0 HcmV?d00001 diff --git a/src/vi/goctruyentranh/src/eu/kanade/tachiyomi/extension/vi/goctruyentranh/GocTruyenTranh.kt b/src/vi/goctruyentranh/src/eu/kanade/tachiyomi/extension/vi/goctruyentranh/GocTruyenTranh.kt new file mode 100644 index 000000000..84c811d25 --- /dev/null +++ b/src/vi/goctruyentranh/src/eu/kanade/tachiyomi/extension/vi/goctruyentranh/GocTruyenTranh.kt @@ -0,0 +1,349 @@ +package eu.kanade.tachiyomi.extension.vi.goctruyentranh + +import android.app.Application +import android.content.SharedPreferences +import android.widget.Toast +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.ConfigurableSource +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 kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.Headers +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale + +class GocTruyenTranh : ParsedHttpSource(), ConfigurableSource { + + override val lang = "vi" + + private val defaultBaseUrl = "https://goctruyentranh.net" + + override val baseUrl by lazy { getPrefBaseUrl() } + + override val name = "GocTruyenTranh" + + override val supportsLatest = true + + private val searchUrl by lazy { "${getPrefBaseUrl()}/baseapi/comics/filterComic" } + + private val dateFormat = SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.US) + + private val json: Json by injectLazy() + + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .rateLimit(1) + .build() + + override fun headersBuilder(): Headers.Builder = super.headersBuilder() + .add("Referer", "$baseUrl/") + + override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/danh-sach/truyen-moi-cap-nhat?page=$page", headers) + + override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply { + element.selectFirst("a.line-clamp-2").let { + setUrlWithoutDomain(it!!.absUrl("href")) + title = it.text() + } + thumbnail_url = element.selectFirst("img")?.absUrl("src") + } + + override fun latestUpdatesNextPageSelector(): String = "nav ul li" + + override fun latestUpdatesSelector(): String = "section.mt-12 > .grid > .flex" + + override fun popularMangaFromElement(element: Element): SManga = latestUpdatesFromElement(element) + + override fun popularMangaNextPageSelector(): String = latestUpdatesNextPageSelector() + + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/danh-sach/truyen-hot?page=$page", headers) + + override fun popularMangaSelector(): String = latestUpdatesSelector() + + override fun chapterListSelector(): String = "section ul li a" + + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + element.selectFirst("a").let { + setUrlWithoutDomain(it!!.absUrl("href")) + name = it.select(".items-center:contains(Chapter)").text() + date_upload = parseDate(it.select(".text-center").text()) + } + } + + private fun parseDate(date: String): Long = runCatching { + val calendar = Calendar.getInstance() + val number = date.replace(Regex("[^0-9]"), "").trim().toInt() + when (date.replace(Regex("[0-9]"), "").trim()) { + "phút trước" -> calendar.apply { add(Calendar.MINUTE, -number) }.timeInMillis + "giờ trước" -> calendar.apply { add(Calendar.HOUR, -number) }.timeInMillis + "ngày trước" -> calendar.apply { add(Calendar.DAY_OF_YEAR, -number) }.timeInMillis + else -> dateFormat.parse(date)?.time + } + }.getOrNull() ?: 0L + + override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException() + + override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { + title = document.selectFirst("section aside:first-child h1")!!.text() + genre = document.select("span:contains(Thể loại:) ~ a").joinToString { it.text().trim(',', ' ') } + description = document.selectFirst("div.mt-3")?.text() + thumbnail_url = document.selectFirst("section aside:first-child img")?.absUrl("src") + status = parseStatus(document.selectFirst("span:contains(Trạng thái:) + b")?.text()) + author = document.select("span:contains(Tác giả:) + b").joinToString { it.text() } + } + + private fun parseStatus(status: String?) = when { + status == null -> SManga.UNKNOWN + status.contains("Đang tiến hành", ignoreCase = true) -> SManga.ONGOING + status.contains("Hoàn thành", ignoreCase = true) -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + + override fun pageListParse(document: Document): List = document.select("img.lozad").mapIndexed { i, e -> + Page(i, imageUrl = e.absUrl("data-src")) + } + + override fun searchMangaFromElement(element: Element): SManga = throw UnsupportedOperationException() + override fun searchMangaNextPageSelector(): String = throw UnsupportedOperationException() + override fun searchMangaSelector(): String = throw UnsupportedOperationException() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = searchUrl.toHttpUrl().newBuilder().apply { + addQueryParameter("keyword", query) + addQueryParameter("page", page.toString()) + + (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> + when (filter) { + is TextField -> setQueryParameter(filter.key, filter.state) + is GenreList -> + filter.state + .filter { it.state } + .map { it.id } + .forEach { addQueryParameter("categories", it) } + is StatusList -> + filter.state + .filter { it.state } + .map { it.id } + .forEach { addQueryParameter("status", it) } + is ChapterCountList -> + filter.state + .filter { it.state } + .map { it.id } + .forEach { addQueryParameter("minChap", it) } + is SortByList -> + { + val sort = getSortByList()[filter.state] + addQueryParameter("sort", sort.id) + } + is CountryList -> + filter.state + .filter { it.state } + .map { it.id } + .forEach { addQueryParameter("country", it) } + + else -> {} + } + } + }.build() + return GET(url, headers) + } + + override fun searchMangaParse(response: Response): MangasPage { + val json = json.decodeFromString(response.body.string()) + val manga = json.comics.data.map { + SManga.create().apply { + title = it.name + thumbnail_url = it.thumbnail + setUrlWithoutDomain("$baseUrl/" + it.slug) + } + } + val hasNextPage = json.comics.current_page != json.comics.last_page + return MangasPage(manga, hasNextPage) + } + + private class TextField(name: String, val key: String) : Filter.Text(name) + private class GenreList(genres: List) : Filter.Group("Thể loại", genres) + private class Genre(name: String, val id: String) : Filter.CheckBox(name) + + private class StatusList(status: List) : Filter.Group("Trạng Thái", status) + private class Status(name: String, val id: String) : Filter.CheckBox(name) + + private class ChapterCountList(chapter: List) : Filter.Group("Độ dài", chapter) + private class ChapterCount(name: String, val id: String) : Filter.CheckBox(name) + + private class SortByList(sort: Array) : Filter.Select("Sắp xếp", sort) + private class SortBy(name: String, val id: String) : Filter.CheckBox(name) { + override fun toString(): String { + return name + } + } + + private class CountryList(country: List) : Filter.Group("Quốc gia", country) + private class Country(name: String, val id: String) : Filter.CheckBox(name) + + override fun getFilterList() = FilterList( + GenreList(getGenreList()), + StatusList(getStatusList()), + ChapterCountList(getChapterCountList()), + SortByList(getSortByList()), + CountryList(getCountryList()), + ) + private fun getCountryList() = listOf( + Country("Nhật Bản", "manga"), + Country("Trung Quốc", "manhua"), + Country("Hàn Quốc", "manhwa"), + Country("Khác", "other"), + ) + private fun getSortByList() = arrayOf( + SortBy("Mới nhất", "latest"), + SortBy("Cũ nhất", "oldest"), + SortBy("Đánh giá", "rating"), + SortBy("A-Z", "alphabet"), + SortBy("Mới cập nhật", "recently_updated"), + SortBy("Xem nhiều nhất", "mostView"), + ) + private fun getChapterCountList() = listOf( + ChapterCount(">= 1 chapters", "1"), + ChapterCount(">= 3 chapters", "3"), + ChapterCount(">= 5 chapters", "5"), + ChapterCount(">= 10 chapters", "10"), + ChapterCount(">= 20 chapters", "20"), + ChapterCount(">= 30 chapters", "30"), + ChapterCount(">= 50 chapters", "50"), + ) + private fun getStatusList() = listOf( + Status("Hoàn thành", "1"), + Status("Đang tiến hành", "0"), + ) + private fun getGenreList() = listOf( + Genre("Action", "1"), + Genre("Adventure", "2"), + Genre("Fantasy", "3"), + Genre("Manhua", "4"), + Genre("Chuyển", "5"), + Genre("Truyện", "6"), + Genre("Xuyên", "7"), + Genre("Manhwa", "8"), + Genre("Drama", "9"), + Genre("Historical", "10"), + Genre("Manga", "11"), + Genre("Seinen", "12"), + Genre("Comedy", "13"), + Genre("Martial", "14"), + Genre("Mystery", "15"), + Genre("Romance", "16"), + Genre("Shounen", "17"), + Genre("Sports", "18"), + Genre("Supernatural", "19"), + Genre("Harem", "20"), + Genre("Webtoon", "21"), + Genre("School", "22"), + Genre("Psychological", "23"), + Genre("Cổ", "24"), + Genre("Ecchi", "25"), + Genre("Gender", "26"), + Genre("Shoujo", "27"), + Genre("Slice", "28"), + Genre("Ngôn", "29"), + Genre("Horror", "30"), + Genre("Sci", "31"), + Genre("Tragedy", "32"), + Genre("Mecha", "33"), + Genre("Comic", "34"), + Genre("One", "35"), + Genre("Shoujo", "36"), + Genre("Anime", "37"), + Genre("Josei", "38"), + Genre("Smut", "39"), + Genre("Shounen", "40"), + Genre("Mature", "41"), + Genre("Soft", "42"), + Genre("Adult", "43"), + Genre("Doujinshi", "44"), + Genre("Live", "45"), + Genre("Trinh", "46"), + Genre("Việt", "47"), + Genre("Truyện", "48"), + Genre("Cooking", "49"), + Genre("Tạp", "50"), + Genre("16", "51"), + Genre("Thiếu", "52"), + Genre("Soft", "53"), + Genre("Đam", "54"), + Genre("BoyLove", "55"), + Genre("Yaoi", "56"), + Genre("18", "57"), + Genre("Người", "58"), + Genre("ABO", "59"), + Genre("Mafia", "60"), + Genre("Isekai", "61"), + Genre("Hệ", "62"), + Genre("NTR", "63"), + Genre("Yuri", "64"), + Genre("Girl", "65"), + Genre("Demons", "66"), + Genre("Huyền", "67"), + Genre("Detective", "68"), + Genre("Trọng", "69"), + Genre("Magic", "70"), + ) + + private val preferences: SharedPreferences = + Injekt.get().getSharedPreferences("source_$id", 0x0000) + + init { + preferences.getString(DEFAULT_BASE_URL_PREF, null).let { prefDefaultBaseUrl -> + if (prefDefaultBaseUrl != defaultBaseUrl) { + preferences.edit() + .putString(BASE_URL_PREF, defaultBaseUrl) + .putString(DEFAULT_BASE_URL_PREF, defaultBaseUrl) + .apply() + } + } + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply { + key = BASE_URL_PREF + title = BASE_URL_PREF_TITLE + summary = BASE_URL_PREF_SUMMARY + setDefaultValue(defaultBaseUrl) + dialogTitle = BASE_URL_PREF_TITLE + dialogMessage = "Default: $defaultBaseUrl" + + setOnPreferenceChangeListener { _, _ -> + Toast.makeText(screen.context, RESTART_APP, Toast.LENGTH_LONG).show() + true + } + } + screen.addPreference(baseUrlPref) + } + + private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, defaultBaseUrl)!! + + companion object { + private const val DEFAULT_BASE_URL_PREF = "defaultBaseUrl" + private const val RESTART_APP = "Khởi chạy lại ứng dụng để áp dụng thay đổi." + private const val BASE_URL_PREF_TITLE = "Ghi đè URL cơ sở" + private const val BASE_URL_PREF = "overrideBaseUrl" + private const val BASE_URL_PREF_SUMMARY = + "Dành cho sử dụng tạm thời, cập nhật tiện ích sẽ xóa cài đặt." + } +} diff --git a/src/vi/goctruyentranh/src/eu/kanade/tachiyomi/extension/vi/goctruyentranh/SearchDTO.kt b/src/vi/goctruyentranh/src/eu/kanade/tachiyomi/extension/vi/goctruyentranh/SearchDTO.kt new file mode 100644 index 000000000..adff6d314 --- /dev/null +++ b/src/vi/goctruyentranh/src/eu/kanade/tachiyomi/extension/vi/goctruyentranh/SearchDTO.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.vi.goctruyentranh + +import kotlinx.serialization.Serializable + +@Serializable +class SearchDTO( + val comics: Comics, +) + +@Serializable +class Data( + var name: String, + val slug: String, + val thumbnail: String?, +) + +@Serializable +class Comics( + val current_page: Int, + val data: ArrayList = arrayListOf(), + val last_page: Int, +)