Refactor and fixes

master
Koitharu 2 years ago
parent 6f9180545b
commit 5c55d65eb3
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -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",

@ -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)
} }
}
private fun parseMangaList(doc: Document): List<Manga> {
return doc.select("div.list-story-item").map { div ->
val href = div.selectFirstOrThrow("h3.title-book a").attrAsRelativeUrl("href")
Manga(
id = generateUid(href),
url = href,
publicUrl = href.toAbsoluteUrl(div.host ?: domain),
coverUrl = div.selectFirst("div.image img")?.src().orEmpty(),
title = div.selectFirst("h3.title-book a")?.text().orEmpty(),
altTitle = null,
rating = RATING_UNKNOWN,
tags = emptySet(),
author = null,
state = null,
source = source,
isNsfw = isNsfwSource,
)
}
}
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
return manga.copy( return manga.copy(
tags = doc.select("li.kind a").mapNotNullToSet { a -> tags = doc.select("li.kind a").mapToSet { a ->
MangaTag( MangaTag(
key = a.attr("href").substringAfterLast('/'), key = a.attr("href").substringAfterLast('/'),
title = a.text().trim(), title = a.text().toTitleCase(sourceLocale),
source = source, source = source,
) )
}, },
author = doc.selectFirst("li.author")?.text()?.substringAfter(':')?.trim(), author = doc.selectFirst("li.author")?.text()?.substringAfter(':')?.trim(),
description = doc.selectFirst("div.detail-content p")?.html(), description = doc.selectFirst("div.detail-content p")?.html(),
state = when (doc.selectFirst("li.status")?.text()?.substringAfter(':')?.trim()) { state = when (doc.selectFirst("li.status")?.text()?.substringAfter(':')?.trim()) {
"Đang tiến hành" -> MangaState.ONGOING "Đang tiến hành" -> MangaState.ONGOING
"Đã hoàn thành" -> MangaState.FINISHED "Đã hoàn thành" -> MangaState.FINISHED
else -> null else -> null
}, },
chapters = getChapters(doc), chapters = getChapters(doc),
) )
} }
override suspend fun getChapters(doc: Document): List<MangaChapter> { override suspend fun getChapters(doc: Document): List<MangaChapter> {
val dateFormat = SimpleDateFormat(datePattern, sourceLocale) val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
return doc.select("div.list-chapter > a").mapChapters(reversed = true) { i, a -> return doc.select("div.list-chapter > a").mapChapters(reversed = true) { i, a ->
val href = a.attrAsRelativeUrl("href") val href = a.attrAsRelativeUrl("href")
val dateText = a.selectFirst("span.chapter-time")?.text() val dateText = a.selectFirst("span.chapter-time")?.text()
MangaChapter( MangaChapter(
id = generateUid(href), id = generateUid(href),
name = a.selectFirst("span.chapter-text")?.text() ?: "Chapter ${i + 1}", name = a.selectFirst("span.chapter-text")?.text() ?: "Chapter ${i + 1}",
number = i + 1f, number = i + 1f,
url = href, url = href,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(
dateFormat, dateFormat,
dateText, dateText,
), ),
source = source, source = source,
scanlator = null, scanlator = null,
branch = null, branch = null,
volume = 0, volume = 0,
) )
} }
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain) val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml() val doc = webClient.httpGet(fullUrl).parseHtml()
return doc.select("div.page-chapter img").map { img -> return doc.select("div.page-chapter img").map { img ->
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found") val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found")
MangaPage( MangaPage(
id = generateUid(url), id = generateUid(url),
url = url, url = url,
preview = null, preview = null,
source = source, source = source,
) )
} }
} }
} }

@ -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( override suspend fun getChapters(doc: Document): List<MangaChapter> {
id = generateUid(href), val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
name = a.text(), return doc.select(selectChapter).mapChapters(reversed = true) { i, a ->
number = i + 1f, val href = a.attrAsRelativeUrl("href")
url = href, val dateText = a.selectFirst(selectDate)?.text()
uploadDate = parseChapterDate( MangaChapter(
dateFormat, id = generateUid(href),
dateText, name = a.text(),
), number = i + 1f,
source = source, url = href,
scanlator = null, uploadDate = parseChapterDate(dateFormat, dateText),
branch = null, source = source,
volume = 0, scanlator = null,
) branch = null,
} volume = 0,
} )
}
}
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain) val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml() val doc = webClient.httpGet(fullUrl).parseHtml()
return doc.select(selectPage).map { img -> return doc.select(selectPage).map { img ->
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found") val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found")
MangaPage( MangaPage(
id = generateUid(url), id = generateUid(url),
url = url, url = url,
preview = null, preview = null,
source = source, source = source,
) )
} }
} }
} }

Loading…
Cancel
Save