From 485447d7b2172af1b5938a5fbb04994105c93eb5 Mon Sep 17 00:00:00 2001 From: Secozzi <49240133+Secozzi@users.noreply.github.com> Date: Fri, 12 Apr 2024 02:06:03 +0000 Subject: [PATCH] add mangatop (#2336) * add mangatop * update token when possible --- src/en/mangatop/build.gradle | 8 + .../mangatop/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5027 bytes .../mangatop/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2515 bytes .../mangatop/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7102 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 12724 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 19362 bytes .../extension/en/mangatop/Filters.kt | 131 +++++++ .../extension/en/mangatop/MangaTop.kt | 356 ++++++++++++++++++ 8 files changed, 495 insertions(+) create mode 100644 src/en/mangatop/build.gradle create mode 100644 src/en/mangatop/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/mangatop/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/mangatop/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/mangatop/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/mangatop/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/mangatop/src/eu/kanade/tachiyomi/extension/en/mangatop/Filters.kt create mode 100644 src/en/mangatop/src/eu/kanade/tachiyomi/extension/en/mangatop/MangaTop.kt diff --git a/src/en/mangatop/build.gradle b/src/en/mangatop/build.gradle new file mode 100644 index 000000000..385d748d1 --- /dev/null +++ b/src/en/mangatop/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'MangaTop' + extClass = '.MangaTop' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/mangatop/res/mipmap-hdpi/ic_launcher.png b/src/en/mangatop/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a67a5f7df26a275952226dc141503f9d1888b33c GIT binary patch literal 5027 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 literal 0 HcmV?d00001 diff --git a/src/en/mangatop/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mangatop/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..323f13a843e0bc43f774b5aa59a1cf22a270f20e GIT binary patch literal 12724 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 literal 0 HcmV?d00001 diff --git a/src/en/mangatop/src/eu/kanade/tachiyomi/extension/en/mangatop/Filters.kt b/src/en/mangatop/src/eu/kanade/tachiyomi/extension/en/mangatop/Filters.kt new file mode 100644 index 000000000..59c17d6c9 --- /dev/null +++ b/src/en/mangatop/src/eu/kanade/tachiyomi/extension/en/mangatop/Filters.kt @@ -0,0 +1,131 @@ +package eu.kanade.tachiyomi.extension.en.mangatop + +import eu.kanade.tachiyomi.source.model.Filter +import okhttp3.HttpUrl + +interface UriFilter { + fun addToUri(builder: HttpUrl.Builder) +} + +open class UriMultiSelectOption(name: String, val value: String) : Filter.CheckBox(name) + +open class UriMultiSelectFilter( + name: String, + private val param: String, + private val vals: Array>, +) : Filter.Group(name, vals.map { UriMultiSelectOption(it.first, it.second) }), UriFilter { + override fun addToUri(builder: HttpUrl.Builder) { + state.filter { it.state }.forEach { + builder.addQueryParameter(param, it.value) + } + } +} + +class TypeFilter : UriMultiSelectFilter( + "Type", + "types[]", + arrayOf( + Pair("Manga", "1"), + Pair("Novel", "2"), + Pair("One Shot", "3"), + Pair("Doujinshi", "4"), + Pair("Manhwa", "5"), + Pair("Manhua", "6"), + Pair("OEL", "7"), + Pair("Light Novel", "8"), + ), +) + +class GenreFilter : UriMultiSelectFilter( + "Genre", + "genres[]", + arrayOf( + Pair("Action", "1"), + Pair("Adventure", "2"), + Pair("Avant Garde", "5"), + Pair("Award Winning", "46"), + Pair("Boys Love", "28"), + Pair("Comedy", "4"), + Pair("Drama", "8"), + Pair("Fantasy", "10"), + Pair("Girls Love", "26"), + Pair("Gourmet", "47"), + Pair("Horror", "14"), + Pair("Mystery", "7"), + Pair("Romance", "22"), + Pair("Sci-Fi", "24"), + Pair("Slice of Life", "36"), + Pair("Sports", "30"), + Pair("Supernatural", "37"), + Pair("Suspense", "45"), + Pair("Ecchi", "9"), + Pair("Erotica", "49"), + Pair("Hentai", "12"), + Pair("Adult Cast", "50"), + Pair("Anthropomorphic", "51"), + Pair("CGDCT", "52"), + Pair("Childcare", "53"), + Pair("Combat Sports", "54"), + Pair("Crossdressing", "44"), + Pair("Delinquents", "55"), + Pair("Detective", "39"), + Pair("Educational", "56"), + Pair("Gag Humor", "57"), + Pair("Gore", "58"), + Pair("Harem", "35"), + Pair("High Stakes Game", "59"), + Pair("Historical", "13"), + Pair("Idols (Female)", "60"), + Pair("Idols (Male)", "61"), + Pair("Isekai", "62"), + Pair("Iyashikei", "63"), + Pair("Love Polygon", "64"), + Pair("Magical Sex Shift", "65"), + Pair("Mahou Shoujo", "66"), + Pair("Martial Arts", "17"), + Pair("Mecha", "18"), + Pair("Medical", "67"), + Pair("Memoir", "68"), + Pair("Military", "38"), + Pair("Music", "19"), + Pair("Mythology", "6"), + Pair("Organized Crime", "69"), + Pair("Otaku Culture", "70"), + Pair("Parody", "20"), + Pair("Performing Arts", "71"), + Pair("Pets", "72"), + Pair("Psychological", "40"), + Pair("Racing", "3"), + Pair("Reincarnation", "73"), + Pair("Reverse Harem", "74"), + Pair("Romantic Subtext", "75"), + Pair("Samurai", "21"), + Pair("School", "23"), + Pair("Showbiz", "76"), + Pair("Space", "29"), + Pair("Strategy Game", "11"), + Pair("Super Power", "31"), + Pair("Survival", "77"), + Pair("Team Sports", "78"), + Pair("Time Travel", "79"), + Pair("Vampire", "32"), + Pair("Video Game", "80"), + Pair("Villainess", "81"), + Pair("Visual Arts", "82"), + Pair("Workplace", "48"), + Pair("Josei", "42"), + Pair("Kids", "15"), + Pair("Seinen", "41"), + Pair("Shoujo", "25"), + Pair("Shounen", "27"), + ), +) + +class StatusFilter : UriMultiSelectFilter( + "Status", + "status[]", + arrayOf( + Pair("Ongoing", "0"), + Pair("Completed", "1"), + ), +) diff --git a/src/en/mangatop/src/eu/kanade/tachiyomi/extension/en/mangatop/MangaTop.kt b/src/en/mangatop/src/eu/kanade/tachiyomi/extension/en/mangatop/MangaTop.kt new file mode 100644 index 000000000..61d447f80 --- /dev/null +++ b/src/en/mangatop/src/eu/kanade/tachiyomi/extension/en/mangatop/MangaTop.kt @@ -0,0 +1,356 @@ +package eu.kanade.tachiyomi.extension.en.mangatop + +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.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 eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream +import okhttp3.FormBody +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Interceptor +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import uy.kohesive.injekt.injectLazy +import java.io.IOException +import java.lang.Exception +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale + +class MangaTop : ParsedHttpSource() { + + override val name = "MangaTop" + + override val baseUrl = "https://mangatop.to" + + override val lang = "en" + + override val supportsLatest = true + + override val client = network.cloudflareClient.newBuilder() + .addInterceptor(::tokenInterceptor) + .rateLimit(2) + .build() + + override fun headersBuilder() = super.headersBuilder() + .add("Referer", "$baseUrl/") + + private val json: Json by injectLazy() + + private val dateFormat = SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH) + + private var storedToken: String? = null + + // From Akuma + private fun tokenInterceptor(chain: Interceptor.Chain): Response { + val request = chain.request() + + if (request.method == "POST" && request.header("X-CSRF-TOKEN") == null) { + val newRequest = request.newBuilder() + val token = getToken() + val response = chain.proceed( + newRequest + .addHeader("X-CSRF-TOKEN", token) + .build(), + ) + + if (response.code == 419) { + response.close() + storedToken = null // reset the token + val newToken = getToken() + return chain.proceed( + newRequest + .addHeader("X-CSRF-TOKEN", newToken) + .build(), + ) + } + + return response + } + + return chain.proceed(request) + } + + private fun getToken(): String { + if (storedToken.isNullOrEmpty()) { + val request = GET(baseUrl, headers) + val response = client.newCall(request).execute() + + val document = response.asJsoup() + document.updateToken() + } + + return storedToken!! + } + + // ============================== Popular =============================== + + override fun popularMangaRequest(page: Int): Request = GET(baseUrl, headers) + + override fun popularMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + document.updateToken() + + val mangaList = document.select(popularMangaSelector()) + .map(::popularMangaFromElement) + + return MangasPage(mangaList, false) + } + + override fun popularMangaSelector(): String = "aside div > article" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + thumbnail_url = element.selectFirst("img")!!.imgAttr() + with(element.selectFirst("a:has(h3)")!!) { + setUrlWithoutDomain(attr("abs:href")) + title = text() + } + } + + override fun popularMangaNextPageSelector(): String? = null + + // =============================== Latest =============================== + + override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/latest?page=$page", headers) + + override fun latestUpdatesParse(response: Response): MangasPage { + val document = response.asJsoup() + document.updateToken() + + val mangaList = document.select(latestUpdatesSelector()) + .map(::latestUpdatesFromElement) + + val hasNextPage = document.selectFirst(latestUpdatesNextPageSelector()) != null + + return MangasPage(mangaList, hasNextPage) + } + + override fun latestUpdatesSelector(): String = "div > article.manga-item" + + override fun latestUpdatesFromElement(element: Element): SManga = + popularMangaFromElement(element) + + override fun latestUpdatesNextPageSelector(): String = "ul.pagination > li.active + li:has(a)" + + // =============================== Search =============================== + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val filterList = filters.ifEmpty { getFilterList() } + val url = "$baseUrl/search".toHttpUrl().newBuilder().apply { + addQueryParameter("q", query) + filterList.filterIsInstance().forEach { + it.addToUri(this) + } + addQueryParameter("page", page.toString()) + }.build() + + return GET(url, headers) + } + + override fun searchMangaParse(response: Response): MangasPage = + latestUpdatesParse(response) + + override fun searchMangaSelector(): String = + throw UnsupportedOperationException() + + override fun searchMangaFromElement(element: Element): SManga = + throw UnsupportedOperationException() + + override fun searchMangaNextPageSelector(): String = + throw UnsupportedOperationException() + + // =============================== Filters ============================== + + override fun getFilterList(): FilterList = FilterList( + TypeFilter(), + GenreFilter(), + StatusFilter(), + ) + + // =========================== Manga Details ============================ + + override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { + thumbnail_url = document.selectFirst("picture img")!!.imgAttr() + with(document.selectFirst(".manga-info")!!) { + title = selectFirst("h1.page-heading")!!.text() + author = selectFirst("ul > li:has(span:contains(Authors))")?.ownText() + genre = select("ul > li:has(span:contains(Genres)) a").joinToString { it.text() } + status = selectFirst(".text-info").parseStatus() + description = selectFirst("#manga-description")?.text() + ?.split(".") + ?.filterNot { it.contains("MangaTop") } + ?.joinToString(".") + ?.trim() + } + } + + private fun Element?.parseStatus(): Int = when (this?.text()?.lowercase()) { + "ongoing" -> SManga.ONGOING + "completed" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + + // ============================== Chapters ============================== + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + document.updateToken() + + val mangaName = document.selectFirst("script:containsData(mangaName)") + ?.data() + ?.substringAfter("mangaName") + ?.substringAfter("'") + ?.substringBefore("'") + ?: throw Exception("Failed to get form data") + + val postHeaders = apiHeadersBuilder().apply { + set("Referer", response.request.url.toString()) + }.build() + + val postBody = FormBody.Builder().apply { + add("mangaIdx", response.request.url.toString().substringAfterLast("-")) + add("mangaName", mangaName) + }.build() + + val postResponse = client.newCall( + POST("$baseUrl/chapter-list", postHeaders, postBody), + ).execute() + + return super.chapterListParse(postResponse) + } + + override fun chapterListSelector() = "li" + + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + element.selectFirst(".text-muted")?.also { + date_upload = it.text().parseDate() + } + name = element.selectFirst("span:not(.text-muted)")!!.text() + setUrlWithoutDomain(element.selectFirst("a")!!.attr("abs:href")) + } + + private fun String.parseDate(): Long { + return if (this.contains("ago")) { + this.parseRelativeDate() + } else { + try { + dateFormat.parse(this)!!.time + } catch (_: ParseException) { + 0L + } + } + } + + 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) + } + + val relativeDate = this.split(" ").firstOrNull() + ?.toIntOrNull() + ?: return 0L + + when { + "second" in this -> now.add(Calendar.SECOND, -relativeDate) // parse: 30 seconds ago + "minute" in this -> now.add(Calendar.MINUTE, -relativeDate) // parses: "42 minutes ago" + "hour" in this -> now.add(Calendar.HOUR, -relativeDate) // parses: "1 hour ago" and "2 hours ago" + "day" in this -> now.add(Calendar.DAY_OF_YEAR, -relativeDate) // parses: "2 days ago" + "week" in this -> now.add(Calendar.WEEK_OF_YEAR, -relativeDate) // parses: "2 weeks ago" + "month" in this -> now.add(Calendar.MONTH, -relativeDate) // parses: "2 months ago" + "year" in this -> now.add(Calendar.YEAR, -relativeDate) // parse: "2 years ago" + } + return now.timeInMillis + } + + // =============================== Pages ================================ + + override fun pageListRequest(chapter: SChapter): Request { + val chapterId = chapter.url.substringBeforeLast(".html") + .substringAfterLast("-") + + val postHeaders = apiHeadersBuilder().apply { + set("Referer", baseUrl + chapter.url) + }.build() + + val postBody = FormBody.Builder().apply { + add("chapterIdx", chapterId) + }.build() + + return POST("$baseUrl/chapter-resources", postHeaders, postBody) + } + + @Serializable + class PageListResponse( + val data: PageListDataDto, + ) { + @Serializable + class PageListDataDto( + val resources: List, + ) { + @Serializable + class PageDto( + val name: Int, + val thumb: String, + ) + } + } + + override fun pageListParse(response: Response): List { + return response.parseAs().data.resources.map { + Page(it.name, imageUrl = it.thumb) + } + } + + override fun pageListParse(document: Document): List = + throw UnsupportedOperationException() + + 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 Document.updateToken() { + storedToken = this.selectFirst("head meta[name*=csrf-token]") + ?.attr("content") + ?: throw IOException("Failed to update token") + } + + private inline fun Response.parseAs(): T = use { + json.decodeFromStream(it.body.byteStream()) + } + + private fun apiHeadersBuilder() = headersBuilder().apply { + add("Accept", "*/*") + add("Host", baseUrl.toHttpUrl().host) + add("Origin", baseUrl) + add("X-Requested-With", "XMLHttpRequest") + } + + 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") + } +}