fix some source and add 3 source
This commit is contained in:
@@ -35,13 +35,30 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser(
|
||||
|
||||
override val configKeyDomain = ConfigKey.Domain(
|
||||
"bato.to",
|
||||
"mto.to",
|
||||
"hto.to",
|
||||
"mangatoto.com",
|
||||
"battwo.com",
|
||||
"batotwo.com",
|
||||
"comiko.net",
|
||||
"batocomic.com",
|
||||
"batocomic.net",
|
||||
"batocomic.org",
|
||||
"batotoo.com",
|
||||
"batotwo.com",
|
||||
"battwo.com",
|
||||
"comiko.net",
|
||||
"comiko.org",
|
||||
"mangatoto.com",
|
||||
"mangatoto.net",
|
||||
"mangatoto.org",
|
||||
"readtoto.com",
|
||||
"readtoto.net",
|
||||
"readtoto.org",
|
||||
"dto.to",
|
||||
"hto.to",
|
||||
"mto.to",
|
||||
"wto.to",
|
||||
"xbato.com",
|
||||
"xbato.net",
|
||||
"xbato.org",
|
||||
"zbato.com",
|
||||
"zbato.net",
|
||||
"zbato.org",
|
||||
)
|
||||
|
||||
override suspend fun getListPage(
|
||||
|
||||
@@ -29,7 +29,7 @@ import org.koitharu.kotatsu.parsers.util.urlEncoded
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.EnumSet
|
||||
|
||||
@MangaSourceParser("ISEKAISCAN", "Isekai Scan", "en")
|
||||
@MangaSourceParser("ISEKAISCAN", "Isekai Scan Top", "en")
|
||||
internal class IsekaiScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.ISEKAISCAN, "isekaiscan.top", 16) {
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
|
||||
import org.koitharu.kotatsu.parsers.util.toTitleCase
|
||||
import org.koitharu.kotatsu.parsers.util.urlEncoded
|
||||
|
||||
@MangaSourceParser("ISEKAISCAN_EU", "IsekaiScan", "en")
|
||||
@MangaSourceParser("ISEKAISCAN_EU", "Isekai Scan To", "en")
|
||||
internal class IsekaiScanEuParser(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.ISEKAISCAN_EU, "m.isekaiscan.to") {
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.id
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import java.util.Locale
|
||||
|
||||
@MangaSourceParser("IMMORTALUPDATESID", "Immortal Updates Id", "id")
|
||||
internal class ImmortalUpdatesId(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.IMMORTALUPDATESID, "immortalupdates.id") {
|
||||
|
||||
override val datePattern = "d MMMM yyyy"
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
@@ -55,10 +55,11 @@ internal abstract class MangaReaderParser(
|
||||
private val mutex = Mutex()
|
||||
private var lastSearchPage = 1
|
||||
|
||||
protected open val selectChapter = "#chapterlist > ul > li"
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val docs = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
|
||||
val chapters = docs.select("#chapterlist > ul > li").mapChapters(reversed = true) { index, element ->
|
||||
val chapters = docs.select(selectChapter).mapChapters(reversed = true) { index, element ->
|
||||
val url = element.selectFirst("a")?.attrAsRelativeUrl("href") ?: return@mapChapters null
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
@@ -99,7 +100,7 @@ internal abstract class MangaReaderParser(
|
||||
?: tablemode.selectFirst(".infotable td:contains(حالة العمل)")
|
||||
?: tablemode.selectFirst(".infotable td:contains(الحالة)")
|
||||
?: tablemode.selectFirst(".infotable td:contains(Estado)")
|
||||
?: docs.selectFirst(".infotable td:contains(สถานะ)")
|
||||
?: tablemode.selectFirst(".infotable td:contains(สถานะ)")
|
||||
?: tablemode.selectFirst(".infotable td:contains(Stato )")
|
||||
?: tablemode.selectFirst(".infotable td:contains(Durum)")
|
||||
?: tablemode.selectFirst(".infotable td:contains(Statüsü)")
|
||||
@@ -210,10 +211,11 @@ internal abstract class MangaReaderParser(
|
||||
return parseMangaList(webClient.httpGet(url).parseHtml())
|
||||
}
|
||||
|
||||
protected open val selectMangaliste = ".postbody .listupd .bs .bsx"
|
||||
protected open val selectMangalist = ".postbody .listupd .bs .bsx"
|
||||
protected open val selectMangaListImg = "img.ts-post-image"
|
||||
|
||||
protected open fun parseMangaList(docs: Document): List<Manga> {
|
||||
return docs.select(selectMangaliste).mapNotNull {
|
||||
return docs.select(selectMangalist).mapNotNull {
|
||||
val a = it.selectFirst("a") ?: return@mapNotNull null
|
||||
val relativeUrl = a.attrAsRelativeUrl("href")
|
||||
val rating = it.selectFirst(".numscore")?.text()
|
||||
@@ -227,7 +229,7 @@ internal abstract class MangaReaderParser(
|
||||
publicUrl = a.attrAsAbsoluteUrl("href"),
|
||||
rating = rating,
|
||||
isNsfw = isNsfwSource,
|
||||
coverUrl = it.selectFirst("img.ts-post-image")?.imageUrl().orEmpty(),
|
||||
coverUrl = it.selectFirst(selectMangaListImg)?.imageUrl().orEmpty(),
|
||||
tags = emptySet(),
|
||||
state = null,
|
||||
author = null,
|
||||
@@ -239,13 +241,14 @@ internal abstract class MangaReaderParser(
|
||||
protected open val encodedSrc = false
|
||||
protected open val selectScript = "div.wrapper script"
|
||||
|
||||
protected open val selectPage = "div#readerarea img"
|
||||
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
||||
val chapterUrl = chapter.url.toAbsoluteUrl(domain)
|
||||
val docs = webClient.httpGet(chapterUrl).parseHtml()
|
||||
|
||||
val test = docs.select("script:containsData(ts_reader)")
|
||||
if (test.isNullOrEmpty() and !encodedSrc) {
|
||||
return docs.select("div#readerarea img").map { img ->
|
||||
return docs.select(selectPage).map { img ->
|
||||
val url = img.imageUrl()
|
||||
MangaPage(
|
||||
id = generateUid(url),
|
||||
|
||||
@@ -8,6 +8,7 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.model.MangaState
|
||||
import org.koitharu.kotatsu.parsers.model.MangaTag
|
||||
import org.koitharu.kotatsu.parsers.model.SortOrder
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrl
|
||||
import org.koitharu.kotatsu.parsers.util.domain
|
||||
@@ -18,13 +19,71 @@ import org.koitharu.kotatsu.parsers.util.parseHtml
|
||||
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
|
||||
import org.koitharu.kotatsu.parsers.util.toTitleCase
|
||||
import org.koitharu.kotatsu.parsers.util.tryParse
|
||||
import org.koitharu.kotatsu.parsers.util.urlEncoded
|
||||
import java.text.SimpleDateFormat
|
||||
|
||||
@MangaSourceParser("SWATEAM", "Swa Team", "ar")
|
||||
internal class SwaTeam(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.SWATEAM, "swatop.club", pageSize = 42, searchPageSize = 39) {
|
||||
|
||||
override val datePattern = "dd-MM-yyyy"
|
||||
override val datePattern = "MMMM dd, yyyy"
|
||||
override val selectMangalist = ".listupd .bs .bsx"
|
||||
override val selectMangaListImg = "img"
|
||||
|
||||
private var lastSearchPage = 1
|
||||
|
||||
// Tag doesn't work on manga page ( it comes from website )
|
||||
override suspend fun getListPage(
|
||||
page: Int,
|
||||
query: String?,
|
||||
tags: Set<MangaTag>?,
|
||||
sortOrder: SortOrder,
|
||||
): List<Manga> {
|
||||
if (!query.isNullOrEmpty()) {
|
||||
if (page > lastSearchPage) {
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
val url = buildString {
|
||||
append("https://")
|
||||
append(domain)
|
||||
append("/?s=")
|
||||
append(query.urlEncoded())
|
||||
append("&page=")
|
||||
append(page)
|
||||
}
|
||||
|
||||
val docs = webClient.httpGet(url).parseHtml()
|
||||
lastSearchPage = docs.selectFirst(".pagination .next")
|
||||
?.previousElementSibling()
|
||||
?.text()?.toIntOrNull() ?: 1
|
||||
return parseMangaList(docs)
|
||||
}
|
||||
|
||||
val sortQuery = when (sortOrder) {
|
||||
SortOrder.ALPHABETICAL -> "title"
|
||||
SortOrder.NEWEST -> "latest"
|
||||
SortOrder.POPULARITY -> "popular"
|
||||
SortOrder.UPDATED -> "update"
|
||||
else -> ""
|
||||
}
|
||||
val tagKey = "genre[]".urlEncoded()
|
||||
val tagQuery =
|
||||
if (tags.isNullOrEmpty()) "" else tags.joinToString(separator = "&", prefix = "&") { "$tagKey=${it.key}" }
|
||||
val url = buildString {
|
||||
append("https://")
|
||||
append(domain)
|
||||
append(listUrl)
|
||||
append("/?order=")
|
||||
append(sortQuery)
|
||||
append(tagQuery)
|
||||
append("&page=")
|
||||
append(page)
|
||||
}
|
||||
|
||||
return parseMangaList(webClient.httpGet(url).parseHtml())
|
||||
}
|
||||
|
||||
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val docs = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
@@ -37,7 +96,7 @@ internal class SwaTeam(context: MangaLoaderContext) :
|
||||
url = url,
|
||||
number = index + 1,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()),
|
||||
uploadDate = dateFormat.tryParse(element.selectFirst(".chapter-date")?.text()),
|
||||
branch = null,
|
||||
source = source,
|
||||
)
|
||||
@@ -52,22 +111,20 @@ internal class SwaTeam(context: MangaLoaderContext) :
|
||||
val states = docs.selectFirst("div.spe span:contains(Ongoing)")?.text()
|
||||
|
||||
val state = if (states.isNullOrEmpty()) {
|
||||
"Completed"
|
||||
"completed"
|
||||
} else {
|
||||
"Ongoing"
|
||||
"ongoing"
|
||||
}
|
||||
|
||||
val mangaState = state.let {
|
||||
when (it) {
|
||||
"Ongoing" -> MangaState.ONGOING
|
||||
"ongoing" -> MangaState.ONGOING
|
||||
|
||||
"Completed" -> MangaState.FINISHED
|
||||
"completed" -> MangaState.FINISHED
|
||||
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
val author = docs.selectFirst("span.author i")?.text()
|
||||
|
||||
val nsfw = docs.selectFirst(".restrictcontainer") != null
|
||||
|
||||
@@ -21,7 +21,7 @@ internal class BabelToon(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.BABELTOON, "babeltoon.com", pageSize = 20, searchPageSize = 10) {
|
||||
|
||||
override val listUrl = "/series"
|
||||
override val selectMangaliste = ".postbody .listupd .maindet .inmain"
|
||||
override val selectMangalist = ".postbody .listupd .maindet .inmain"
|
||||
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val docs = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.Manga
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.model.MangaTag
|
||||
import org.koitharu.kotatsu.parsers.model.SortOrder
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
import org.koitharu.kotatsu.parsers.util.domain
|
||||
import org.koitharu.kotatsu.parsers.util.parseHtml
|
||||
import org.koitharu.kotatsu.parsers.util.urlEncoded
|
||||
import java.util.EnumSet
|
||||
|
||||
@MangaSourceParser("ZAHARD", "Zahard", "en")
|
||||
internal class Zahard(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.ZAHARD, "zahard.xyz", pageSize = 20, searchPageSize = 30) {
|
||||
|
||||
override val listUrl = "/library"
|
||||
override val selectChapter = "#chapterlist > ul > a"
|
||||
override val selectPage = "div#chapter_imgs img"
|
||||
|
||||
|
||||
override val sortOrders: Set<SortOrder>
|
||||
get() = EnumSet.of(SortOrder.NEWEST)
|
||||
private var lastSearchPage = 1
|
||||
override suspend fun getListPage(
|
||||
page: Int,
|
||||
query: String?,
|
||||
tags: Set<MangaTag>?,
|
||||
sortOrder: SortOrder,
|
||||
): List<Manga> {
|
||||
if (!query.isNullOrEmpty()) {
|
||||
if (page > lastSearchPage) {
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
val url = buildString {
|
||||
append("https://")
|
||||
append(domain)
|
||||
append(listUrl)
|
||||
append("?search=")
|
||||
append(query.urlEncoded())
|
||||
append("&page=")
|
||||
append(page)
|
||||
}
|
||||
|
||||
val docs = webClient.httpGet(url).parseHtml()
|
||||
lastSearchPage = docs.selectFirst("a[rel=next]")
|
||||
?.previousElementSibling()
|
||||
?.text()?.toIntOrNull() ?: 1
|
||||
return parseMangaList(docs)
|
||||
}
|
||||
|
||||
val tagKey = "tag".urlEncoded()
|
||||
val tagQuery =
|
||||
if (tags.isNullOrEmpty()) "" else tags.joinToString(separator = "&", prefix = "&") { "$tagKey=${it.key}" }
|
||||
val url = buildString {
|
||||
append("https://")
|
||||
append(domain)
|
||||
append(listUrl)
|
||||
append("?page=")
|
||||
append(page)
|
||||
append(tagQuery)
|
||||
|
||||
}
|
||||
|
||||
return parseMangaList(webClient.httpGet(url).parseHtml())
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.id
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
import java.util.Locale
|
||||
|
||||
@MangaSourceParser("MANGAKYO", "Mangakyo", "id")
|
||||
internal class Mangakyo(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.MANGAKYO, "mangakyo.org", pageSize = 40, searchPageSize = 20) {
|
||||
|
||||
override val listUrl = "/komik"
|
||||
override val datePattern = "MMM d, yyyy"
|
||||
}
|
||||
Reference in New Issue
Block a user