Small fixes
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Locale> = 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<Locale> = 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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
cause: Throwable? = null,
|
||||
) : RuntimeException("Authorization required", cause)
|
||||
|
||||
@@ -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<MangaPage> {
|
||||
try {
|
||||
return super.getPages(chapter)
|
||||
@@ -34,7 +34,7 @@ internal class AllHentaiParser(
|
||||
if (isAuthorized) {
|
||||
throw e
|
||||
} else {
|
||||
throw AuthRequiredException(source)
|
||||
throw AuthRequiredException(source, e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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" }
|
||||
|
||||
Reference in New Issue
Block a user