From ca8faa3a7efee00129caf1dbe3382ec276d747d4 Mon Sep 17 00:00:00 2001 From: Secozzi <49240133+Secozzi@users.noreply.github.com> Date: Sat, 17 Feb 2024 14:42:40 +0000 Subject: [PATCH] Add todaymanga (#1289) * add todaymanga * small changes to filters * apply recommended changes * Small touch-up to date parsing --- src/en/todaymanga/build.gradle | 8 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2966 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1662 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3951 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6616 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9319 bytes .../extension/en/todaymanga/TodayManga.kt | 336 ++++++++++++++++++ 7 files changed, 344 insertions(+) create mode 100644 src/en/todaymanga/build.gradle create mode 100644 src/en/todaymanga/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/todaymanga/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/todaymanga/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/todaymanga/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/todaymanga/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/todaymanga/src/eu/kanade/tachiyomi/extension/en/todaymanga/TodayManga.kt diff --git a/src/en/todaymanga/build.gradle b/src/en/todaymanga/build.gradle new file mode 100644 index 000000000..6db476c99 --- /dev/null +++ b/src/en/todaymanga/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'TodayManga' + extClass = '.TodayManga' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/todaymanga/res/mipmap-hdpi/ic_launcher.png b/src/en/todaymanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ab4626225b7b3be06f72e317eac7ef76932541 GIT binary patch literal 2966 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 IM6N<$f<&Sx(EtDd literal 0 HcmV?d00001 diff --git a/src/en/todaymanga/res/mipmap-xhdpi/ic_launcher.png b/src/en/todaymanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7953a1551af0d232bc10c3f2de1790c56e9892a9 GIT binary patch literal 3951 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 ul > li.active + li:has(a)" + + // =============================== Latest =============================== + + override fun latestUpdatesRequest(page: Int): Request = + GET("$baseUrl/category/recent".addPage(page), headers) + + override fun latestUpdatesSelector(): String = "ul.series > li" + + override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply { + with(element.selectFirst("a[title][href]")!!) { + setUrlWithoutDomain(attr("abs:href")) + title = attr("title") + } + thumbnail_url = element.selectFirst("img")!!.imgAttr() + } + + override fun latestUpdatesNextPageSelector(): String = + popularMangaNextPageSelector() + + // =============================== Search =============================== + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val filterList = if (filters.isEmpty()) getFilterList() else filters + val categoryFilter = filterList.filterIsInstance().first() + val genreFilter = filterList.filterIsInstance().first() + + val url = baseUrl.toHttpUrl().newBuilder().apply { + when { + categoryFilter.state != 0 -> { + addPathSegment("category") + addPathSegments(categoryFilter.toUriPart()) + } + genreFilter.state != 0 -> { + addPathSegment("genre") + addPathSegment(genreFilter.toUriPart()) + } + query.isNotBlank() -> { + addPathSegment("search") + addQueryParameter("q", query) + } + else -> { // Default to popular + addPathSegments("category/most-popular") + } + } + + if (page > 1) { + addQueryParameter("page", page.toString()) + } + }.build() + + return GET(url, headers) + } + + override fun searchMangaSelector(): String = popularMangaSelector() + + override fun searchMangaFromElement(element: Element): SManga = + popularMangaFromElement(element) + + override fun searchMangaNextPageSelector(): String = + popularMangaNextPageSelector() + + override fun searchMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + + val mangaList = document.select(searchMangaSelector()) + .map(::searchMangaFromElement) + .ifEmpty { + document.select(latestUpdatesSelector()) + .map(::latestUpdatesFromElement) + } + + val hasNextPage = document.selectFirst(searchMangaNextPageSelector()) != null + return MangasPage(mangaList, hasNextPage) + } + + // =============================== Filters ============================== + + override fun getFilterList(): FilterList = FilterList( + Filter.Header("Ignored when using text search"), + Filter.Header("NOTE: Only one filter will be applied!"), + Filter.Separator(), + CategoryFilter(), + GenreFilter(), + ) + + class CategoryFilter : UriPartFilter( + "Category", + arrayOf( + Pair("", ""), + Pair("Action", "action"), + Pair("Adventure", "adventure"), + Pair("Comedy", "comedy"), + Pair("Drama", "drama"), + Pair("Ecchi", "ecchi"), + Pair("Fantasy", "fantasy"), + Pair("Gender Bender", "gender-bender"), + Pair("Harem", "harem"), + Pair("Historical", "historical"), + Pair("Horror", "horror"), + Pair("Martial Arts", "martial-arts"), + Pair("Mature", "mature"), + Pair("Music", "music"), + Pair("Mystery", "mystery"), + Pair("One Shot", "one-shot"), + Pair("Psychological", "psychological"), + Pair("Reverse Harem", "reverse-harem"), + Pair("Romance", "romance"), + Pair("School Life", "school-life"), + Pair("Sci fi", "sci-fi"), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shounen Ai", "shounen-ai"), + Pair("Shounen", "shounen"), + Pair("Slice Of Life", "slice-of-life"), + Pair("Sports", "sports"), + Pair("Supernatural", "supernatural"), + Pair("Tragedy", "tragedy"), + Pair("Vampire", "vampire"), + Pair("Webtoons", "webtoons"), + ), + ) + + open class UriPartFilter(displayName: String, private val vals: Array>) : + Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { + fun toUriPart() = vals[state].second + } + + // =========================== Manga Details ============================ + + override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { + with(document.selectFirst(".serie")!!) { + title = selectFirst("h1")!!.text() + thumbnail_url = selectFirst("img")!!.imgAttr() + genre = select(".serie-info-head .tags > .tag-item").joinToString { it.text() } + author = select(".authors a").joinToString { it.text() } + status = selectFirst("li:contains(status) span").parseStatus() + } + + description = buildString { + val summary = document.selectFirst(".serie-summary")!! + summary.childNodes().forEach { node -> + if (node is TextNode) { + append(node.text()) + } + if (node.nodeName() == "br") { + appendLine() + } + } + summary.selectFirst("div[style]")?.also { + append("\n\n") + append(it.text()) + } + }.trim() + } + + private fun Element?.parseStatus(): Int = when (this?.text()?.lowercase()) { + "complete" -> SManga.COMPLETED + "on going" -> SManga.ONGOING + else -> SManga.UNKNOWN + } + + // ============================== Chapters ============================== + + override fun chapterListRequest(manga: SManga): Request { + val chapterHeaders = headersBuilder().apply { + add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8") + set("Referer", baseUrl + manga.url) + }.build() + return GET("$baseUrl${manga.url}/chapter-list", chapterHeaders) + } + + override fun chapterListSelector() = "ul.chapters-list > li" + + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + with(element.selectFirst("a")!!) { + name = text() + setUrlWithoutDomain(attr("abs:href")) + } + + val dateText = element.selectFirst(".subtitle")?.text() + date_upload = if (dateText == null) { + 0L + } else if (dateText.contains("ago")) { + dateText.parseRelativeDate() + } else { + parseDate(dateText) + } + } + + private fun parseDate(dateStr: String): Long { + return try { + dateFormat.parse(dateStr)!!.time + } catch (_: ParseException) { + 0L + } + } + + // 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) + } + + val relativeDate = this.split(" ").firstOrNull() + ?.replace("one", "1") + ?.replace("a", "1") + ?.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 pageListParse(document: Document): List { + return document.select(".chapter-content > img[data-index]").map { img -> + 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 String.addPage(page: Int): HttpUrl { + return this.toHttpUrl().newBuilder().apply { + if (page > 1) { + addQueryParameter("page", page.toString()) + } + }.build() + } + + 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") + } +}