[IsekaiScan] Fix chapters numbers #162
This commit is contained in:
@@ -103,8 +103,7 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser(
|
||||
chapters = root.selectFirst(".episode-list")
|
||||
?.selectFirst(".main")
|
||||
?.children()
|
||||
?.reversed()
|
||||
?.mapChapters { i, div ->
|
||||
?.mapChapters(reversed = true) { i, div ->
|
||||
div.parseChapter(i)
|
||||
}.orEmpty(),
|
||||
)
|
||||
|
||||
@@ -75,7 +75,7 @@ class BlogTruyenParser(context: MangaLoaderContext) :
|
||||
|
||||
private fun parseChapterList(doc: Document): List<MangaChapter> {
|
||||
val chapterList = doc.select("#list-chapters > p")
|
||||
return chapterList.asReversed().mapChapters { index, element ->
|
||||
return chapterList.mapChapters(reversed = true) { index, element ->
|
||||
val titleElement = element.selectFirst("span.title > a") ?: return@mapChapters null
|
||||
val name = titleElement.text()
|
||||
val relativeUrl = titleElement.attrAsRelativeUrl("href")
|
||||
|
||||
@@ -56,7 +56,7 @@ class Manhwa18Parser(context: MangaLoaderContext) :
|
||||
description = docs.selectFirst(".series-summary .summary-content")?.html(),
|
||||
tags = tags.orEmpty(),
|
||||
state = state,
|
||||
chapters = docs.select(".card-body > .list-chapters > a").asReversed().mapChapters { index, element ->
|
||||
chapters = docs.select(".card-body > .list-chapters > a").mapChapters(reversed = true) { index, element ->
|
||||
// attrAsRelativeUrl only return page url without the '/'
|
||||
val chapterUrl = element.attrAsAbsoluteUrlOrNull("href")?.toRelativeUrl(domain)
|
||||
?: return@mapChapters null
|
||||
|
||||
@@ -35,7 +35,7 @@ class NetTruyenParser(context: MangaLoaderContext) :
|
||||
?.toFloatOrNull() ?: 0f
|
||||
|
||||
val chapterElements = doc.getElementById("nt_listchapter")?.select("ul > li") ?: doc.parseFailed()
|
||||
val chapters = chapterElements.asReversed().mapChapters { index, element ->
|
||||
val chapters = chapterElements.mapChapters(reversed = true) { index, element ->
|
||||
val a = element.selectFirst("div.chapter > a") ?: return@mapChapters null
|
||||
val relativeUrl = a.attrAsRelativeUrlOrNull("href") ?: return@mapChapters null
|
||||
val timeText = element.selectFirst("div.col-xs-4.text-center.no-wrap.small")?.text()
|
||||
|
||||
@@ -110,7 +110,7 @@ internal abstract class NineMangaParser(
|
||||
description = infoRoot.getElementsByAttributeValue("itemprop", "description").first()
|
||||
?.html()?.substringAfter("</b>"),
|
||||
chapters = root.selectFirst("div.chapterbox")?.select("ul.sub_vol_ul > li")
|
||||
?.asReversed()?.mapChapters { i, li ->
|
||||
?.mapChapters(reversed = true) { i, li ->
|
||||
val a = li.selectFirst("a.chapter_list_a")
|
||||
val href = a?.attrAsRelativeUrlOrNull("href")
|
||||
?.replace("%20", " ") ?: li.parseFailed("Link not found")
|
||||
|
||||
@@ -53,7 +53,7 @@ class TruyentranhLHParser(context: MangaLoaderContext) :
|
||||
state = state,
|
||||
rating = rating ?: RATING_UNKNOWN,
|
||||
description = infoHeaderEl?.selectFirst(".series-summary .summary-content")?.html(),
|
||||
chapters = docs.select("ul.list-chapters.at-series > a").reversed().mapChapters { index, element ->
|
||||
chapters = docs.select("ul.list-chapters.at-series > a").mapChapters(reversed = true) { index, element ->
|
||||
MangaChapter(
|
||||
id = generateUid(element.attrAsRelativeUrl("href")),
|
||||
name = element.selectFirst(".chapter-name")?.text()?.trim().orEmpty(),
|
||||
|
||||
@@ -90,7 +90,7 @@ class UnionMangasParser(context: MangaLoaderContext) : PagedMangaParser(context,
|
||||
it.toMangaTag()
|
||||
} ?: manga.tags,
|
||||
isNsfw = root.selectFirst(".alert-danger")?.html()?.contains("18 anos") == true,
|
||||
chapters = root.select("div.row.capitulos").asReversed().mapChapters { i, div ->
|
||||
chapters = root.select("div.row.capitulos").mapChapters(reversed = true) { i, div ->
|
||||
val a = div.selectFirstOrThrow("a")
|
||||
val href = a.attrAsRelativeUrl("href")
|
||||
val title = a.text()
|
||||
|
||||
@@ -174,7 +174,7 @@ internal abstract class GroupleParser(
|
||||
author = root.selectFirst("a.person-link")?.text() ?: manga.author,
|
||||
isNsfw = root.select(".alert-warning").any { it.ownText().contains(NSFW_ALERT) },
|
||||
chapters = root.selectFirst("div.chapters-link")?.selectFirst("table")
|
||||
?.select("tr:has(td > a)")?.asReversed()?.mapChapters { i, tr ->
|
||||
?.select("tr:has(td > a)")?.mapChapters(reversed = true) { i, tr ->
|
||||
val a = tr.selectFirst("a.chapter-link") ?: return@mapChapters null
|
||||
val href = a.attrAsRelativeUrl("href")
|
||||
var translators = ""
|
||||
|
||||
@@ -48,7 +48,7 @@ internal class Hentai4Free(context: MangaLoaderContext) :
|
||||
).parseHtml()
|
||||
val ul = doc2.body().selectFirstOrThrow("ul")
|
||||
val dateFormat = SimpleDateFormat(datePattern, Locale.US)
|
||||
return ul.select("li").asReversed().mapChapters { i, li ->
|
||||
return ul.select("li").mapChapters(reversed = true) { i, li ->
|
||||
val a = li.selectFirst("a")
|
||||
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
|
||||
MangaChapter(
|
||||
|
||||
@@ -127,7 +127,7 @@ abstract class Madara5Parser @InternalParsersApi constructor(
|
||||
private suspend fun loadChapters(mangaId: Long): List<MangaChapter> {
|
||||
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
|
||||
val doc = webClient.httpGet("https://${domain}/ajax-list-chapter?mangaID=$mangaId").parseHtml()
|
||||
return doc.select("li.wp-manga-chapter").asReversed().mapChapters { i, li ->
|
||||
return doc.select("li.wp-manga-chapter").mapChapters(reversed = true) { i, li ->
|
||||
val a = li.selectFirstOrThrow("a")
|
||||
val href = a.attrAsRelativeUrl("href")
|
||||
MangaChapter(
|
||||
|
||||
@@ -47,7 +47,7 @@ internal abstract class Madara6Parser(
|
||||
val url = mangaUrl.toAbsoluteUrl(domain).removeSuffix('/') + "/ajax/chapters/"
|
||||
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
|
||||
val doc = webClient.httpPost(url, emptyMap()).parseHtml()
|
||||
return doc.select("li.wp-manga-chapter").asReversed().mapChapters { i, li ->
|
||||
return doc.select("li.wp-manga-chapter").mapChapters(reversed = true) { i, li ->
|
||||
val a = li.selectFirstOrThrow("a")
|
||||
val href = a.attrAsRelativeUrl("href")
|
||||
MangaChapter(
|
||||
|
||||
@@ -154,7 +154,7 @@ internal abstract class MadaraParser(
|
||||
val root2 = doc.body().selectFirstOrThrow("div.content-area")
|
||||
.selectFirstOrThrow("div.c-page")
|
||||
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
|
||||
return root2.select("li").asReversed().mapChapters { i, li ->
|
||||
return root2.select("li").mapChapters(reversed = true) { i, li ->
|
||||
val a = li.selectFirst("a")
|
||||
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
|
||||
MangaChapter(
|
||||
|
||||
@@ -28,7 +28,7 @@ internal class MangaDistrict(context: MangaLoaderContext) :
|
||||
).parseHtml()
|
||||
val ul = doc2.body().selectFirstOrThrow("ul")
|
||||
val dateFormat = SimpleDateFormat(datePattern, Locale.US)
|
||||
return ul.select("li").asReversed().mapChapters { i, li ->
|
||||
return ul.select("li").mapChapters(reversed = true) { i, li ->
|
||||
val a = li.selectFirst("a")
|
||||
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
|
||||
MangaChapter(
|
||||
|
||||
@@ -53,7 +53,7 @@ internal class NeatManga(context: MangaLoaderContext) : MadaraParser(context, Ma
|
||||
).parseHtml()
|
||||
val ul = doc2.body().selectFirstOrThrow("ul")
|
||||
val dateFormat = SimpleDateFormat(datePattern, Locale.US)
|
||||
return ul.select("li").asReversed().mapChapters { i, li ->
|
||||
return ul.select("li").mapChapters(reversed = true) { i, li ->
|
||||
val a = li.selectFirst("a")
|
||||
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
|
||||
MangaChapter(
|
||||
|
||||
@@ -38,7 +38,7 @@ internal abstract class MangaReaderParser(
|
||||
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val docs = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
val chapters = docs.select("#chapterlist > ul > li").reversed().mapChapters { index, element ->
|
||||
val chapters = docs.select("#chapterlist > ul > li").mapChapters(reversed = true) { index, element ->
|
||||
val url = element.selectFirst("a")?.attrAsRelativeUrl("href") ?: return@mapChapters null
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
|
||||
@@ -92,7 +92,7 @@ internal abstract class ChanParser(
|
||||
return manga.copy(
|
||||
description = root.getElementById("description")?.html()?.substringBeforeLast("<div"),
|
||||
largeCoverUrl = root.getElementById("cover")?.absUrl("src"),
|
||||
chapters = root.select("table.table_cha tr:gt(1)").reversed().mapChapters { i, tr ->
|
||||
chapters = root.select("table.table_cha tr:gt(1)").mapChapters(reversed = true) { i, tr ->
|
||||
val href = tr?.selectFirst("a")?.attrAsRelativeUrlOrNull("href")
|
||||
?: return@mapChapters null
|
||||
MangaChapter(
|
||||
|
||||
@@ -11,29 +11,29 @@ import org.koitharu.kotatsu.parsers.util.*
|
||||
@MangaSourceParser("YAOICHAN", "Яой-тян", "ru")
|
||||
internal class YaoiChanParser(context: MangaLoaderContext) : ChanParser(context, MangaSource.YAOICHAN) {
|
||||
|
||||
override val configKeyDomain = ConfigKey.Domain("yaoi-chan.me", null)
|
||||
override val configKeyDomain = ConfigKey.Domain("yaoi-chan.me", null)
|
||||
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
val root = doc.body().requireElementById("dle-content")
|
||||
return manga.copy(
|
||||
description = root.getElementById("description")?.html()?.substringBeforeLast("<div"),
|
||||
largeCoverUrl = root.getElementById("cover")?.absUrl("src"),
|
||||
chapters = root.select("table.table_cha").flatMap { table ->
|
||||
table.select("div.manga")
|
||||
}.mapNotNull { it.selectFirst("a") }.reversed().mapChapters { i, a ->
|
||||
val href = a.attrAsRelativeUrl("href")
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text().trim(),
|
||||
number = i + 1,
|
||||
url = href,
|
||||
uploadDate = 0L,
|
||||
source = source,
|
||||
scanlator = null,
|
||||
branch = null,
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
val root = doc.body().requireElementById("dle-content")
|
||||
return manga.copy(
|
||||
description = root.getElementById("description")?.html()?.substringBeforeLast("<div"),
|
||||
largeCoverUrl = root.getElementById("cover")?.absUrl("src"),
|
||||
chapters = root.select("table.table_cha").flatMap { table ->
|
||||
table.select("div.manga")
|
||||
}.mapNotNull { it.selectFirst("a") }.mapChapters(reversed = true) { i, a ->
|
||||
val href = a.attrAsRelativeUrl("href")
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text().trim(),
|
||||
number = i + 1,
|
||||
url = href,
|
||||
uploadDate = 0L,
|
||||
source = source,
|
||||
scanlator = null,
|
||||
branch = null,
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,20 +4,18 @@ import org.koitharu.kotatsu.parsers.InternalParsersApi
|
||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||
|
||||
@InternalParsersApi
|
||||
inline fun <T> Iterable<T>.mapChapters(
|
||||
inline fun <T> List<T>.mapChapters(
|
||||
reversed: Boolean = false,
|
||||
transform: (index: Int, T) -> MangaChapter?,
|
||||
): List<MangaChapter> {
|
||||
val builder = ChaptersListBuilder(collectionSize())
|
||||
var index = 0
|
||||
for (item in this) {
|
||||
val elements = if (reversed) this.asReversed() else this
|
||||
for (item in elements) {
|
||||
if (builder.add(transform(index, item))) {
|
||||
index++
|
||||
}
|
||||
}
|
||||
if (reversed) {
|
||||
builder.reverse()
|
||||
}
|
||||
return builder.toList()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user