From 8938b92e097b1a9f354f5c1cb5ebd92168a6af29 Mon Sep 17 00:00:00 2001 From: NotBlankyu <66680364+NotBlankyu@users.noreply.github.com> Date: Wed, 24 Jan 2024 19:08:50 +0000 Subject: [PATCH] Add ManhuaPlusOrg (#578) --- src/en/manhuaplusorg/AndroidManifest.xml | 2 + src/en/manhuaplusorg/build.gradle | 7 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3099 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1669 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4650 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9279 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 14731 bytes .../en/manhuaplusorg/ManhuaPlusOrg.kt | 242 ++++++++++++++++++ .../en/manhuaplusorg/ManhuaPlusOrgFilters.kt | 139 ++++++++++ 9 files changed, 390 insertions(+) create mode 100644 src/en/manhuaplusorg/AndroidManifest.xml create mode 100644 src/en/manhuaplusorg/build.gradle create mode 100644 src/en/manhuaplusorg/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/manhuaplusorg/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/manhuaplusorg/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/manhuaplusorg/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/manhuaplusorg/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/manhuaplusorg/src/eu/kanade/tachiyomi/extension/en/manhuaplusorg/ManhuaPlusOrg.kt create mode 100644 src/en/manhuaplusorg/src/eu/kanade/tachiyomi/extension/en/manhuaplusorg/ManhuaPlusOrgFilters.kt diff --git a/src/en/manhuaplusorg/AndroidManifest.xml b/src/en/manhuaplusorg/AndroidManifest.xml new file mode 100644 index 000000000..8072ee00d --- /dev/null +++ b/src/en/manhuaplusorg/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/src/en/manhuaplusorg/build.gradle b/src/en/manhuaplusorg/build.gradle new file mode 100644 index 000000000..b996031e7 --- /dev/null +++ b/src/en/manhuaplusorg/build.gradle @@ -0,0 +1,7 @@ +ext { + extName = 'ManhuaPlus (unoriginal)' + extClass = '.ManhuaPlusOrg' + extVersionCode = 1 +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/manhuaplusorg/res/mipmap-hdpi/ic_launcher.png b/src/en/manhuaplusorg/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe8797e0c1afc755bb755e37aece8cf66f96797 GIT binary patch literal 3099 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 P00000NkvXXu0mjfFeDz} literal 0 HcmV?d00001 diff --git a/src/en/manhuaplusorg/res/mipmap-xhdpi/ic_launcher.png b/src/en/manhuaplusorg/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..88da4a8b3e2fc90449c3b7dff7c103293be5da0b GIT binary patch literal 4650 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 + when (filter) { + is GenreFilter -> { + if (filter.checked.isNotEmpty()) { + addQueryParameter("genres", filter.checked.joinToString(",")) + } + } + is StatusFilter -> { + if (filter.selected.isNotBlank()) { + addQueryParameter("status", filter.selected) + } + } + is SortFilter -> { + addQueryParameter("sort", filter.selected) + } + is ChapterCountFilter -> { + addQueryParameter("chapter_count", filter.selected) + } + is GenderFilter -> { + addQueryParameter("sex", filter.selected) + } + else -> {} + } + } + } + + addPathSegment(page.toString()) + addPathSegment("") + } + + return GET(url.build(), headers) + } + + override fun searchMangaParse(response: Response): MangasPage = popularMangaParse(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( + Filter.Header("Ignored when using text search"), + Filter.Separator(), + GenreFilter(), + ChapterCountFilter(), + GenderFilter(), + StatusFilter(), + SortFilter(), + ) + + // Details + + override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { + description = document.selectFirst("div#syn-target")?.text() + thumbnail_url = document.selectFirst(".a1 > figure img")?.imgAttr() + title = document.selectFirst(".a2 header h1")?.text()?.trim() ?: "N/A" + genre = document.select(".a2 div > a[rel='tag'].label").joinToString(", ") { it.text() } + + document.selectFirst(".a1 > aside")?.run { + author = select("div:contains(Authors) > span a") + .joinToString(", ") { it.text().trim() } + .takeUnless { it.isBlank() || it.equals("Updating", true) } + status = selectFirst("div:contains(Status) > span")?.text().let(::parseStatus) + } + } + + private fun parseStatus(status: String?): Int = when { + status.equals("ongoing", true) -> SManga.ONGOING + status.equals("completed", true) -> SManga.COMPLETED + status.equals("on-hold", true) -> SManga.ON_HIATUS + status.equals("canceled", true) -> SManga.CANCELLED + else -> SManga.UNKNOWN + } + + // Chapters + + override fun chapterListSelector() = "ul > li.chapter" + + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + element.selectFirst("time[datetime]")?.also { + date_upload = it.attr("datetime").toLongOrNull()?.let { it * 1000L } ?: 0L + } + element.selectFirst("a")!!.run { + text().trim().also { + name = it + chapter_number = it.substringAfter("hapter ").toFloatOrNull() ?: 0F + } + setUrlWithoutDomain(attr("href")) + } + } + + override fun pageListRequest(chapter: SChapter): Request { + val document = client.newCall(GET(baseUrl + chapter.url, headers)).execute().asJsoup() + + val script = document.selectFirst("script:containsData(const CHAPTER_ID)")!!.data() + + val id = script.substringAfter("const CHAPTER_ID = ").substringBefore(";") + + val pageHeaders = headersBuilder().apply { + add("Accept", "application/json, text/javascript, *//*; q=0.01") + add("Host", baseUrl.toHttpUrl().host) + add("Referer", baseUrl + chapter.url) + add("X-Requested-With", "XMLHttpRequest") + }.build() + + return GET("$baseUrl/ajax/image/list/chap/$id", pageHeaders) + } + + @Serializable + data class PageListResponseDto(val html: String) + + override fun pageListParse(response: Response): List { + val data = response.parseAs().html + return pageListParse( + Jsoup.parseBodyFragment( + data, + response.request.header("Referer")!!, + ), + ) + } + + override fun pageListParse(document: Document): List { + return document.select("div.separator").map { page -> + val index = page.selectFirst("img")!!.attr("alt").substringAfterLast(" ").toInt() + val url = page.selectFirst("a")!!.attr("abs:href") + Page(index, document.location(), 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 + + // From mangathemesia + 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") + } + + private inline fun Response.parseAs(): T { + return json.decodeFromString(body.string()) + } +} diff --git a/src/en/manhuaplusorg/src/eu/kanade/tachiyomi/extension/en/manhuaplusorg/ManhuaPlusOrgFilters.kt b/src/en/manhuaplusorg/src/eu/kanade/tachiyomi/extension/en/manhuaplusorg/ManhuaPlusOrgFilters.kt new file mode 100644 index 000000000..ab7e83da2 --- /dev/null +++ b/src/en/manhuaplusorg/src/eu/kanade/tachiyomi/extension/en/manhuaplusorg/ManhuaPlusOrgFilters.kt @@ -0,0 +1,139 @@ +package eu.kanade.tachiyomi.extension.en.manhuaplusorg + +import eu.kanade.tachiyomi.source.model.Filter + +abstract class SelectFilter( + name: String, + private val options: List>, +) : Filter.Select( + name, + options.map { it.first }.toTypedArray(), +) { + val selected get() = options[state].second +} + +class CheckBoxFilter( + name: String, + val value: String, +) : Filter.CheckBox(name) + +class ChapterCountFilter : SelectFilter("Chapter count", chapterCount) { + companion object { + private val chapterCount = listOf( + Pair(">= 0", "0"), + Pair(">= 10", "10"), + Pair(">= 30", "30"), + Pair(">= 50", "50"), + Pair(">= 100", "100"), + Pair(">= 200", "200"), + Pair(">= 300", "300"), + Pair(">= 400", "400"), + Pair(">= 500", "500"), + ) + } +} + +class GenderFilter : SelectFilter("Manga Gender", gender) { + companion object { + private val gender = listOf( + Pair("All", "All"), + Pair("Boy", "Boy"), + Pair("Girl", "Girl"), + ) + } +} + +class StatusFilter : SelectFilter("Status", status) { + companion object { + private val status = listOf( + Pair("All", ""), + Pair("Completed", "completed"), + Pair("OnGoing", "on-going"), + Pair("On-Hold", "on-hold"), + Pair("Canceled", "canceled"), + ) + } +} + +class SortFilter : SelectFilter("Sort", sort) { + companion object { + private val sort = listOf( + Pair("Default", "default"), + Pair("Latest Updated", "latest-updated"), + Pair("Most Viewed", "views"), + Pair("Most Viewed Month", "views_month"), + Pair("Most Viewed Week", "views_week"), + Pair("Most Viewed Day", "views_day"), + Pair("Score", "score"), + Pair("Name A-Z", "az"), + Pair("Name Z-A", "za"), + Pair("Newest", "new"), + Pair("Oldest", "old"), + ) + } +} + +class GenreFilter : Filter.Group( + "Genre", + genres.map { CheckBoxFilter(it.first, it.second) }, +) { + val checked get() = state.filter { it.state }.map { it.value } + + companion object { + private val genres = listOf( + Pair("Action", "4"), + Pair("Adaptation", "87"), + Pair("Adult", "31"), + Pair("Adventure", "5"), + Pair("Animals", "1657"), + Pair("Cartoon", "46"), + Pair("Comedy", "14"), + Pair("Demons", "284"), + Pair("Drama", "59"), + Pair("Ecchi", "67"), + Pair("Fantasy", "6"), + Pair("Full Color", "89"), + Pair("Genderswap", "2409"), + Pair("Ghosts", "2253"), + Pair("Gore", "1182"), + Pair("Harem", "17"), + Pair("Historical", "642"), + Pair("Horror", "797"), + Pair("Isekai", "239"), + Pair("Live action", "11"), + Pair("Long Strip", "86"), + Pair("Magic", "90"), + Pair("Magical Girls", "1470"), + Pair("Manhua", "7"), + Pair("Manhwa", "70"), + Pair("Martial Arts", "8"), + Pair("Mature", "12"), + Pair("Mecha", "786"), + Pair("Medical", "1443"), + Pair("Monsters", "138"), + Pair("Mystery", "9"), + Pair("Post-Apocalyptic", "285"), + Pair("Psychological", "798"), + Pair("Reincarnation", "139"), + Pair("Romance", "987"), + Pair("School Life", "10"), + Pair("Sci-fi", "135"), + Pair("Seinen", "196"), + Pair("Shounen", "26"), + Pair("Shounen ai", "64"), + Pair("Slice of Life", "197"), + Pair("Superhero", "136"), + Pair("Supernatural", "13"), + Pair("Survival", "140"), + Pair("Thriller", "137"), + Pair("Time travel", "231"), + Pair("Tragedy", "15"), + Pair("Video Games", "283"), + Pair("Villainess", "676"), + Pair("Virtual Reality", "611"), + Pair("Web comic", "88"), + Pair("Webtoon", "18"), + Pair("Wuxia", "239"), + ) + } +}