[MintManga] Fix pages list

pull/17/head
Koitharu 4 years ago
parent 44e6842025
commit 26d7aa52af
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -38,7 +38,7 @@ kotlin {
dependencies { dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1'
implementation 'com.squareup.okhttp3:okhttp:4.9.3' implementation 'com.squareup.okhttp3:okhttp:4.9.3'
implementation 'com.squareup.okio:okio:3.0.0' implementation 'com.squareup.okio:okio:3.1.0'
implementation 'org.jsoup:jsoup:1.14.3' implementation 'org.jsoup:jsoup:1.14.3'
implementation 'org.json:json:20220320' implementation 'org.json:json:20220320'
implementation 'androidx.collection:collection-ktx:1.2.0' implementation 'androidx.collection:collection-ktx:1.2.0'

@ -3,5 +3,5 @@ plugins {
} }
dependencies { dependencies {
implementation 'com.google.devtools.ksp:symbol-processing-api:1.6.20-1.0.5' implementation 'com.google.devtools.ksp:symbol-processing-api:1.6.21-1.0.5'
} }

@ -41,6 +41,7 @@ abstract class MangaLoaderContext {
suspend fun httpPost( suspend fun httpPost(
url: String, url: String,
form: Map<String, String>, form: Map<String, String>,
headers: Headers? = null,
): Response { ): Response {
val body = FormBody.Builder() val body = FormBody.Builder()
form.forEach { (k, v) -> form.forEach { (k, v) ->
@ -49,12 +50,16 @@ abstract class MangaLoaderContext {
val request = Request.Builder() val request = Request.Builder()
.post(body.build()) .post(body.build())
.url(url) .url(url)
if (headers != null) {
request.headers(headers)
}
return httpClient.newCall(request.build()).await().ensureSuccess() return httpClient.newCall(request.build()).await().ensureSuccess()
} }
suspend fun httpPost( suspend fun httpPost(
url: String, url: String,
payload: String, payload: String,
headers: Headers?,
): Response { ): Response {
val body = FormBody.Builder() val body = FormBody.Builder()
payload.split('&').forEach { payload.split('&').forEach {
@ -68,6 +73,9 @@ abstract class MangaLoaderContext {
val request = Request.Builder() val request = Request.Builder()
.post(body.build()) .post(body.build())
.url(url) .url(url)
if (headers != null) {
request.headers(headers)
}
return httpClient.newCall(request.build()).await().ensureSuccess() return httpClient.newCall(request.build()).await().ensureSuccess()
} }

@ -16,10 +16,10 @@ private const val PAGE_SIZE = 70
private const val PAGE_SIZE_SEARCH = 50 private const val PAGE_SIZE_SEARCH = 50
private const val NSFW_ALERT = "сексуальные сцены" private const val NSFW_ALERT = "сексуальные сцены"
internal abstract class GroupleParser(source: MangaSource) : MangaParser(source) { internal abstract class GroupleParser(source: MangaSource, userAgent: String) : MangaParser(source) {
private val headers = Headers.Builder() private val headers = Headers.Builder()
.add("User-Agent", "readmangafun") .add("User-Agent", userAgent)
.build() .build()
override val sortOrders: Set<SortOrder> = EnumSet.of( override val sortOrders: Set<SortOrder> = EnumSet.of(
@ -43,6 +43,7 @@ internal abstract class GroupleParser(source: MangaSource) : MangaParser(source)
"q" to query.urlEncoded(), "q" to query.urlEncoded(),
"offset" to (offset upBy PAGE_SIZE_SEARCH).toString(), "offset" to (offset upBy PAGE_SIZE_SEARCH).toString(),
), ),
headers,
) )
tags.isNullOrEmpty() -> context.httpGet( tags.isNullOrEmpty() -> context.httpGet(
"https://$domain/list?sortType=${ "https://$domain/list?sortType=${
@ -166,12 +167,17 @@ internal abstract class GroupleParser(source: MangaSource) : MangaParser(source)
val scripts = doc.select("script") val scripts = doc.select("script")
for (script in scripts) { for (script in scripts) {
val data = script.html() val data = script.html()
val pos = data.indexOf("rm_h.init") val pos = data.indexOf("rm_h.initReader(")
if (pos == -1) { if (pos == -1) {
continue continue
} }
val json = data.substring(pos).substringAfter('(').substringBefore('\n') val json = data.substring(pos)
.substringAfter('(')
.substringBefore('\n')
.substringBeforeLast(')') .substringBeforeLast(')')
if (json.isEmpty()) {
continue
}
val ja = JSONArray("[$json]") val ja = JSONArray("[$json]")
val pages = ja.getJSONArray(1) val pages = ja.getJSONArray(1)
val servers = ja.getJSONArray(4).mapJSON { it.getString("path") } val servers = ja.getJSONArray(4).mapJSON { it.getString("path") }
@ -199,11 +205,12 @@ internal abstract class GroupleParser(source: MangaSource) : MangaParser(source)
val headers = Headers.headersOf("Referer", page.referer) val headers = Headers.headersOf("Referer", page.referer)
for (server in servers) { for (server in servers) {
val url = server + path val url = server + path
if (context.httpHead(url, headers).isSuccessful) { if (tryHead(url, headers)) {
return url return url
} }
} }
throw IllegalArgumentException("Cannot find any page url") val fallbackServer = servers.firstOrNull() ?: parseFailed("Cannot find any page url")
return fallbackServer + path
} }
override suspend fun getTags(): Set<MangaTag> { override suspend fun getTags(): Set<MangaTag> {
@ -263,6 +270,10 @@ internal abstract class GroupleParser(source: MangaSource) : MangaParser(source)
payload["s_sale"] = "" payload["s_sale"] = ""
payload["years"] = "1900,2099" payload["years"] = "1900,2099"
payload["+"] = "Искать".urlEncoded() payload["+"] = "Искать".urlEncoded()
return context.httpPost(url, payload) return context.httpPost(url, payload, headers)
} }
private suspend fun tryHead(url: String, headers: Headers): Boolean = runCatching {
context.httpHead(url, headers).isSuccessful
}.getOrDefault(false)
} }

@ -6,7 +6,9 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
@MangaSourceParser("MINTMANGA", "MintManga", "ru") @MangaSourceParser("MINTMANGA", "MintManga", "ru")
internal class MintMangaParser(override val context: MangaLoaderContext) : GroupleParser(MangaSource.MINTMANGA) { internal class MintMangaParser(
override val context: MangaLoaderContext,
) : GroupleParser(MangaSource.MINTMANGA, "mintmangafun") {
override val configKeyDomain = ConfigKey.Domain( override val configKeyDomain = ConfigKey.Domain(
"mintmanga.live", "mintmanga.live",

@ -6,7 +6,9 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
@MangaSourceParser("READMANGA_RU", "ReadManga", "ru") @MangaSourceParser("READMANGA_RU", "ReadManga", "ru")
internal class ReadmangaParser(override val context: MangaLoaderContext) : GroupleParser(MangaSource.READMANGA_RU) { internal class ReadmangaParser(
override val context: MangaLoaderContext,
) : GroupleParser(MangaSource.READMANGA_RU, "readmangafun") {
override val configKeyDomain = ConfigKey.Domain( override val configKeyDomain = ConfigKey.Domain(
"readmanga.io", "readmanga.io",

@ -6,7 +6,9 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
@MangaSourceParser("SELFMANGA", "SelfManga", "ru") @MangaSourceParser("SELFMANGA", "SelfManga", "ru")
internal class SelfMangaParser(override val context: MangaLoaderContext) : GroupleParser(MangaSource.SELFMANGA) { internal class SelfMangaParser(
override val context: MangaLoaderContext,
) : GroupleParser(MangaSource.SELFMANGA, "selfmangafun") {
override val configKeyDomain = ConfigKey.Domain("selfmanga.live", null) override val configKeyDomain = ConfigKey.Domain("selfmanga.live", null)
} }
Loading…
Cancel
Save