%Ff9Lh#V>}oA5d=??>b17{1L^pRfAZdJ$+^1jK-{
z{ns=B`-1R}cRceFrb-T*8&wDA=QaNXFgBGvBO#>APZE93hj~)V{6MeuGJgd40qAzs
ze)TR>;El_z4*`Cl`H7fb-)*mgT0KA?m#Wm8FTdsl{IDtGd{%@X-~j>s{{(!kHGusW
z2Nf+(rZR6JTiEQ2c>oEnv=OjuHP0vV9d8{9Ao-vFP$AcYrmKE>IupQQb@qvL%afSK
zZ*`0}Ac&TFYW`oa$Hdn7dpHb;|jungiiz9eYb#=cX!=qMzMF~gdy|LKF-e|*DS4JYZ|HNT0
zf{agK!2-+~LXtVBfmB(E4eD7%?)$f5@l#Jz`G_w4JkRv}EwLaIL&FU56J45dPi_0o
zM8k*IOOacfDY6a?u!#!!68vW_Nr!1G@|f|7Wtfmf^X
zFbNDcA54S+d;sS*H}H(4qLB@ju0pS`*XnXC?bNU38V;9%79D}Qs8)KbtsiKRmt-Mx
z_E&rxPM~4`;sO{5p86MBB%uBnd-kwMz#;()jKBhSzo-EVOu+vE;of5;P>`Is00000
LNkvXXu0mjftZ00T
literal 0
HcmV?d00001
diff --git a/src/en/mangabtt/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mangabtt/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..64e0b45e2097033b675b330abc13cb1aece8d2f5
GIT binary patch
literal 10132
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
literal 0
HcmV?d00001
diff --git a/src/en/mangabtt/src/eu/kanade/tachiyomi/extension/en/mangabtt/MangaBTT.kt b/src/en/mangabtt/src/eu/kanade/tachiyomi/extension/en/mangabtt/MangaBTT.kt
new file mode 100644
index 000000000..cf3ec31b1
--- /dev/null
+++ b/src/en/mangabtt/src/eu/kanade/tachiyomi/extension/en/mangabtt/MangaBTT.kt
@@ -0,0 +1,263 @@
+package eu.kanade.tachiyomi.extension.en.mangabtt
+
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.Filter
+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 eu.kanade.tachiyomi.source.online.ParsedHttpSource
+import okhttp3.FormBody
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Request
+import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
+import java.util.Calendar
+
+class MangaBTT : ParsedHttpSource() {
+
+ override val name = "MangaBTT"
+
+ override val baseUrl = "https://mangabtt.com"
+
+ override val lang = "en"
+
+ override val supportsLatest = true
+
+ override val client by lazy {
+ network.cloudflareClient.newBuilder()
+ .rateLimit(2)
+ .build()
+ }
+
+ override fun headersBuilder() = super.headersBuilder()
+ .add("Referer", "$baseUrl/")
+
+ // ============================== Popular ===============================
+
+ override fun popularMangaRequest(page: Int): Request = searchMangaRequest(
+ page = page,
+ query = "",
+ filters = FilterList(
+ SortByFilter(default = 2),
+ StatusFilter(default = 1),
+ GenreFilter(default = 1),
+ ),
+ )
+
+ override fun popularMangaSelector(): String =
+ searchMangaSelector()
+
+ override fun popularMangaFromElement(element: Element): SManga =
+ searchMangaFromElement(element)
+
+ override fun popularMangaNextPageSelector(): String =
+ searchMangaNextPageSelector()
+
+ // =============================== Latest ===============================
+
+ override fun latestUpdatesRequest(page: Int): Request = searchMangaRequest(
+ page = page,
+ query = "",
+ filters = FilterList(
+ SortByFilter(default = 8),
+ StatusFilter(default = 1),
+ GenreFilter(default = 1),
+ ),
+ )
+
+ override fun latestUpdatesSelector(): String =
+ searchMangaSelector()
+
+ override fun latestUpdatesFromElement(element: Element): SManga =
+ searchMangaFromElement(element)
+
+ override fun latestUpdatesNextPageSelector(): String =
+ searchMangaNextPageSelector()
+
+ // =============================== Search ===============================
+
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ val url = "$baseUrl/find-story".toHttpUrl().newBuilder().apply {
+ if (query.isNotBlank()) {
+ addQueryParameter("keyword", query)
+ } else {
+ val genre = filters.firstInstanceOrNull()?.selectedValue.orEmpty()
+ val status = filters.firstInstanceOrNull()?.selectedValue.orEmpty()
+ val sortBy = filters.firstInstanceOrNull()?.selectedValue.orEmpty()
+
+ addQueryParameter("status", status)
+ addQueryParameter("sort", sortBy)
+ if (genre.isNotBlank()) {
+ addPathSegment(genre)
+ }
+ }
+
+ addQueryParameter("page", page.toString())
+ }
+
+ return GET(url.build(), headers)
+ }
+
+ override fun searchMangaSelector(): String = ".items > .row > .item"
+
+ override fun searchMangaFromElement(element: Element): SManga = SManga.create().apply {
+ thumbnail_url = element.selectFirst(".image img")?.imgAttr()
+ element.selectFirst("figcaption h3 a")!!.run {
+ title = text()
+ setUrlWithoutDomain(attr("abs:href"))
+ }
+ }
+
+ override fun searchMangaNextPageSelector(): String =
+ "ul.pagination > li.active + li:not(.disabled)"
+
+ // =============================== Filters ==============================
+
+ override fun getFilterList(): FilterList = FilterList(
+ Filter.Header("Ignored when using text search"),
+ Filter.Separator(),
+ GenreFilter(),
+ StatusFilter(),
+ SortByFilter(),
+ )
+
+ // =========================== Manga Details ============================
+
+ override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
+ title = document.selectFirst("h1.title-detail")!!.text()
+ description = document.selectFirst(".detail-content p")?.text()
+ ?.substringAfter("comic site. The Summary is ")
+
+ document.selectFirst(".detail-info")?.run {
+ thumbnail_url = selectFirst("img")?.imgAttr()
+ status = selectFirst(".status p:not(.name)").parseStatus()
+ genre = select(".kind a").joinToString(", ") { it.text() }
+ author = selectFirst(".author p:not(.name)")?.text()?.takeUnless {
+ it.equals("updating", true)
+ }
+ }
+ }
+
+ private fun Element?.parseStatus(): Int = with(this?.text()) {
+ return when {
+ equals("ongoing", true) -> SManga.ONGOING
+ equals("Đang cập nhật", true) -> SManga.ONGOING
+ equals("completed", true) -> SManga.COMPLETED
+ equals("on-hold", true) -> SManga.ON_HIATUS
+ equals("canceled", true) -> SManga.CANCELLED
+ else -> SManga.UNKNOWN
+ }
+ }
+
+ // ============================== Chapters ==============================
+
+ override fun chapterListRequest(manga: SManga): Request {
+ val postHeaders = headersBuilder().apply {
+ add("Accept", "*/*")
+ add("Host", baseUrl.toHttpUrl().host)
+ add("Origin", baseUrl)
+ set("Referer", baseUrl + manga)
+ add("X-Requested-With", "XMLHttpRequest")
+ }.build()
+
+ val postBody = FormBody.Builder()
+ .add("StoryID", manga.url.substringAfterLast("-"))
+ .build()
+
+ return POST("$baseUrl/Story/ListChapterByStoryID", postHeaders, postBody)
+ }
+
+ override fun chapterListSelector() = "ul > li:not(.heading)"
+
+ override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
+ element.selectFirst(".col-xs-4")?.also {
+ date_upload = it.text().parseRelativeDate()
+ }
+ element.selectFirst("a")!!.run {
+ name = text()
+ setUrlWithoutDomain(attr("abs:href"))
+ }
+ }
+
+ // From OppaiStream
+ private fun String.parseRelativeDate(): Long {
+ val now = Calendar.getInstance().apply {
+ set(Calendar.HOUR_OF_DAY, 0)
+ set(Calendar.MINUTE, 0)
+ set(Calendar.SECOND, 0)
+ set(Calendar.MILLISECOND, 0)
+ }
+
+ var parsedDate = 0L
+ val relativeDate = this.split(" ").firstOrNull()
+ ?.replace("one", "1")
+ ?.replace("a", "1")
+ ?.toIntOrNull()
+ ?: return 0L
+
+ when {
+ // parse: 30 seconds ago
+ "second" in this -> {
+ parsedDate = now.apply { add(Calendar.SECOND, -relativeDate) }.timeInMillis
+ }
+ // parses: "42 minutes ago"
+ "minute" in this -> {
+ parsedDate = now.apply { add(Calendar.MINUTE, -relativeDate) }.timeInMillis
+ }
+ // parses: "1 hour ago" and "2 hours ago"
+ "hour" in this -> {
+ parsedDate = now.apply { add(Calendar.HOUR, -relativeDate) }.timeInMillis
+ }
+ // parses: "2 days ago"
+ "day" in this -> {
+ parsedDate = now.apply { add(Calendar.DAY_OF_YEAR, -relativeDate) }.timeInMillis
+ }
+ // parses: "2 weeks ago"
+ "week" in this -> {
+ parsedDate = now.apply { add(Calendar.WEEK_OF_YEAR, -relativeDate) }.timeInMillis
+ }
+ // parses: "2 months ago"
+ "month" in this -> {
+ parsedDate = now.apply { add(Calendar.MONTH, -relativeDate) }.timeInMillis
+ }
+ // parse: "2 years ago"
+ "year" in this -> {
+ parsedDate = now.apply { add(Calendar.YEAR, -relativeDate) }.timeInMillis
+ }
+ }
+ return parsedDate
+ }
+
+ // =============================== Pages ================================
+
+ override fun pageListParse(document: Document): List {
+ return document.select(".reading-detail > .page-chapter").map { page ->
+ val img = page.selectFirst("img[data-index]")!!
+ val index = img.attr("data-index").toInt()
+ val url = img.imgAttr()
+ Page(index, imageUrl = url)
+ }.sortedBy { it.index }
+ }
+
+ override fun imageUrlParse(document: Document) = ""
+
+ override fun imageRequest(page: Page): Request {
+ val imgHeaders = headersBuilder().apply {
+ add("Accept", "image/avif,image/webp,*/*")
+ add("Host", page.imageUrl!!.toHttpUrl().host)
+ }.build()
+
+ return GET(page.imageUrl!!, imgHeaders)
+ }
+
+ // ============================= Utilities ==============================
+
+ private fun Element.imgAttr(): String = when {
+ hasAttr("data-lazy-src") -> attr("abs:data-lazy-src")
+ hasAttr("data-src") -> attr("abs:data-src")
+ else -> attr("abs:src")
+ }
+}
diff --git a/src/en/mangabtt/src/eu/kanade/tachiyomi/extension/en/mangabtt/MangaBTTFilters.kt b/src/en/mangabtt/src/eu/kanade/tachiyomi/extension/en/mangabtt/MangaBTTFilters.kt
new file mode 100644
index 000000000..fbf85082f
--- /dev/null
+++ b/src/en/mangabtt/src/eu/kanade/tachiyomi/extension/en/mangabtt/MangaBTTFilters.kt
@@ -0,0 +1,76 @@
+package eu.kanade.tachiyomi.extension.en.mangabtt
+
+import eu.kanade.tachiyomi.source.model.Filter
+
+data class FilterOption(val displayName: String, val value: String)
+
+inline fun List<*>.firstInstanceOrNull() = firstOrNull { it is T } as? T
+
+open class EnhancedSelect(name: String, private val _values: List, state: Int = 0) :
+ Filter.Select(name, _values.map { it.displayName }.toTypedArray(), state) {
+
+ val selectedValue: String?
+ get() = _values.getOrNull(state)?.value
+}
+
+class SortByFilter(default: Int = 1) : EnhancedSelect(
+ "Sort By",
+ listOf(
+ FilterOption("Top day", "13"),
+ FilterOption("Top week", "12"),
+ FilterOption("Top month", "11"),
+ FilterOption("Top All", "10"),
+ FilterOption("Comment", "25"),
+ FilterOption("New Manga", "15"),
+ FilterOption("Chapter", "30"),
+ FilterOption("Latest Updates", "0"),
+ ),
+ default - 1,
+)
+
+class StatusFilter(default: Int = 1) : EnhancedSelect(
+ "Status",
+ listOf(
+ FilterOption("All", "-1"),
+ FilterOption("Completed", "2"),
+ FilterOption("Ongoing", "1"),
+ ),
+ default - 1,
+)
+
+class GenreFilter(default: Int = 1) : EnhancedSelect(
+ "Genre",
+ listOf(
+ FilterOption("All", ""),
+ FilterOption("Action", "action"),
+ FilterOption("ADVENTURE", "adventure"),
+ FilterOption("Comedy", "comedy"),
+ FilterOption("Cooking", "cooking"),
+ FilterOption("Drama", "drama"),
+ FilterOption("Fantasy", "fantasy"),
+ FilterOption("Historical", "historical"),
+ FilterOption("Horror", "horror"),
+ FilterOption("Isekai", "isekai"),
+ FilterOption("Josei", "josei"),
+ FilterOption("Manhua", "manhua"),
+ FilterOption("Manhwa", "manhwa"),
+ FilterOption("Martial Arts", "martial-arts"),
+ FilterOption("Mecha", "mecha"),
+ FilterOption("MYSTERY", "mystery"),
+ FilterOption("PSYCHOLOGICAL", "psychological"),
+ FilterOption("Romance", "romance"),
+ FilterOption("School Life", "school-life"),
+ FilterOption("Sci fi", "sci-fi"),
+ FilterOption("Seinen", "seinen"),
+ FilterOption("Shoujo", "shoujo"),
+ FilterOption("Shounen", "shounen"),
+ FilterOption("SLICE OF LIF", "slice-of-lif"),
+ FilterOption("Slice of Life", "slice-of-life"),
+ FilterOption("Sports", "sports"),
+ FilterOption("SUGGESTIVE", "suggestive"),
+ FilterOption("SUPERNATURAL", "supernatural"),
+ FilterOption("TRAGEDY", "tragedy"),
+ FilterOption("Webtoons", "webtoons"),
+ ),
+ default - 1,
+)