From 718e7eab82ff33ea70f3d2e809061f8a392e5392 Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Thu, 14 Mar 2024 19:07:50 +0100 Subject: [PATCH 1/3] fix source domain --- .../org/koitharu/kotatsu/parsers/site/madara/pt/Neoxscans.kt | 2 +- .../org/koitharu/kotatsu/parsers/site/madara/pt/RandomScans.kt | 2 +- .../koitharu/kotatsu/parsers/site/wpcomics/vi/Nettruyenmax.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Neoxscans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Neoxscans.kt index 227ce6f2..b7d00107 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Neoxscans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Neoxscans.kt @@ -11,7 +11,7 @@ import java.text.SimpleDateFormat @MangaSourceParser("NEOX_SCANS", "NeoxScans", "pt") internal class Neoxscans(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.NEOX_SCANS, "nexoscans.com", 18) { + MadaraParser(context, MangaSource.NEOX_SCANS, "nexoscans.net", 18) { override val datePattern = "dd/MM/yyyy" override suspend fun loadChapters(mangaUrl: String, document: Document): List { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/RandomScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/RandomScans.kt index 2cbc8ecd..f8fe3943 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/RandomScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/RandomScans.kt @@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("RANDOMSCANS", "RandomScans", "pt") internal class RandomScans(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.RANDOMSCANS, "randomscanlators.net") + MadaraParser(context, MangaSource.RANDOMSCANS, "luratoon.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/Nettruyenmax.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/Nettruyenmax.kt index de38432d..c4bbdbb1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/Nettruyenmax.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/Nettruyenmax.kt @@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser @MangaSourceParser("NETTRUYENMAX", "NettruyenBing", "vi") internal class Nettruyenmax(context: MangaLoaderContext) : - WpComicsParser(context, MangaSource.NETTRUYENMAX, "www.nettruyenclub.com", 36) + WpComicsParser(context, MangaSource.NETTRUYENMAX, "www.nettruyenbb.com", 36) From f450111c1c9b6faaa362727c10414268beb9e3da Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Thu, 14 Mar 2024 19:08:18 +0100 Subject: [PATCH 2/3] fix Baozimh webview and 50+ page chapter --- .../kotatsu/parsers/site/zh/Baozimh.kt | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt index 1bf22a90..66df8782 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt @@ -11,6 +11,7 @@ import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSON import java.util.* +import kotlin.collections.HashSet @MangaSourceParser("BAOZIMH", "Baozimh", "zh") internal class Baozimh(context: MangaLoaderContext) : @@ -111,7 +112,7 @@ internal class Baozimh(context: MangaLoaderContext) : private fun parseMangaListSearch(doc: Document): List { return doc.select("div.comics-card").map { div -> - val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href") + val href = "https://$domain" + div.selectFirstOrThrow("a").attrAsRelativeUrl("href") Manga( id = generateUid(href), url = href, @@ -182,15 +183,44 @@ internal class Baozimh(context: MangaLoaderContext) : } override suspend fun getPages(chapter: MangaChapter): List { - val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml().requireElementById("__nuxt") - return doc.select("button.pure-button").map { btn -> + val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() + val pagesList = doc.requireElementById("__nuxt") + val chapterLink = doc.select("link[rel=canonical]").attr("href") + val nextChapterLink = doc.select("div.next_chapter a").attr("href") + var part = 2 + val idSet = HashSet() + var pages = pagesList.select("button.pure-button").map { btn -> val urlPage = btn.attr("on").substringAfter(": '").substringBefore("?t=") + val id = generateUid(urlPage) + idSet.add(id) MangaPage( - id = generateUid(urlPage), + id = id, url = urlPage, preview = null, source = source, ) } + + val chapterPart = chapterLink.substringAfterLast("/").substringBefore(".html") + val nexChapterPart = nextChapterLink.substringAfterLast("/").substringBefore(".html") + while (nextChapterLink != "" && (nexChapterPart == chapterPart + "_" + part.toString())){ + val doc2 = webClient.httpGet(nextChapterLink).parseHtml().requireElementById("__nuxt") + val pages2 = doc2.select("button.pure-button").mapNotNull { btn -> + val urlPage = btn.attr("on").substringAfter(": '").substringBefore("?t=") + val id = generateUid(urlPage) + if(!idSet.add(id)){ + null + }else{ + MangaPage( + id = id, + url = urlPage, + preview = null, + source = source, + )} + } + pages = pages+pages2 + part++ + } + return pages } } From 67fef2cc1c999abcafb8081f6a65dbc1c235684d Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Thu, 14 Mar 2024 19:08:47 +0100 Subject: [PATCH 3/3] fix mangatown select and pagination --- .../parsers/site/en/MangaTownParser.kt | 58 +++++++++++++------ 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt index 6aad3269..55deddb2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt @@ -1,8 +1,6 @@ package org.koitharu.kotatsu.parsers.site.en -import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.MangaParser -import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.* import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -11,7 +9,7 @@ import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("MANGATOWN", "MangaTown", "en") -internal class MangaTownParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.MANGATOWN) { +internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGATOWN, 30) { override val configKeyDomain = ConfigKey.Domain("www.mangatown.com") @@ -29,8 +27,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : MangaParser(contex override val isMultipleTagsSupported = false - override suspend fun getList(offset: Int, filter: MangaListFilter?): List { - val page = (offset / 30) + 1 + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { val url = buildString { append("https://") append(domain) @@ -88,8 +85,13 @@ internal class MangaTownParser(context: MangaLoaderContext) : MangaParser(contex } } val doc = webClient.httpGet(url).parseHtml() - val root = doc.body().selectFirstOrThrow("ul.manga_pic_list") - return root.select("li").mapNotNull { li -> + val root = doc.body().selectFirst("ul.manga_pic_list") ?: return emptyList() + val manga = root.select("li") + + if (manga.isEmpty()) { + return emptyList() + } + return manga.mapNotNull { li -> val a = li.selectFirst("a.manga_cover") val href = a?.attrAsRelativeUrlOrNull("href") ?: return@mapNotNull null @@ -172,21 +174,41 @@ internal class MangaTownParser(context: MangaLoaderContext) : MangaParser(contex val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() val root = doc.body().selectFirstOrThrow("div.page_select") - return root.selectFirstOrThrow("select").selectOrThrow("option").mapNotNull { - val href = it.attrAsRelativeUrlOrNull("value") - if (href == null || href.endsWith("featured.html")) { - return@mapNotNull null + val isManga = root.select("select") + + if(isManga.isEmpty()){//Webtoon + val imgElements = doc.select("div#viewer.read_img img.image") + return imgElements.map { + val href = it.attr("src") + MangaPage( + id = generateUid(href), + url = href, + preview = null, + source = MangaSource.MANGATOWN, + ) + + } + }else{ //Manga + return isManga.select("option").mapNotNull { + val href = it.attrAsRelativeUrlOrNull("value") + if (href == null || href.endsWith("featured.html")) { + return@mapNotNull null + } + MangaPage( + id = generateUid(href), + url = href, + preview = null, + source = MangaSource.MANGATOWN, + ) } - MangaPage( - id = generateUid(href), - url = href, - preview = null, - source = MangaSource.MANGATOWN, - ) } } override suspend fun getPageUrl(page: MangaPage): String { + if(page.url.startsWith("//")){//Webtoon + return page.url.toAbsoluteUrl(domain) + } + val doc = webClient.httpGet(page.url.toAbsoluteUrl(domain)).parseHtml() return doc.requireElementById("image").attrAsAbsoluteUrl("src") }