MangaPlus: divide different languages to avoid too many calls during chapter fetching & prevent some non-english titles to be filtered out

AwkwardPeak7 2 years ago
parent 33b96043c9
commit 3034a87929
No known key found for this signature in database

@ -1,8 +1,5 @@
package org.koitharu.kotatsu.parsers.site.all package org.koitharu.kotatsu.parsers.site.all
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor import okhttp3.Interceptor
@ -36,8 +33,11 @@ import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.parsers.util.toTitleCase
import java.util.UUID import java.util.UUID
@MangaSourceParser("MANGAPLUSPARSER", "MANGA Plus by SHUEISHA") internal abstract class MangaPlusParser(
class MangaPlusParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.MANGAPLUSPARSER), Interceptor { context: MangaLoaderContext,
source: MangaSource,
private val sourceLang: String
) : MangaParser(context, source), Interceptor {
override val configKeyDomain = ConfigKey.Domain("mangaplus.shueisha.co.jp") override val configKeyDomain = ConfigKey.Domain("mangaplus.shueisha.co.jp")
@ -103,9 +103,9 @@ class MangaPlusParser(context: MangaLoaderContext) : MangaParser(context, MangaS
private fun List<JSONObject>.toMangaList(query: String? = null): List<Manga> { private fun List<JSONObject>.toMangaList(query: String? = null): List<Manga> {
return mapNotNull { return mapNotNull {
val language = it.getStringOrNull("language") val language = it.getStringOrNull("language") ?: "ENGLISH"
if (language != null) if (language != sourceLang)
return@mapNotNull null return@mapNotNull null
val name = it.getString("name") val name = it.getString("name")
@ -159,7 +159,10 @@ class MangaPlusParser(context: MangaLoaderContext) : MangaParser(context, MangaS
?.takeIf { !completed } ?.takeIf { !completed }
?.let { append("<br><br>", it) } ?.let { append("<br><br>", it) }
}, },
chapters = getChapters(json), chapters = parseChapters(
json.getJSONArray("chapterListGroup"),
title.getStringOrNull("language") ?: "ENGLISH"
),
state = if (completed) { state = if (completed) {
MangaState.FINISHED MangaState.FINISHED
} else if (hiatus) { } else if (hiatus) {
@ -170,31 +173,6 @@ class MangaPlusParser(context: MangaLoaderContext) : MangaParser(context, MangaS
) )
} }
private suspend fun getChapters(titleDetailView: JSONObject): List<MangaChapter> {
val currentLang = titleDetailView.getJSONObject("title").getStringOrNull("language") ?: "ENGLISH"
val chapters = parseChapters(
titleDetailView.getJSONArray("chapterListGroup"),
currentLang
)
return chapters + coroutineScope {
titleDetailView.getJSONArray("titleLanguages")
.toJSONList()
.filterNot { (it.getStringOrNull("language") ?: "ENGLISH") == currentLang }
.map {
async {
val titleId = it.getInt("titleId").toString()
val language = it.getStringOrNull("language") ?: "ENGLISH"
val chapGroup = apiCall("/title_detailV3?title_id=$titleId")
.getJSONObject("titleDetailView")
.getJSONArray("chapterListGroup")
parseChapters(chapGroup, language)
}
}
}.awaitAll().flatten()
}
private fun parseChapters(chapterListGroup: JSONArray, language: String): List<MangaChapter> { private fun parseChapters(chapterListGroup: JSONArray, language: String): List<MangaChapter> {
val chapterList = chapterListGroup val chapterList = chapterListGroup
.toJSONList() .toJSONList()
@ -299,5 +277,60 @@ class MangaPlusParser(context: MangaLoaderContext) : MangaParser(context, MangaS
companion object { companion object {
private const val apiUrl = "https://jumpg-webapi.tokyo-cdn.com/api" private const val apiUrl = "https://jumpg-webapi.tokyo-cdn.com/api"
} }
}
@MangaSourceParser("MANGAPLUSPARSER_EN", "MANGA Plus English", "en")
class English(context: MangaLoaderContext) : MangaPlusParser(
context,
MangaSource.MANGAPLUSPARSER_EN,
"ENGLISH"
)
@MangaSourceParser("MANGAPLUSPARSER_ES", "MANGA Plus Spanish", "es")
class Spanish(context: MangaLoaderContext) : MangaPlusParser(
context,
MangaSource.MANGAPLUSPARSER_ES,
"SPANISH"
)
@MangaSourceParser("MANGAPLUSPARSER_FR", "MANGA Plus French", "fr")
class French(context: MangaLoaderContext) : MangaPlusParser(
context,
MangaSource.MANGAPLUSPARSER_FR,
"FRENCH"
)
@MangaSourceParser("MANGAPLUSPARSER_ID", "MANGA Plus Indonesian", "id")
class Indonesian(context: MangaLoaderContext) : MangaPlusParser(
context,
MangaSource.MANGAPLUSPARSER_ID,
"INDONESIAN"
)
@MangaSourceParser("MANGAPLUSPARSER_PTBR", "MANGA Plus Portuguese (Brazil)", "pt")
class Portuguese(context: MangaLoaderContext) : MangaPlusParser(
context,
MangaSource.MANGAPLUSPARSER_PTBR,
"PORTUGUESE_BR"
)
@MangaSourceParser("MANGAPLUSPARSER_RU", "MANGA Plus Russian", "ru")
class Russian(context: MangaLoaderContext) : MangaPlusParser(
context,
MangaSource.MANGAPLUSPARSER_RU,
"RUSSIAN"
)
@MangaSourceParser("MANGAPLUSPARSER_TH", "MANGA Plus Thai", "th")
class Thai(context: MangaLoaderContext) : MangaPlusParser(
context,
MangaSource.MANGAPLUSPARSER_TH,
"THAI"
)
@MangaSourceParser("MANGAPLUSPARSER_VI", "MANGA Plus Vietnamese", "vi")
class Vietnamese(context: MangaLoaderContext) : MangaPlusParser(
context,
MangaSource.MANGAPLUSPARSER_VI,
"VIETNAMESE"
)
}

Loading…
Cancel
Save