MNS: Fix chapters not found again (#2375)

insane
This commit is contained in:
bapeey 2024-04-12 12:38:27 -05:00 committed by Draff
parent 8ffd960733
commit 15b3fc9866
3 changed files with 59 additions and 5 deletions

View File

@ -3,7 +3,7 @@ ext {
extClass = '.MangasNoSekai' extClass = '.MangasNoSekai'
themePkg = 'madara' themePkg = 'madara'
baseUrl = 'https://mangasnosekai.com' baseUrl = 'https://mangasnosekai.com'
overrideVersionCode = 11 overrideVersionCode = 12
} }
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"

View File

@ -8,10 +8,12 @@ import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.decodeFromString
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.Jsoup
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -178,7 +180,7 @@ class MangasNoSekai : Madara(
intl["order_by_filter_new"] to "new-manga", intl["order_by_filter_new"] to "new-manga",
) )
private fun altChapterRequest(mangaId: String, page: Int, objects: List<Pair<String, String>>): Request { private fun altChapterRequest(url: String, mangaId: String, page: Int, objects: List<Pair<String, String>>): Request {
val form = FormBody.Builder() val form = FormBody.Builder()
.add("mangaid", mangaId) .add("mangaid", mangaId)
.add("page", page.toString()) .add("page", page.toString())
@ -187,7 +189,7 @@ class MangasNoSekai : Madara(
form.add(key, value) form.add(key, value)
} }
return POST("$baseUrl/wp-admin/admin-ajax.php", xhrHeaders, form.build()) return POST(baseUrl + url, xhrHeaders, form.build())
} }
private val altChapterListSelector = "body > div > div" private val altChapterListSelector = "body > div > div"
@ -196,9 +198,13 @@ class MangasNoSekai : Madara(
val document = response.asJsoup() val document = response.asJsoup()
launchIO { countViews(document) } launchIO { countViews(document) }
val mangaSlug = response.request.url.toString().substringAfter(baseUrl).removeSuffix("/")
val coreScript = document.selectFirst("script#wp-manga-js")!!.attr("abs:src") val coreScript = document.selectFirst("script#wp-manga-js")!!.attr("abs:src")
val coreScriptBody = client.newCall(GET(coreScript, headers)).execute().body.string() val coreScriptBody = client.newCall(GET(coreScript, headers)).execute().body.string()
val url = URL_REGEX.find(coreScriptBody)?.groupValues?.get(1)
?: throw Exception("No se pudo obtener la url del capítulo")
val data = DATA_REGEX.find(coreScriptBody)?.groupValues?.get(1)?.trim() val data = DATA_REGEX.find(coreScriptBody)?.groupValues?.get(1)?.trim()
?: throw Exception("No se pudo obtener la data del capítulo") ?: throw Exception("No se pudo obtener la data del capítulo")
@ -218,9 +224,13 @@ class MangasNoSekai : Madara(
val chapterElements = mutableListOf<Element>() val chapterElements = mutableListOf<Element>()
var page = 1 var page = 1
do { do {
val xhrRequest = altChapterRequest(mangaId, page, objects) val xhrRequest = altChapterRequest(url, mangaId, page, objects)
val xhrResponse = client.newCall(xhrRequest).execute() val xhrResponse = client.newCall(xhrRequest).execute()
val xhrDocument = xhrResponse.asJsoup() val xhrBody = xhrResponse.body.string()
if (xhrBody.startsWith("{")) {
return chaptersFromJson(xhrBody, mangaSlug)
}
val xhrDocument = Jsoup.parse(xhrBody)
chapterElements.addAll(xhrDocument.select(altChapterListSelector)) chapterElements.addAll(xhrDocument.select(altChapterListSelector))
page++ page++
} while (xhrDocument.select(altChapterListSelector).isNotEmpty()) } while (xhrDocument.select(altChapterListSelector).isNotEmpty())
@ -236,8 +246,14 @@ class MangasNoSekai : Madara(
} ?: 0 } ?: 0
} }
private fun chaptersFromJson(jsonString: String, mangaSlug: String): List<SChapter> {
val result = json.decodeFromString<PayloadDto>(jsonString)
return result.manga.first().chapters.map { it.toSChapter(mangaSlug) }
}
companion object { companion object {
val DATA_REGEX = """function\s+loadMoreChapters[\s\S]*?\$.ajax[\s\S]*?data:\s*\{([\s\S]*?)\},?""".toRegex() val DATA_REGEX = """function\s+loadMoreChapters[\s\S]*?\$.ajax[\s\S]*?data:\s*\{([\s\S]*?)\},?""".toRegex()
val URL_REGEX = """function\s+loadMoreChapters[\s\S]*?\$.ajax[\s\S]*?url:\s*'(.*?)'""".toRegex()
val DATA_OBJECTS_REGEX = """\s*(\w+)\s*:\s*(?:(?:'([^']*)'|([^,\r\n]+))\s*,?\s*)""".toRegex() val DATA_OBJECTS_REGEX = """\s*(\w+)\s*:\s*(?:(?:'([^']*)'|([^,\r\n]+))\s*,?\s*)""".toRegex()
val MANGA_ID_REGEX = """\"manga_id"\s*:\s*"(.*)\"""".toRegex() val MANGA_ID_REGEX = """\"manga_id"\s*:\s*"(.*)\"""".toRegex()
val POST_ID_REGEX = """\"postId"\s*:\s*"(.*)\"""".toRegex() val POST_ID_REGEX = """\"postId"\s*:\s*"(.*)\"""".toRegex()

View File

@ -0,0 +1,38 @@
package eu.kanade.tachiyomi.extension.es.mangasnosekai
import eu.kanade.tachiyomi.source.model.SChapter
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.Locale
@Serializable
data class PayloadDto(
val manga: List<MangaDto>,
)
@Serializable
data class MangaDto(
val chapters: List<ChapterDto>,
)
private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale("es"))
@Serializable
data class ChapterDto(
@SerialName("chapter_name") private val name: String,
@SerialName("chapter_slug") private val slug: String,
@SerialName("date_gmt") private val date: String,
) {
fun toSChapter(mangaSlug: String) = SChapter.create().apply {
name = this@ChapterDto.name
url = "$mangaSlug/$slug"
date_upload = try {
dateFormat.parse(date)?.time ?: 0
} catch (e: ParseException) {
0
}
}
}