[Manga4Life] Refactoring and fixes

pull/238/head
Koitharu 3 years ago
parent f08a2e4551
commit 06a2aa6f97
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -4,19 +4,21 @@ import okhttp3.Headers
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaParser
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.PagedMangaParser
import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.*
import org.koitharu.kotatsu.parsers.util.json.* import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
import org.koitharu.kotatsu.parsers.util.json.mapJSONIndexed
import org.koitharu.kotatsu.parsers.util.json.toJSONList
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.EnumSet import java.util.*
@MangaSourceParser("MANGA4LIFE", "Manga4Life", "en") @MangaSourceParser("MANGA4LIFE", "Manga4Life", "en")
internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGA4LIFE, 0) { internal class Manga4Life(context: MangaLoaderContext) : MangaParser(context, MangaSource.MANGA4LIFE) {
override val sortOrders: Set<SortOrder> = EnumSet.of(SortOrder.ALPHABETICAL) override val sortOrders: Set<SortOrder> = EnumSet.of(SortOrder.ALPHABETICAL)
@ -26,30 +28,19 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
.add("User-Agent", UserAgents.CHROME_DESKTOP) .add("User-Agent", UserAgents.CHROME_DESKTOP)
.build() .build()
override suspend fun getList(offset: Int, query: String?, tags: Set<MangaTag>?, sortOrder: SortOrder): List<Manga> {
override suspend fun getListPage( if (offset > 0) {
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
if (page > 1) {
return emptyList() return emptyList()
} }
val doc = webClient.httpGet("https://$domain/search/").parseHtml()
val url = buildString {
append("https://$domain/search/")
}
val doc = webClient.httpGet(url).parseHtml()
val json = JSONArray( val json = JSONArray(
doc.selectFirstOrThrow("script:containsData(MainFunction)").data() doc.selectFirstOrThrow("script:containsData(MainFunction)").data()
.substringAfter("vm.Directory = ").substringBefore("vm.GetIntValue").trim() .substringAfter("vm.Directory = ").substringBefore("vm.GetIntValue").trim()
.replace(";", " "), .replace(';', ' '),
) )
val manga = ArrayList<Manga>() val manga = ArrayList<Manga>(json.length())
for (i in 0 until json.length()) { for (i in 0 until json.length()) {
val m = json.getJSONObject(i) val m = json.getJSONObject(i)
@ -60,7 +51,7 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
manga.add( manga.add(
Manga( Manga(
id = generateUid(href), id = generateUid(href),
title = m.getString("i").replace("-", " "), title = m.getString("i").replace('-', ' '),
altTitle = null, altTitle = null,
url = href, url = href,
publicUrl = href.toAbsoluteUrl(domain), publicUrl = href.toAbsoluteUrl(domain),
@ -88,7 +79,7 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
manga.add( manga.add(
Manga( Manga(
id = generateUid(href), id = generateUid(href),
title = m.getString("i").replace("-", " "), title = m.getString("i").replace('-', ' '),
altTitle = null, altTitle = null,
url = href, url = href,
publicUrl = href.toAbsoluteUrl(domain), publicUrl = href.toAbsoluteUrl(domain),
@ -106,7 +97,7 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
manga.add( manga.add(
Manga( Manga(
id = generateUid(href), id = generateUid(href),
title = m.getString("i").replace("-", " "), title = m.getString("i").replace('-', ' '),
altTitle = null, altTitle = null,
url = href, url = href,
publicUrl = href.toAbsoluteUrl(domain), publicUrl = href.toAbsoluteUrl(domain),
@ -130,9 +121,12 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
override suspend fun getTags(): Set<MangaTag> { override suspend fun getTags(): Set<MangaTag> {
val doc = webClient.httpGet("https://$domain/search/").parseHtml() val doc = webClient.httpGet("https://$domain/search/").parseHtml()
val tags = doc.selectFirstOrThrow("script:containsData(vm.AvailableFilters)").data() val tags = doc.selectFirstOrThrow("script:containsData(vm.AvailableFilters)").data()
.substringAfter("\"Genre\" \t\t: [").substringBefore("]").replace("'", "").split(",") .substringAfter("\"Genre\" \t\t: [")
.substringBefore(']')
.replace("'", "")
.split(',')
return tags.mapNotNullToSet { tag -> return tags.mapToSet { tag ->
MangaTag( MangaTag(
key = tag, key = tag,
title = tag, title = tag,
@ -147,7 +141,7 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
val chapter = JSONArray( val chapter = JSONArray(
JSONArray( JSONArray(
doc.selectFirstOrThrow("script:containsData(MainFunction)").data() doc.selectFirstOrThrow("script:containsData(MainFunction)").data()
.substringAfter("vm.Chapters = ").substringBefore(";"), .substringAfter("vm.Chapters = ").substringBefore(';'),
).toJSONList().reversed(), ).toJSONList().reversed(),
) )
@ -167,7 +161,7 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
}, },
tags = doc.select(".list-group-item:contains(Genre(s):) a").mapNotNullToSet { a -> tags = doc.select(".list-group-item:contains(Genre(s):) a").mapNotNullToSet { a ->
MangaTag( MangaTag(
key = a.attr("href").substringAfterLast("="), key = a.attr("href").substringAfterLast('='),
title = a.text(), title = a.text(),
source = source, source = source,
) )
@ -178,7 +172,7 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
chapters = chapter.mapJSONIndexed { i, j -> chapters = chapter.mapJSONIndexed { i, j ->
val indexChapter = j.getString("Chapter")!! val indexChapter = j.getString("Chapter")!!
val url = "/read-online/" + manga.url.substringAfter("/manga/") + chapterURLEncode(indexChapter) val url = "/read-online/" + manga.url.substringAfter("/manga/") + chapterURLEncode(indexChapter)
val name = j.getString("ChapterName").let { val name = j.getStringOrNull("ChapterName").let {
if (it.isNullOrEmpty() || it == "null") "${j.getString("Type")} ${ if (it.isNullOrEmpty() || it == "null") "${j.getString("Type")} ${
chapterImage( chapterImage(
indexChapter, indexChapter,
@ -186,7 +180,7 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
) )
}" else it }" else it
} }
val date = j.getString("Date") val date = j.getStringOrNull("Date")
MangaChapter( MangaChapter(
id = generateUid(url), id = generateUid(url),
name = name, name = name,
@ -207,14 +201,12 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
if (1 != t) { if (1 != t) {
index = "-index-$t" index = "-index-$t"
} }
val dgt = if (e.toInt() < 100100) { val ei = e.toInt()
4 val dgt = when {
} else if (e.toInt() < 101000) { ei < 100100 -> 4
3 ei < 101000 -> 3
} else if (e.toInt() < 110000) { ei < 110000 -> 2
2 else -> 1
} else {
1
} }
val n = e.substring(dgt, e.length - 1) val n = e.substring(dgt, e.length - 1)
var suffix = "" var suffix = ""
@ -232,12 +224,10 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
val a = e.substring(1, e.length - 1).let { if (cleanString) it.replace(chapterImageRegex, "") else it } val a = e.substring(1, e.length - 1).let { if (cleanString) it.replace(chapterImageRegex, "") else it }
// If b is not zero, indicates chapter has decimal numbering // If b is not zero, indicates chapter has decimal numbering
val b = e.substring(e.length - 1).toInt() val b = e.substring(e.length - 1).toInt()
return if (b == 0 && a.isNotEmpty()) { return when {
a b == 0 && a.isNotEmpty() -> a
} else if (b == 0 && a.isEmpty()) { b == 0 && a.isEmpty() -> "0"
"0" else -> "$a.$b"
} else {
"$a.$b"
} }
} }
@ -246,19 +236,20 @@ internal class Manga4Life(context: MangaLoaderContext) : PagedMangaParser(contex
val doc = webClient.httpGet(fullUrl).parseHtml() val doc = webClient.httpGet(fullUrl).parseHtml()
val script = doc.selectFirstOrThrow("script:containsData(MainFunction)").data() val script = doc.selectFirstOrThrow("script:containsData(MainFunction)").data()
val curChapter = JSONObject( val curChapter = JSONObject(
doc.selectFirstOrThrow("script:containsData(MainFunction)").data().substringAfter("vm.CurChapter = ") doc.selectFirstOrThrow("script:containsData(MainFunction)").data()
.substringBefore(";"), .substringAfter("vm.CurChapter = ")
.substringBefore(';'),
) )
val pageTotal = curChapter.getString("Page")!!.toInt() val pageTotal = curChapter.getString("Page")!!.toInt()
val host = "https://" + val host = "https://" +
script script
.substringAfter("vm.CurPathName = \"", "") .substringAfter("vm.CurPathName = \"", "")
.substringBefore("\"") .substringBefore('"')
.also { .also {
if (it.isEmpty()) { if (it.isEmpty()) {
throw Exception("Manga4Life is overloaded and blocking Tachiyomi right now. Wait for unblock.") throw Exception("Manga4Life is overloaded and blocking Tachiyomi right now. Wait for unblock.")
}
} }
}
val titleURI = script.substringAfter("vm.IndexName = \"").substringBefore("\"") val titleURI = script.substringAfter("vm.IndexName = \"").substringBefore("\"")
val seasonURI = curChapter.getString("Directory")!! val seasonURI = curChapter.getString("Directory")!!
.let { if (it.isEmpty()) "" else "$it/" } .let { if (it.isEmpty()) "" else "$it/" }

Loading…
Cancel
Save