add DocTruyen3Q ()

* added DocTruyen3Q

* Update src/vi/doctruyen3q/src/eu/kanade/tachiyomi/extension/vi/doctruyen3q/DocTruyen3Q.kt

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* Fix space + avoid non null

* avoid non null

* update

---------

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>
This commit is contained in:
Fioren 2024-12-06 03:49:12 +07:00 committed by Draff
parent 3b8e3cf5bd
commit dcf3bb75d5
Signed by: Draff
GPG Key ID: E8A89F3211677653
7 changed files with 98 additions and 0 deletions
src/vi/doctruyen3q
build.gradle
res
mipmap-hdpi
mipmap-mdpi
mipmap-xhdpi
mipmap-xxhdpi
mipmap-xxxhdpi
src/eu/kanade/tachiyomi/extension/vi/doctruyen3q

@ -0,0 +1,10 @@
ext {
extName = 'DocTruyen3Q'
extClass = '.DocTruyen3Q'
themePkg = 'wpcomics'
baseUrl = 'https://doctruyen3qk.pro'
overrideVersionCode = 0
isNsfw = true
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

After

(image error) Size: 4.5 KiB

Binary file not shown.

After

(image error) Size: 2.5 KiB

Binary file not shown.

After

(image error) Size: 6.3 KiB

Binary file not shown.

After

(image error) Size: 12 KiB

Binary file not shown.

After

(image error) Size: 18 KiB

@ -0,0 +1,88 @@
package eu.kanade.tachiyomi.extension.vi.doctruyen3q
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.Page
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
import java.util.TimeZone
class DocTruyen3Q : WPComics(
"DocTruyen3Q",
"https://doctruyen3qk.pro",
"vi",
dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.ROOT).apply {
timeZone = TimeZone.getTimeZone("Asia/Ho_Chi_Minh")
},
gmtOffset = null,
) {
override val client = super.client.newBuilder()
.rateLimit(3)
.build()
override fun pageListParse(document: Document): List<Page> {
return document.select(".page-chapter a img, .page-chapter img").mapIndexed { index, element ->
val img = element.attr("abs:src").takeIf { it.isNotBlank() } ?: element.attr("abs:data-original")
Page(index, imageUrl = img)
}.distinctBy { it.imageUrl }
}
override fun popularMangaSelector() = "div.item-manga div.item"
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
element.selectFirst("h3 a")?.let {
title = it.text()
setUrlWithoutDomain(it.attr("abs:href"))
}
thumbnail_url = element.selectFirst("img")?.attr("abs:src")
}
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 = document.selectFirst("img.image-comic")?.attr("abs:src")
}
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.selectFirst(".chapters + div")?.text().toDate()
}
}
override val genresSelector = ".categories-detail ul.nav li:not(.active) a"
}