Refactor and fixes

This commit is contained in:
2024-10-09 08:18:29 +03:00
parent 6f9180545b
commit 5c55d65eb3
3 changed files with 137 additions and 140 deletions

View File

@@ -17,6 +17,7 @@ internal class NudeMoonParser(
) : MangaParser(context, MangaParserSource.NUDEMOON), MangaParserAuthProvider { ) : MangaParser(context, MangaParserSource.NUDEMOON), MangaParserAuthProvider {
override val configKeyDomain = ConfigKey.Domain( override val configKeyDomain = ConfigKey.Domain(
"b.nude-moon.fun",
"x.nude-moon.fun", "x.nude-moon.fun",
"nude-moon.org", "nude-moon.org",
"nude-moon.net", "nude-moon.net",

View File

@@ -1,20 +1,20 @@
package org.koitharu.kotatsu.parsers.site.wpcomics.vi package org.koitharu.kotatsu.parsers.site.wpcomics.vi
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.koitharu.kotatsu.parsers.Broken
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.Broken
@Broken @Broken
@MangaSourceParser("DOCTRUYEN3Q", "DocTruyen3Q", "vi") @MangaSourceParser("DOCTRUYEN3Q", "DocTruyen3Q", "vi")
internal class DocTruyen3Q(context: MangaLoaderContext) : internal class DocTruyen3Q(context: MangaLoaderContext) :
WpComicsParser(context, MangaParserSource.DOCTRUYEN3Q, "doctruyen3qmoi.pro", 36) { WpComicsParser(context, MangaParserSource.DOCTRUYEN3Q, "doctruyen3qmoi.pro", 36) {
override val userAgentKey = ConfigKey.UserAgent(UserAgents.CHROME_DESKTOP) override val userAgentKey = ConfigKey.UserAgent(UserAgents.CHROME_DESKTOP)
@@ -22,102 +22,102 @@ internal class DocTruyen3Q(context: MangaLoaderContext) :
super.onCreateConfig(keys) super.onCreateConfig(keys)
keys.add(userAgentKey) keys.add(userAgentKey)
} }
override val datePattern = "dd/MM/yyyy"
override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List<Manga> { override val datePattern = "dd/MM/yyyy"
val url = buildString {
append("https://")
append(domain)
append("/tim-truyen")
if (filter.query?.isNotEmpty() == true) {
append("?keyword=")
append(filter.query.urlEncoded())
}
if (page > 1) {
append(if (filter.query?.isNotEmpty() == true) "&" else "?")
append("page=")
append(page.toString())
}
}
val doc = webClient.httpGet(url).parseHtml()
return parseMangaList(doc)
}
private fun parseMangaList(doc: Document): List<Manga> { override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List<Manga> {
return doc.select("div.list-story-item").map { div -> val url = buildString {
val href = div.selectFirst("h3.title-book a")?.attrAsRelativeUrl("href") ?: div.parseFailed("Manga link not found") append("https://")
Manga( append(domain)
id = generateUid(href), append("/tim-truyen")
url = href, if (filter.query?.isNotEmpty() == true) {
publicUrl = href.toAbsoluteUrl(div.host ?: domain), append("?keyword=")
coverUrl = div.selectFirst("div.image img")?.src().orEmpty(), append(filter.query.urlEncoded())
title = div.selectFirst("h3.title-book a")?.text().orEmpty(), }
altTitle = null, if (page > 1) {
rating = RATING_UNKNOWN, append(if (filter.query?.isNotEmpty() == true) "&" else "?")
tags = emptySet(), append("page=")
author = null, append(page.toString())
state = null, }
source = source, }
isNsfw = isNsfwSource, val doc = webClient.httpGet(url).parseHtml()
) return parseMangaList(doc)
} }
}
override suspend fun getDetails(manga: Manga): Manga { private fun parseMangaList(doc: Document): List<Manga> {
val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() return doc.select("div.list-story-item").map { div ->
return manga.copy( val href = div.selectFirstOrThrow("h3.title-book a").attrAsRelativeUrl("href")
tags = doc.select("li.kind a").mapNotNullToSet { a -> Manga(
MangaTag( id = generateUid(href),
key = a.attr("href").substringAfterLast('/'), url = href,
title = a.text().trim(), publicUrl = href.toAbsoluteUrl(div.host ?: domain),
source = source, coverUrl = div.selectFirst("div.image img")?.src().orEmpty(),
) title = div.selectFirst("h3.title-book a")?.text().orEmpty(),
}, altTitle = null,
author = doc.selectFirst("li.author")?.text()?.substringAfter(':')?.trim(), rating = RATING_UNKNOWN,
description = doc.selectFirst("div.detail-content p")?.html(), tags = emptySet(),
state = when (doc.selectFirst("li.status")?.text()?.substringAfter(':')?.trim()) { author = null,
"Đang tiến hành" -> MangaState.ONGOING state = null,
"Đã hoàn thành" -> MangaState.FINISHED source = source,
else -> null isNsfw = isNsfwSource,
}, )
chapters = getChapters(doc), }
) }
}
override suspend fun getChapters(doc: Document): List<MangaChapter> { override suspend fun getDetails(manga: Manga): Manga {
val dateFormat = SimpleDateFormat(datePattern, sourceLocale) val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
return doc.select("div.list-chapter > a").mapChapters(reversed = true) { i, a -> return manga.copy(
val href = a.attrAsRelativeUrl("href") tags = doc.select("li.kind a").mapToSet { a ->
val dateText = a.selectFirst("span.chapter-time")?.text() MangaTag(
MangaChapter( key = a.attr("href").substringAfterLast('/'),
id = generateUid(href), title = a.text().toTitleCase(sourceLocale),
name = a.selectFirst("span.chapter-text")?.text() ?: "Chapter ${i + 1}", source = source,
number = i + 1f, )
url = href, },
uploadDate = parseChapterDate( author = doc.selectFirst("li.author")?.text()?.substringAfter(':')?.trim(),
dateFormat, description = doc.selectFirst("div.detail-content p")?.html(),
dateText, state = when (doc.selectFirst("li.status")?.text()?.substringAfter(':')?.trim()) {
), "Đang tiến hành" -> MangaState.ONGOING
source = source, "Đã hoàn thành" -> MangaState.FINISHED
scanlator = null, else -> null
branch = null, },
volume = 0, chapters = getChapters(doc),
) )
} }
}
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getChapters(doc: Document): List<MangaChapter> {
val fullUrl = chapter.url.toAbsoluteUrl(domain) val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
val doc = webClient.httpGet(fullUrl).parseHtml() return doc.select("div.list-chapter > a").mapChapters(reversed = true) { i, a ->
return doc.select("div.page-chapter img").map { img -> val href = a.attrAsRelativeUrl("href")
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found") val dateText = a.selectFirst("span.chapter-time")?.text()
MangaPage( MangaChapter(
id = generateUid(url), id = generateUid(href),
url = url, name = a.selectFirst("span.chapter-text")?.text() ?: "Chapter ${i + 1}",
preview = null, number = i + 1f,
source = source, url = href,
) uploadDate = parseChapterDate(
} dateFormat,
} dateText,
),
source = source,
scanlator = null,
branch = null,
volume = 0,
)
}
}
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
return doc.select("div.page-chapter img").map { img ->
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found")
MangaPage(
id = generateUid(url),
url = url,
preview = null,
source = source,
)
}
}
} }

View File

@@ -1,18 +1,17 @@
package org.koitharu.kotatsu.parsers.site.wpcomics.vi package org.koitharu.kotatsu.parsers.site.wpcomics.vi
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.koitharu.kotatsu.parsers.Broken
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaPage
import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.*
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.Broken
@Broken @Broken
@MangaSourceParser("TOPTRUYENVIET", "TopTruyen.pro", "vi") @MangaSourceParser("TOPTRUYENVIET", "TopTruyen.pro", "vi")
@@ -25,45 +24,42 @@ internal class TopTruyenViet(context: MangaLoaderContext) :
super.onCreateConfig(keys) super.onCreateConfig(keys)
keys.add(userAgentKey) keys.add(userAgentKey)
} }
override val selectPage = "div.page-chapter > img, div.chapter-content > img"
override val selectChapter = "div.list-chapter > a"
override val selectDate = "div.col-xs-4"
override val datePattern = "dd/MM/yyyy"
override suspend fun getChapters(doc: Document): List<MangaChapter> { override val selectPage = "div.page-chapter > img, div.chapter-content > img"
return doc.select(selectChapter).mapChapters(reversed = true) { i, a -> override val selectChapter = "div.list-chapter > a"
val href = a.attrAsRelativeUrl("href") override val selectDate = "div.col-xs-4"
val dateText = a.selectFirst(selectDate)?.text() override val datePattern = "dd/MM/yyyy"
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1f,
url = href,
uploadDate = parseChapterDate(
dateFormat,
dateText,
),
source = source,
scanlator = null,
branch = null,
volume = 0,
)
}
}
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getChapters(doc: Document): List<MangaChapter> {
val fullUrl = chapter.url.toAbsoluteUrl(domain) val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
val doc = webClient.httpGet(fullUrl).parseHtml() return doc.select(selectChapter).mapChapters(reversed = true) { i, a ->
return doc.select(selectPage).map { img -> val href = a.attrAsRelativeUrl("href")
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found") val dateText = a.selectFirst(selectDate)?.text()
MangaPage( MangaChapter(
id = generateUid(url), id = generateUid(href),
url = url, name = a.text(),
preview = null, number = i + 1f,
source = source, url = href,
) uploadDate = parseChapterDate(dateFormat, dateText),
} source = source,
} scanlator = null,
branch = null,
volume = 0,
)
}
}
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
return doc.select(selectPage).map { img ->
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found")
MangaPage(
id = generateUid(url),
url = url,
preview = null,
source = source,
)
}
}
} }