From f112a06ab6b3a9a90a743490e1c05070dcc7386c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 17 Aug 2022 16:45:18 +0300 Subject: [PATCH] [IsekaiScanEu] Fix chapters loading #41 --- build.gradle | 6 +- .../parsers/site/madara/IsekaiScanEu.kt | 45 +++++++++++++++ .../parsers/site/madara/MadaraParser.kt | 55 +++++++++++-------- 3 files changed, 79 insertions(+), 27 deletions(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/IsekaiScanEu.kt diff --git a/build.gradle b/build.gradle index 0b33f538..9cae532e 100644 --- a/build.gradle +++ b/build.gradle @@ -63,9 +63,9 @@ dependencies { ksp project(':kotatsu-parsers-ksp') - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' - testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.8.2' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0' + testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.9.0' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.9.0' testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4' testImplementation 'io.webfolder:quickjs:1.1.0' } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/IsekaiScanEu.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/IsekaiScanEu.kt new file mode 100644 index 00000000..bf540943 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/IsekaiScanEu.kt @@ -0,0 +1,45 @@ +package org.koitharu.kotatsu.parsers.site.madara + +import org.jsoup.nodes.Document +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.MangaChapter +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.util.* +import java.text.SimpleDateFormat +import java.util.* + +@MangaSourceParser("ISEKAISCAN_EU", "IsekaiScan (eu)", "en") +internal class IsekaiScanEuParser(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.ISEKAISCAN_EU, "isekaiscan.eu") { + + override suspend fun getChapters(manga: Manga, doc: Document): List { + val mangaId = doc.body().requireElementById("manga-chapters-holder").attr("data-id") + val ul = context.httpPost( + "https://${getDomain()}/wp-admin/admin-ajax.php", + mapOf( + "action" to "manga_get_chapters", + "manga" to mangaId, + ), + ).parseHtml().body().selectFirstOrThrow("ul") + val dateFormat = SimpleDateFormat(datePattern, Locale.US) + return ul.select("li").asReversed().mapChapters { i, li -> + val a = li.selectFirst("a") + val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing") + MangaChapter( + id = generateUid(href), + name = a.ownText(), + number = i + 1, + url = href, + uploadDate = parseChapterDate( + dateFormat, + li.selectFirst("span.chapter-release-date i")?.text(), + ), + source = source, + scanlator = null, + branch = null, + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt index bffe2d24..add88d00 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt @@ -1,5 +1,8 @@ package org.koitharu.kotatsu.parsers.site.madara +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser @@ -116,9 +119,10 @@ internal abstract class MadaraParser( } } - override suspend fun getDetails(manga: Manga): Manga { + override suspend fun getDetails(manga: Manga): Manga = coroutineScope { val fullUrl = manga.url.toAbsoluteUrl(getDomain()) val doc = context.httpGet(fullUrl).parseHtml() + val chaptersDeferred = async { getChapters(manga, doc) } val root = doc.body().selectFirst("div.profile-manga") ?.selectFirst("div.summary_content") ?.selectFirst("div.post-content") @@ -126,8 +130,7 @@ internal abstract class MadaraParser( val root2 = doc.body().selectFirst("div.content-area") ?.selectFirst("div.c-page") ?: throw ParseException("Root2 not found", fullUrl) - val dateFormat = SimpleDateFormat(datePattern, Locale.US) - return manga.copy( + manga.copy( tags = root.selectFirst("div.genres-content")?.select("a") ?.mapNotNullToSet { a -> MangaTag( @@ -141,26 +144,33 @@ internal abstract class MadaraParser( ?.select("p") ?.filterNot { it.ownText().startsWith("A brief description") } ?.joinToString { it.html() }, - chapters = root2.select("li").asReversed().mapChapters { i, li -> - val a = li.selectFirst("a") - val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing") - MangaChapter( - id = generateUid(href), - name = a.ownText(), - number = i + 1, - url = href, - uploadDate = parseChapterDate( - dateFormat, - li.selectFirst("span.chapter-release-date i")?.text(), - ), - source = source, - scanlator = null, - branch = null, - ) - }, + chapters = chaptersDeferred.await(), ) } + protected open suspend fun getChapters(manga: Manga, doc: Document): List { + val root2 = doc.body().selectFirstOrThrow("div.content-area") + .selectFirstOrThrow("div.c-page") + val dateFormat = SimpleDateFormat(datePattern, Locale.US) + return root2.select("li").asReversed().mapChapters { i, li -> + val a = li.selectFirst("a") + val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing") + MangaChapter( + id = generateUid(href), + name = a.ownText(), + number = i + 1, + url = href, + uploadDate = parseChapterDate( + dateFormat, + li.selectFirst("span.chapter-release-date i")?.text(), + ), + source = source, + scanlator = null, + branch = null, + ) + } + } + override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(getDomain()) val doc = context.httpGet(fullUrl).parseHtml() @@ -180,7 +190,7 @@ internal abstract class MadaraParser( } } - private fun parseChapterDate(dateFormat: DateFormat, date: String?): Long { + protected fun parseChapterDate(dateFormat: DateFormat, date: String?): Long { date ?: return 0 return when { date.endsWith(" ago", ignoreCase = true) -> { @@ -355,9 +365,6 @@ internal abstract class MadaraParser( @MangaSourceParser("MANGAROCK", "MangaRock", "en") class MangaRock(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGAROCK, "mangarockteam.com") - @MangaSourceParser("ISEKAISCAN_EU", "IsekaiScan (eu)", "en") - class IsekaiScanEu(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ISEKAISCAN_EU, "isekaiscan.eu") - @MangaSourceParser("FREEMANGA", "FreeManga", "en") class FreeManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.FREEMANGA, "freemanga.me")