From 32914eb36df99d147c116ee559be4f343fbe2fbc Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 20 Jun 2023 12:40:15 +0300 Subject: [PATCH] Small fixes --- README.md | 2 +- .../kotatsu/parsers/ksp/ParserProcessor.kt | 3 ++- .../kotatsu/parsers/MangaLoaderContext.kt | 26 ++++++++++--------- .../exception/AuthRequiredException.kt | 5 ++-- .../parsers/site/grouple/AllHentaiParser.kt | 10 +++---- .../kotatsu/parsers/MangaParserTest.kt | 20 +++++++------- 6 files changed, 35 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 4612c1a9f..f63c288ad 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ This library provides manga sources. 3. Usage in code ```kotlin - val parser = MangaSource.MANGADEX.newParser(mangaLoaderContext) + val parser = mangaLoaderContext.newParserInstance(MangaSource.MANGADEX) ``` `mangaLoaderContext` is an implementation of the `MangaLoaderContext` class. diff --git a/kotatsu-parsers-ksp/src/main/kotlin/org/koitharu/kotatsu/parsers/ksp/ParserProcessor.kt b/kotatsu-parsers-ksp/src/main/kotlin/org/koitharu/kotatsu/parsers/ksp/ParserProcessor.kt index f2c04e5a6..cdce07a12 100644 --- a/kotatsu-parsers-ksp/src/main/kotlin/org/koitharu/kotatsu/parsers/ksp/ParserProcessor.kt +++ b/kotatsu-parsers-ksp/src/main/kotlin/org/koitharu/kotatsu/parsers/ksp/ParserProcessor.kt @@ -70,6 +70,7 @@ class ParserProcessor( import org.koitharu.kotatsu.parsers.model.MangaSource @Suppress("DEPRECATION") + @Deprecated("", replaceWith = ReplaceWith("context.newParserInstance(this)")) fun MangaSource.newParser(context: MangaLoaderContext): MangaParser = when (this) { """.trimIndent(), @@ -155,4 +156,4 @@ class ParserProcessor( sourcesWriter?.write("\t$deprecationString$name(\"$title\", $localeString$localeComment),\n") } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt index 1268be961..fc661ccef 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt @@ -8,22 +8,24 @@ import java.util.* abstract class MangaLoaderContext { - abstract val httpClient: OkHttpClient + abstract val httpClient: OkHttpClient - abstract val cookieJar: CookieJar + abstract val cookieJar: CookieJar - open fun encodeBase64(data: ByteArray): String = Base64.getEncoder().encodeToString(data) + fun newParserInstance(source: MangaSource): MangaParser = source.newParser(this) - open fun decodeBase64(data: String): ByteArray = Base64.getDecoder().decode(data) + open fun encodeBase64(data: ByteArray): String = Base64.getEncoder().encodeToString(data) - open fun getPreferredLocales(): List = listOf(Locale.getDefault()) + open fun decodeBase64(data: String): ByteArray = Base64.getDecoder().decode(data) - /** - * Execute JavaScript code and return result - * @param script JavaScript source code - * @return execution result as string, may be null - */ - abstract suspend fun evaluateJs(script: String): String? + open fun getPreferredLocales(): List = listOf(Locale.getDefault()) - abstract fun getConfig(source: MangaSource): MangaSourceConfig + /** + * Execute JavaScript code and return result + * @param script JavaScript source code + * @return execution result as string, may be null + */ + abstract suspend fun evaluateJs(script: String): String? + + abstract fun getConfig(source: MangaSource): MangaSourceConfig } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/exception/AuthRequiredException.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/exception/AuthRequiredException.kt index d94770e4f..494c25836 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/exception/AuthRequiredException.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/exception/AuthRequiredException.kt @@ -6,6 +6,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource /** * Authorization is required for access to the requested content */ -class AuthRequiredException @InternalParsersApi constructor( +class AuthRequiredException @InternalParsersApi @JvmOverloads constructor( val source: MangaSource, -) : RuntimeException("Authorization required") \ No newline at end of file + cause: Throwable? = null, +) : RuntimeException("Authorization required", cause) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/AllHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/AllHentaiParser.kt index 087cd8f0b..1ea461d8a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/AllHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/AllHentaiParser.kt @@ -8,7 +8,10 @@ import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.parsers.util.* +import org.koitharu.kotatsu.parsers.util.domain +import org.koitharu.kotatsu.parsers.util.parseFailed +import org.koitharu.kotatsu.parsers.util.parseHtml +import org.koitharu.kotatsu.parsers.util.urlEncoded @MangaSourceParser("ALLHENTAI", "ALlHentai", "ru") internal class AllHentaiParser( @@ -24,9 +27,6 @@ internal class AllHentaiParser( return "https://qawa.org/internal/auth/login?targetUri=$targetUri&siteId=1" } - override val isAuthorized: Boolean - get() = context.cookieJar.getCookies(domain).any { it.name == "trSessionId" } - override suspend fun getPages(chapter: MangaChapter): List { try { return super.getPages(chapter) @@ -34,7 +34,7 @@ internal class AllHentaiParser( if (isAuthorized) { throw e } else { - throw AuthRequiredException(source) + throw AuthRequiredException(source, e) } } } diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index 19e132ab8..2e9c5ef15 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -25,7 +25,7 @@ internal class MangaParserTest { @ParameterizedTest(name = "{index}|list|{0}") @MangaSources fun list(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) val list = parser.getList(0, sortOrder = SortOrder.POPULARITY, tags = null) checkMangaList(list, "list") assert(list.all { it.source == source }) @@ -34,7 +34,7 @@ internal class MangaParserTest { @ParameterizedTest(name = "{index}|pagination|{0}") @MangaSources fun pagination(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) val page1 = parser.getList(0, sortOrder = null, tags = null) val page2 = parser.getList(page1.size, sortOrder = null, tags = null) if (parser is PagedMangaParser) { @@ -54,7 +54,7 @@ internal class MangaParserTest { @ParameterizedTest(name = "{index}|search|{0}") @MangaSources fun search(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) val subject = parser.getList(0, sortOrder = SortOrder.POPULARITY, tags = null).minByOrNull { it.title.length } ?: error("No manga found") @@ -72,7 +72,7 @@ internal class MangaParserTest { @ParameterizedTest(name = "{index}|tags|{0}") @MangaSources fun tags(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) val tags = parser.getTags() assert(tags.isNotEmpty()) { "No tags found" } val keys = tags.map { it.key } @@ -92,7 +92,7 @@ internal class MangaParserTest { @ParameterizedTest(name = "{index}|tags_multiple|{0}") @MangaSources fun tagsMultiple(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) val tags = parser.getTags().shuffled().take(2).toSet() val list = try { @@ -111,7 +111,7 @@ internal class MangaParserTest { @ParameterizedTest(name = "{index}|details|{0}") @MangaSources fun details(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) val list = parser.getList(0, sortOrder = SortOrder.POPULARITY, tags = null) val manga = list[3] parser.getDetails(manga).apply { @@ -140,7 +140,7 @@ internal class MangaParserTest { @ParameterizedTest(name = "{index}|pages|{0}") @MangaSources fun pages(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) val list = parser.getList(0, sortOrder = SortOrder.UPDATED, tags = null) val manga = list.first() val chapter = parser.getDetails(manga).chapters?.firstOrNull() ?: error("Chapter is null at ${manga.publicUrl}") @@ -164,7 +164,7 @@ internal class MangaParserTest { @ParameterizedTest(name = "{index}|favicon|{0}") @MangaSources fun favicon(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) val favicons = parser.getFavicons() val types = setOf("png", "svg", "ico", "gif", "jpg", "jpeg") assert(favicons.isNotEmpty()) @@ -180,7 +180,7 @@ internal class MangaParserTest { @ParameterizedTest(name = "{index}|domain|{0}") @MangaSources fun domain(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) val defaultDomain = parser.domain val url = HttpUrl.Builder().host(defaultDomain).scheme("https").toString() val response = context.doRequest(url, source) @@ -196,7 +196,7 @@ internal class MangaParserTest { @MangaSources @Disabled fun authorization(source: MangaSource) = runTest { - val parser = source.newParser(context) + val parser = context.newParserInstance(source) if (parser is MangaParserAuthProvider) { val username = parser.getUsername() assert(username.isNotBlank()) { "Username is blank" }