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 4b5e68ce1..b5dc2a689 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 @@ -131,8 +131,8 @@ abstract class WPComics( } 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", "Đang cập nhật", "連載中") + val completedWords = listOf("Complete", "Completed", "Hoàn thành", "Đã hoàn thành", "完結済み") return when { this == null -> SManga.UNKNOWN ongoingWords.doesInclude(this) -> SManga.ONGOING diff --git a/src/vi/toptruyen/build.gradle b/src/vi/toptruyen/build.gradle new file mode 100644 index 000000000..c9752669b --- /dev/null +++ b/src/vi/toptruyen/build.gradle @@ -0,0 +1,10 @@ +ext { + extName = 'Top Truyen' + extClass = '.TopTruyen' + themePkg = 'wpcomics' + baseUrl = 'https://www.toptruyenviet.info' + overrideVersionCode = 0 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/vi/toptruyen/res/mipmap-hdpi/ic_launcher.png b/src/vi/toptruyen/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..fe4cd9ca8 Binary files /dev/null and b/src/vi/toptruyen/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/vi/toptruyen/res/mipmap-mdpi/ic_launcher.png b/src/vi/toptruyen/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..5853b4a33 Binary files /dev/null and b/src/vi/toptruyen/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/vi/toptruyen/res/mipmap-xhdpi/ic_launcher.png b/src/vi/toptruyen/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..03e8c51dd Binary files /dev/null and b/src/vi/toptruyen/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/vi/toptruyen/res/mipmap-xxhdpi/ic_launcher.png b/src/vi/toptruyen/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..b9e4fabb2 Binary files /dev/null and b/src/vi/toptruyen/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/vi/toptruyen/res/mipmap-xxxhdpi/ic_launcher.png b/src/vi/toptruyen/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..6c73e8456 Binary files /dev/null and b/src/vi/toptruyen/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/vi/toptruyen/src/eu/kanade/tachiyomi/extension/vi/toptruyen/TopTruyen.kt b/src/vi/toptruyen/src/eu/kanade/tachiyomi/extension/vi/toptruyen/TopTruyen.kt new file mode 100644 index 000000000..522f265f3 --- /dev/null +++ b/src/vi/toptruyen/src/eu/kanade/tachiyomi/extension/vi/toptruyen/TopTruyen.kt @@ -0,0 +1,77 @@ +package eu.kanade.tachiyomi.extension.vi.toptruyen + +import eu.kanade.tachiyomi.multisrc.wpcomics.WPComics +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale + +class TopTruyen : WPComics( + "Top Truyen", + "https://www.toptruyenviet.info", + "vi", + dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()), + gmtOffset = null, +) { + override val client = super.client.newBuilder() + .rateLimit(3) + .build() + + override fun popularMangaSelector() = "div.item-manga div.item" + + override fun popularMangaFromElement(element: Element) = SManga.create().apply { + element.select("h3 a").let { + title = it.text() + setUrlWithoutDomain(it.attr("abs:href")) + } + thumbnail_url = imageOrNull(element.selectFirst("img")!!) + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = "$baseUrl/$searchPath".toHttpUrl().newBuilder() + + filters.forEach { filter -> + when (filter) { + is GenreFilter -> filter.toUriPart()?.let { url.addPathSegment(it) } + is StatusFilter -> filter.toUriPart()?.let { url.addQueryParameter("status", it) } + else -> {} + } + } + + when { + query.isNotBlank() -> url.addQueryParameter(queryParam, query) + else -> url.addQueryParameter("page", page.toString()) + } + + return GET(url.toString(), headers) + } + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.selectFirst("h1.title-manga")!!.text() + description = document.selectFirst("p.detail-summary")?.text() + status = document.selectFirst("li.status p.detail-info span")?.text().toStatus() + genre = document.select("li.category p.detail-info a")?.joinToString { it.text() } + thumbnail_url = imageOrNull(document.selectFirst("img.image-comic")!!) + } + + override fun chapterListSelector() = "div.list-chapter li.row:not(.heading):not([style])" + + override fun chapterFromElement(element: Element): SChapter { + return super.chapterFromElement(element).apply { + date_upload = element.select(".chapters + div").text().toDate() + } + } + + override val genresSelector = ".categories-detail ul.nav li:not(.active) a" +}