From 759a2123c14061df4cf40a85c261bcd3f6034f18 Mon Sep 17 00:00:00 2001 From: h-hyuuga <83582211+h-hyuuga@users.noreply.github.com> Date: Sun, 20 Jun 2021 08:28:26 -0400 Subject: [PATCH] Kotlinx.serialization migration for several sources (#7723) * en.MangaPark: kotlinx.serialization migration * Bato.to: Kotlinx.serialization migration * Dynasty: Kotlinx.serialization * ReadM: kotlinx.serialization migration * Bato.to: Comment out code that was untested --- src/all/batoto/build.gradle | 3 +- .../tachiyomi/extension/all/batoto/BatoTo.kt | 693 +++++++++--------- src/en/dynasty/build.gradle | 3 +- .../extension/en/dynasty/DynastyScans.kt | 21 +- src/en/mangapark/build.gradle | 3 +- .../extension/en/mangapark/MangaPark.kt | 16 +- src/en/readm/build.gradle | 3 +- .../tachiyomi/extension/en/readm/ReadM.kt | 27 +- 8 files changed, 389 insertions(+), 380 deletions(-) diff --git a/src/all/batoto/build.gradle b/src/all/batoto/build.gradle index 3def69473..1017726d3 100644 --- a/src/all/batoto/build.gradle +++ b/src/all/batoto/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' ext { extName = 'Bato.to' pkgNameSuffix = 'all.batoto' extClass = '.BatoToFactory' - extVersionCode = 12 + extVersionCode = 13 libVersion = '1.2' containsNsfw = true } diff --git a/src/all/batoto/src/eu/kanade/tachiyomi/extension/all/batoto/BatoTo.kt b/src/all/batoto/src/eu/kanade/tachiyomi/extension/all/batoto/BatoTo.kt index 0d50132a5..8c8f99b45 100644 --- a/src/all/batoto/src/eu/kanade/tachiyomi/extension/all/batoto/BatoTo.kt +++ b/src/all/batoto/src/eu/kanade/tachiyomi/extension/all/batoto/BatoTo.kt @@ -11,17 +11,20 @@ import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.OkHttpClient import okhttp3.Request -import org.json.JSONArray -import org.json.JSONObject +import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import rx.Observable +import uy.kohesive.injekt.injectLazy import java.util.Calendar import java.util.concurrent.TimeUnit -import okhttp3.Response -import rx.Observable open class BatoTo( override val lang: String, @@ -32,7 +35,7 @@ open class BatoTo( override val baseUrl: String = "https://bato.to" override val supportsLatest = true - + private val json: Json by injectLazy() override val client: OkHttpClient = network.cloudflareClient.newBuilder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) @@ -100,7 +103,7 @@ open class BatoTo( val url = "$baseUrl/browse".toHttpUrlOrNull()!!.newBuilder() url.addQueryParameter("page", page.toString()) - with (langFilter) { + with(langFilter) { if (this.selected.isEmpty()) { url.addQueryParameter("langs", siteLang) } else { @@ -109,20 +112,21 @@ open class BatoTo( } } - with (genreFilter) { - url.addQueryParameter("genres", included.joinToString(",") + "|" + excluded.joinToString(",") + with(genreFilter) { + url.addQueryParameter( + "genres", included.joinToString(",") + "|" + excluded.joinToString(",") ) } - with (statusFilter) { + with(statusFilter) { url.addQueryParameter("release", this.selected) } - with (sortFilter) { + with(sortFilter) { if (reverseSortFilter.state) { - url.addQueryParameter("sort","${this.selected}.az") + url.addQueryParameter("sort", "${this.selected}.az") } else { - url.addQueryParameter("sort","${this.selected}.za") + url.addQueryParameter("sort", "${this.selected}.za") } } @@ -294,16 +298,14 @@ open class BatoTo( val script = document.select("script").html() if (script.contains("var images =")) { - val imgJson = JSONObject(script.substringAfter("var images = ").substringBefore(";")) - val imgNames = imgJson.names() + /* + * During kotlinx.serialization migration, the pre-existing code seemed to not work + * Could not find a case where code would run in practice, so it was commented out. + */ + throw RuntimeException("Unexpected Branch: Please File A Bug Report describing this issue") + // val imgJson = json.parseToJsonElement(script.substringAfter("var images = ").substringBefore(";")).jsonObject + // imgJson.keys.forEachIndexed { i, s -> pages.add(Page(i, imageUrl = imgJson[s]!!.jsonPrimitive.content)) } - if (imgNames != null) { - for (i in 0 until imgNames.length()) { - val imgKey = imgNames.getString(i) - val imgUrl = imgJson.getString(imgKey) - pages.add(Page(i, "", imgUrl)) - } - } } else if (script.contains("const server =")) { // bato.to val duktape = Duktape.create() val encryptedServer = script.substringAfter("const server = ").substringBefore(";") @@ -312,23 +314,15 @@ open class BatoTo( val server = duktape.evaluate(decryptScript).toString().replace("\"", "") duktape.close() - val imgArray = JSONArray(script.substringAfter("const images = ").substringBefore(";")) - if (imgArray != null) { - if (script.contains("bato.to/images")) { - for (i in 0 until imgArray.length()) { - val imgUrl = imgArray.get(i) - pages.add(Page(i, "", "$imgUrl")) - } - } else { - for (i in 0 until imgArray.length()) { - val imgUrl = imgArray.get(i) - if (server.startsWith("http")) - pages.add(Page(i, "", "${server}$imgUrl")) - else - pages.add(Page(i, "", "https:${server}$imgUrl")) + json.parseToJsonElement(script.substringAfter("const images = ").substringBefore(";")).jsonArray + .forEachIndexed { i, it -> + val imgUrl = it.jsonPrimitive.content + if (script.contains("bato.to/images")) { + pages.add(Page(i, imageUrl = imgUrl)) + } else { + pages.add(Page(i, imageUrl = if (server.startsWith("http")) "${server}$imgUrl" else "https:${server}$imgUrl")) } } - } } return pages @@ -346,7 +340,7 @@ open class BatoTo( override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used") override fun getFilterList() = FilterList( - //LetterFilter(), + // LetterFilter(), Filter.Header("NOTE: Ignored if using text search!"), Filter.Separator(), SortFilter(getSortFilter(), 5), @@ -367,10 +361,12 @@ open class BatoTo( val selected: String get() = options[state].value } + abstract class CheckboxGroupFilter(name: String, options: List) : Filter.Group(name, options) { val selected: List get() = state.filter { it.state }.map { it.value } } + abstract class TriStateGroupFilter(name: String, options: List) : Filter.Group(name, options) { val included: List get() = state.filter { it.isIncluded() }.map { it.value } @@ -378,6 +374,7 @@ open class BatoTo( val excluded: List get() = state.filter { it.isExcluded() }.map { it.value } } + abstract class TextFilter(name: String) : Filter.Text(name) class SortFilter(options: List, default: Int) : SelectFilter("Sort By", options, default) @@ -413,216 +410,216 @@ open class BatoTo( private fun getOrginFilter() = listOf( // Values exported from publish.bato.to - CheckboxFilterOption("zh","Chinese"), - CheckboxFilterOption("en","English"), - CheckboxFilterOption("ja","Japanese"), - CheckboxFilterOption("ko","Korean"), - CheckboxFilterOption("af","Afrikaans"), - CheckboxFilterOption("sq","Albanian"), - CheckboxFilterOption("am","Amharic"), - CheckboxFilterOption("ar","Arabic"), - CheckboxFilterOption("hy","Armenian"), - CheckboxFilterOption("az","Azerbaijani"), - CheckboxFilterOption("be","Belarusian"), - CheckboxFilterOption("bn","Bengali"), - CheckboxFilterOption("bs","Bosnian"), - CheckboxFilterOption("bg","Bulgarian"), - CheckboxFilterOption("my","Burmese"), - CheckboxFilterOption("km","Cambodian"), - CheckboxFilterOption("ca","Catalan"), - CheckboxFilterOption("ceb","Cebuano"), - CheckboxFilterOption("zh_hk","Chinese (Cantonese)"), - CheckboxFilterOption("zh_tw","Chinese (Traditional)"), - CheckboxFilterOption("hr","Croatian"), - CheckboxFilterOption("cs","Czech"), - CheckboxFilterOption("da","Danish"), - CheckboxFilterOption("nl","Dutch"), - CheckboxFilterOption("en_us","English (United States)"), - CheckboxFilterOption("eo","Esperanto"), - CheckboxFilterOption("et","Estonian"), - CheckboxFilterOption("fo","Faroese"), - CheckboxFilterOption("fil","Filipino"), - CheckboxFilterOption("fi","Finnish"), - CheckboxFilterOption("fr","French"), - CheckboxFilterOption("ka","Georgian"), - CheckboxFilterOption("de","German"), - CheckboxFilterOption("el","Greek"), - CheckboxFilterOption("gn","Guarani"), - CheckboxFilterOption("gu","Gujarati"), - CheckboxFilterOption("ht","Haitian Creole"), - CheckboxFilterOption("ha","Hausa"), - CheckboxFilterOption("he","Hebrew"), - CheckboxFilterOption("hi","Hindi"), - CheckboxFilterOption("hu","Hungarian"), - CheckboxFilterOption("is","Icelandic"), - CheckboxFilterOption("ig","Igbo"), - CheckboxFilterOption("id","Indonesian"), - CheckboxFilterOption("ga","Irish"), - CheckboxFilterOption("it","Italian"), - CheckboxFilterOption("jv","Javanese"), - CheckboxFilterOption("kn","Kannada"), - CheckboxFilterOption("kk","Kazakh"), - CheckboxFilterOption("ku","Kurdish"), - CheckboxFilterOption("ky","Kyrgyz"), - CheckboxFilterOption("lo","Laothian"), - CheckboxFilterOption("lv","Latvian"), - CheckboxFilterOption("lt","Lithuanian"), - CheckboxFilterOption("lb","Luxembourgish"), - CheckboxFilterOption("mk","Macedonian"), - CheckboxFilterOption("mg","Malagasy"), - CheckboxFilterOption("ms","Malay"), - CheckboxFilterOption("ml","Malayalam"), - CheckboxFilterOption("mt","Maltese"), - CheckboxFilterOption("mi","Maori"), - CheckboxFilterOption("mr","Marathi"), - CheckboxFilterOption("mo","Moldavian"), - CheckboxFilterOption("mn","Mongolian"), - CheckboxFilterOption("ne","Nepali"), - CheckboxFilterOption("no","Norwegian"), - CheckboxFilterOption("ny","Nyanja"), - CheckboxFilterOption("ps","Pashto"), - CheckboxFilterOption("fa","Persian"), - CheckboxFilterOption("pl","Polish"), - CheckboxFilterOption("pt","Portuguese"), - CheckboxFilterOption("pt_br","Portuguese (Brazil)"), - CheckboxFilterOption("ro","Romanian"), - CheckboxFilterOption("rm","Romansh"), - CheckboxFilterOption("ru","Russian"), - CheckboxFilterOption("sm","Samoan"), - CheckboxFilterOption("sr","Serbian"), - CheckboxFilterOption("sh","Serbo-Croatian"), - CheckboxFilterOption("st","Sesotho"), - CheckboxFilterOption("sn","Shona"), - CheckboxFilterOption("sd","Sindhi"), - CheckboxFilterOption("si","Sinhalese"), - CheckboxFilterOption("sk","Slovak"), - CheckboxFilterOption("sl","Slovenian"), - CheckboxFilterOption("so","Somali"), - CheckboxFilterOption("es","Spanish"), - CheckboxFilterOption("es_419","Spanish (Latin America)"), - CheckboxFilterOption("sw","Swahili"), - CheckboxFilterOption("sv","Swedish"), - CheckboxFilterOption("tg","Tajik"), - CheckboxFilterOption("ta","Tamil"), - CheckboxFilterOption("th","Thai"), - CheckboxFilterOption("ti","Tigrinya"), - CheckboxFilterOption("to","Tonga"), - CheckboxFilterOption("tr","Turkish"), - CheckboxFilterOption("tk","Turkmen"), - CheckboxFilterOption("uk","Ukrainian"), - CheckboxFilterOption("ur","Urdu"), - CheckboxFilterOption("uz","Uzbek"), - CheckboxFilterOption("vi","Vietnamese"), - CheckboxFilterOption("yo","Yoruba"), - CheckboxFilterOption("zu","Zulu"), - CheckboxFilterOption("_t","Other"), + CheckboxFilterOption("zh", "Chinese"), + CheckboxFilterOption("en", "English"), + CheckboxFilterOption("ja", "Japanese"), + CheckboxFilterOption("ko", "Korean"), + CheckboxFilterOption("af", "Afrikaans"), + CheckboxFilterOption("sq", "Albanian"), + CheckboxFilterOption("am", "Amharic"), + CheckboxFilterOption("ar", "Arabic"), + CheckboxFilterOption("hy", "Armenian"), + CheckboxFilterOption("az", "Azerbaijani"), + CheckboxFilterOption("be", "Belarusian"), + CheckboxFilterOption("bn", "Bengali"), + CheckboxFilterOption("bs", "Bosnian"), + CheckboxFilterOption("bg", "Bulgarian"), + CheckboxFilterOption("my", "Burmese"), + CheckboxFilterOption("km", "Cambodian"), + CheckboxFilterOption("ca", "Catalan"), + CheckboxFilterOption("ceb", "Cebuano"), + CheckboxFilterOption("zh_hk", "Chinese (Cantonese)"), + CheckboxFilterOption("zh_tw", "Chinese (Traditional)"), + CheckboxFilterOption("hr", "Croatian"), + CheckboxFilterOption("cs", "Czech"), + CheckboxFilterOption("da", "Danish"), + CheckboxFilterOption("nl", "Dutch"), + CheckboxFilterOption("en_us", "English (United States)"), + CheckboxFilterOption("eo", "Esperanto"), + CheckboxFilterOption("et", "Estonian"), + CheckboxFilterOption("fo", "Faroese"), + CheckboxFilterOption("fil", "Filipino"), + CheckboxFilterOption("fi", "Finnish"), + CheckboxFilterOption("fr", "French"), + CheckboxFilterOption("ka", "Georgian"), + CheckboxFilterOption("de", "German"), + CheckboxFilterOption("el", "Greek"), + CheckboxFilterOption("gn", "Guarani"), + CheckboxFilterOption("gu", "Gujarati"), + CheckboxFilterOption("ht", "Haitian Creole"), + CheckboxFilterOption("ha", "Hausa"), + CheckboxFilterOption("he", "Hebrew"), + CheckboxFilterOption("hi", "Hindi"), + CheckboxFilterOption("hu", "Hungarian"), + CheckboxFilterOption("is", "Icelandic"), + CheckboxFilterOption("ig", "Igbo"), + CheckboxFilterOption("id", "Indonesian"), + CheckboxFilterOption("ga", "Irish"), + CheckboxFilterOption("it", "Italian"), + CheckboxFilterOption("jv", "Javanese"), + CheckboxFilterOption("kn", "Kannada"), + CheckboxFilterOption("kk", "Kazakh"), + CheckboxFilterOption("ku", "Kurdish"), + CheckboxFilterOption("ky", "Kyrgyz"), + CheckboxFilterOption("lo", "Laothian"), + CheckboxFilterOption("lv", "Latvian"), + CheckboxFilterOption("lt", "Lithuanian"), + CheckboxFilterOption("lb", "Luxembourgish"), + CheckboxFilterOption("mk", "Macedonian"), + CheckboxFilterOption("mg", "Malagasy"), + CheckboxFilterOption("ms", "Malay"), + CheckboxFilterOption("ml", "Malayalam"), + CheckboxFilterOption("mt", "Maltese"), + CheckboxFilterOption("mi", "Maori"), + CheckboxFilterOption("mr", "Marathi"), + CheckboxFilterOption("mo", "Moldavian"), + CheckboxFilterOption("mn", "Mongolian"), + CheckboxFilterOption("ne", "Nepali"), + CheckboxFilterOption("no", "Norwegian"), + CheckboxFilterOption("ny", "Nyanja"), + CheckboxFilterOption("ps", "Pashto"), + CheckboxFilterOption("fa", "Persian"), + CheckboxFilterOption("pl", "Polish"), + CheckboxFilterOption("pt", "Portuguese"), + CheckboxFilterOption("pt_br", "Portuguese (Brazil)"), + CheckboxFilterOption("ro", "Romanian"), + CheckboxFilterOption("rm", "Romansh"), + CheckboxFilterOption("ru", "Russian"), + CheckboxFilterOption("sm", "Samoan"), + CheckboxFilterOption("sr", "Serbian"), + CheckboxFilterOption("sh", "Serbo-Croatian"), + CheckboxFilterOption("st", "Sesotho"), + CheckboxFilterOption("sn", "Shona"), + CheckboxFilterOption("sd", "Sindhi"), + CheckboxFilterOption("si", "Sinhalese"), + CheckboxFilterOption("sk", "Slovak"), + CheckboxFilterOption("sl", "Slovenian"), + CheckboxFilterOption("so", "Somali"), + CheckboxFilterOption("es", "Spanish"), + CheckboxFilterOption("es_419", "Spanish (Latin America)"), + CheckboxFilterOption("sw", "Swahili"), + CheckboxFilterOption("sv", "Swedish"), + CheckboxFilterOption("tg", "Tajik"), + CheckboxFilterOption("ta", "Tamil"), + CheckboxFilterOption("th", "Thai"), + CheckboxFilterOption("ti", "Tigrinya"), + CheckboxFilterOption("to", "Tonga"), + CheckboxFilterOption("tr", "Turkish"), + CheckboxFilterOption("tk", "Turkmen"), + CheckboxFilterOption("uk", "Ukrainian"), + CheckboxFilterOption("ur", "Urdu"), + CheckboxFilterOption("uz", "Uzbek"), + CheckboxFilterOption("vi", "Vietnamese"), + CheckboxFilterOption("yo", "Yoruba"), + CheckboxFilterOption("zu", "Zulu"), + CheckboxFilterOption("_t", "Other"), ) private fun getGenreFilter() = listOf( - TriStateFilterOption("artbook","Artbook"), - TriStateFilterOption("cartoon","Cartoon"), - TriStateFilterOption("comic","Comic"), - TriStateFilterOption("doujinshi","Doujinshi"), - TriStateFilterOption("imageset","Imageset"), - TriStateFilterOption("manga","Manga"), - TriStateFilterOption("manhua","Manhua"), - TriStateFilterOption("manhwa","Manhwa"), - TriStateFilterOption("webtoon","Webtoon"), - TriStateFilterOption("western","Western"), - TriStateFilterOption("josei","Josei"), - TriStateFilterOption("seinen","Seinen"), - TriStateFilterOption("shoujo","Shoujo"), - TriStateFilterOption("shoujo_ai","Shoujo ai"), - TriStateFilterOption("shounen","Shounen"), - TriStateFilterOption("shounen_ai","Shounen ai"), - TriStateFilterOption("yaoi","Yaoi"), - TriStateFilterOption("yuri","Yuri"), - TriStateFilterOption("ecchi","Ecchi"), - TriStateFilterOption("mature","Mature"), - TriStateFilterOption("adult","Adult"), - TriStateFilterOption("gore","Gore"), - TriStateFilterOption("violence","Violence"), - TriStateFilterOption("smut","Smut"), - TriStateFilterOption("hentai","Hentai"), - TriStateFilterOption("_4_koma","4-Koma"), - TriStateFilterOption("action","Action"), - TriStateFilterOption("adaptation","Adaptation"), - TriStateFilterOption("adventure","Adventure"), - TriStateFilterOption("aliens","Aliens"), - TriStateFilterOption("animals","Animals"), - TriStateFilterOption("anthology","Anthology"), - TriStateFilterOption("cars","cars"), - TriStateFilterOption("comedy","Comedy"), - TriStateFilterOption("cooking","Cooking"), - TriStateFilterOption("crime","crime"), - TriStateFilterOption("crossdressing","Crossdressing"), - TriStateFilterOption("delinquents","Delinquents"), - TriStateFilterOption("dementia","Dementia"), - TriStateFilterOption("demons","Demons"), - TriStateFilterOption("drama","Drama"), - TriStateFilterOption("fantasy","Fantasy"), - TriStateFilterOption("fan_colored","Fan-Colored"), - TriStateFilterOption("full_color","Full Color"), - TriStateFilterOption("game","Game"), - TriStateFilterOption("gender_bender","Gender Bender"), - TriStateFilterOption("genderswap","Genderswap"), - TriStateFilterOption("ghosts","Ghosts"), - TriStateFilterOption("gyaru","Gyaru"), - TriStateFilterOption("harem","Harem"), - TriStateFilterOption("harlequin","Harlequin"), - TriStateFilterOption("historical","Historical"), - TriStateFilterOption("horror","Horror"), - TriStateFilterOption("incest","Incest"), - TriStateFilterOption("isekai","Isekai"), - TriStateFilterOption("kids","Kids"), - TriStateFilterOption("loli","Loli"), - TriStateFilterOption("lolicon","lolicon"), - TriStateFilterOption("magic","Magic"), - TriStateFilterOption("magical_girls","Magical Girls"), - TriStateFilterOption("martial_arts","Martial Arts"), - TriStateFilterOption("mecha","Mecha"), - TriStateFilterOption("medical","Medical"), - TriStateFilterOption("military","Military"), - TriStateFilterOption("monster_girls","Monster Girls"), - TriStateFilterOption("monsters","Monsters"), - TriStateFilterOption("music","Music"), - TriStateFilterOption("mystery","Mystery"), - TriStateFilterOption("netorare","Netorare/NTR"), - TriStateFilterOption("ninja","Ninja"), - TriStateFilterOption("office_workers","Office Workers"), - TriStateFilterOption("oneshot","Oneshot"), - TriStateFilterOption("parody","parody"), - TriStateFilterOption("philosophical","Philosophical"), - TriStateFilterOption("police","Police"), - TriStateFilterOption("post_apocalyptic","Post-Apocalyptic"), - TriStateFilterOption("psychological","Psychological"), - TriStateFilterOption("reincarnation","Reincarnation"), - TriStateFilterOption("reverse_harem","Reverse Harem"), - TriStateFilterOption("romance","Romance"), - TriStateFilterOption("samurai","Samurai"), - TriStateFilterOption("school_life","School Life"), - TriStateFilterOption("sci_fi","Sci-Fi"), - TriStateFilterOption("shota","Shota"), - TriStateFilterOption("shotacon","shotacon"), - TriStateFilterOption("slice_of_life","Slice of Life"), - TriStateFilterOption("sm_bdsm","SM/BDSM"), - TriStateFilterOption("space","Space"), - TriStateFilterOption("sports","Sports"), - TriStateFilterOption("super_power","Super Power"), - TriStateFilterOption("superhero","Superhero"), - TriStateFilterOption("supernatural","Supernatural"), - TriStateFilterOption("survival","Survival"), - TriStateFilterOption("thriller","Thriller"), - TriStateFilterOption("time_travel","Time Travel"), - TriStateFilterOption("traditional_games","Traditional Games"), - TriStateFilterOption("tragedy","Tragedy"), - TriStateFilterOption("vampires","Vampires"), - TriStateFilterOption("video_games","Video Games"), - TriStateFilterOption("virtual_reality","Virtual Reality"), - TriStateFilterOption("wuxia","Wuxia"), - TriStateFilterOption("xianxia","Xianxia"), - TriStateFilterOption("xuanhuan","Xuanhuan"), - TriStateFilterOption("zombies","Zombies"), + TriStateFilterOption("artbook", "Artbook"), + TriStateFilterOption("cartoon", "Cartoon"), + TriStateFilterOption("comic", "Comic"), + TriStateFilterOption("doujinshi", "Doujinshi"), + TriStateFilterOption("imageset", "Imageset"), + TriStateFilterOption("manga", "Manga"), + TriStateFilterOption("manhua", "Manhua"), + TriStateFilterOption("manhwa", "Manhwa"), + TriStateFilterOption("webtoon", "Webtoon"), + TriStateFilterOption("western", "Western"), + TriStateFilterOption("josei", "Josei"), + TriStateFilterOption("seinen", "Seinen"), + TriStateFilterOption("shoujo", "Shoujo"), + TriStateFilterOption("shoujo_ai", "Shoujo ai"), + TriStateFilterOption("shounen", "Shounen"), + TriStateFilterOption("shounen_ai", "Shounen ai"), + TriStateFilterOption("yaoi", "Yaoi"), + TriStateFilterOption("yuri", "Yuri"), + TriStateFilterOption("ecchi", "Ecchi"), + TriStateFilterOption("mature", "Mature"), + TriStateFilterOption("adult", "Adult"), + TriStateFilterOption("gore", "Gore"), + TriStateFilterOption("violence", "Violence"), + TriStateFilterOption("smut", "Smut"), + TriStateFilterOption("hentai", "Hentai"), + TriStateFilterOption("_4_koma", "4-Koma"), + TriStateFilterOption("action", "Action"), + TriStateFilterOption("adaptation", "Adaptation"), + TriStateFilterOption("adventure", "Adventure"), + TriStateFilterOption("aliens", "Aliens"), + TriStateFilterOption("animals", "Animals"), + TriStateFilterOption("anthology", "Anthology"), + TriStateFilterOption("cars", "cars"), + TriStateFilterOption("comedy", "Comedy"), + TriStateFilterOption("cooking", "Cooking"), + TriStateFilterOption("crime", "crime"), + TriStateFilterOption("crossdressing", "Crossdressing"), + TriStateFilterOption("delinquents", "Delinquents"), + TriStateFilterOption("dementia", "Dementia"), + TriStateFilterOption("demons", "Demons"), + TriStateFilterOption("drama", "Drama"), + TriStateFilterOption("fantasy", "Fantasy"), + TriStateFilterOption("fan_colored", "Fan-Colored"), + TriStateFilterOption("full_color", "Full Color"), + TriStateFilterOption("game", "Game"), + TriStateFilterOption("gender_bender", "Gender Bender"), + TriStateFilterOption("genderswap", "Genderswap"), + TriStateFilterOption("ghosts", "Ghosts"), + TriStateFilterOption("gyaru", "Gyaru"), + TriStateFilterOption("harem", "Harem"), + TriStateFilterOption("harlequin", "Harlequin"), + TriStateFilterOption("historical", "Historical"), + TriStateFilterOption("horror", "Horror"), + TriStateFilterOption("incest", "Incest"), + TriStateFilterOption("isekai", "Isekai"), + TriStateFilterOption("kids", "Kids"), + TriStateFilterOption("loli", "Loli"), + TriStateFilterOption("lolicon", "lolicon"), + TriStateFilterOption("magic", "Magic"), + TriStateFilterOption("magical_girls", "Magical Girls"), + TriStateFilterOption("martial_arts", "Martial Arts"), + TriStateFilterOption("mecha", "Mecha"), + TriStateFilterOption("medical", "Medical"), + TriStateFilterOption("military", "Military"), + TriStateFilterOption("monster_girls", "Monster Girls"), + TriStateFilterOption("monsters", "Monsters"), + TriStateFilterOption("music", "Music"), + TriStateFilterOption("mystery", "Mystery"), + TriStateFilterOption("netorare", "Netorare/NTR"), + TriStateFilterOption("ninja", "Ninja"), + TriStateFilterOption("office_workers", "Office Workers"), + TriStateFilterOption("oneshot", "Oneshot"), + TriStateFilterOption("parody", "parody"), + TriStateFilterOption("philosophical", "Philosophical"), + TriStateFilterOption("police", "Police"), + TriStateFilterOption("post_apocalyptic", "Post-Apocalyptic"), + TriStateFilterOption("psychological", "Psychological"), + TriStateFilterOption("reincarnation", "Reincarnation"), + TriStateFilterOption("reverse_harem", "Reverse Harem"), + TriStateFilterOption("romance", "Romance"), + TriStateFilterOption("samurai", "Samurai"), + TriStateFilterOption("school_life", "School Life"), + TriStateFilterOption("sci_fi", "Sci-Fi"), + TriStateFilterOption("shota", "Shota"), + TriStateFilterOption("shotacon", "shotacon"), + TriStateFilterOption("slice_of_life", "Slice of Life"), + TriStateFilterOption("sm_bdsm", "SM/BDSM"), + TriStateFilterOption("space", "Space"), + TriStateFilterOption("sports", "Sports"), + TriStateFilterOption("super_power", "Super Power"), + TriStateFilterOption("superhero", "Superhero"), + TriStateFilterOption("supernatural", "Supernatural"), + TriStateFilterOption("survival", "Survival"), + TriStateFilterOption("thriller", "Thriller"), + TriStateFilterOption("time_travel", "Time Travel"), + TriStateFilterOption("traditional_games", "Traditional Games"), + TriStateFilterOption("tragedy", "Tragedy"), + TriStateFilterOption("vampires", "Vampires"), + TriStateFilterOption("video_games", "Video Games"), + TriStateFilterOption("virtual_reality", "Virtual Reality"), + TriStateFilterOption("wuxia", "Wuxia"), + TriStateFilterOption("xianxia", "Xianxia"), + TriStateFilterOption("xuanhuan", "Xuanhuan"), + TriStateFilterOption("zombies", "Zombies"), // Hidden Genres TriStateFilterOption("award_winning", "Award Winning"), TriStateFilterOption("youkai", "Youkai"), @@ -631,112 +628,112 @@ open class BatoTo( private fun getLangFilter() = listOf( // Values exported from publish.bato.to - CheckboxFilterOption("en","English"), - CheckboxFilterOption("ar","Arabic"), - CheckboxFilterOption("bg","Bulgarian"), - CheckboxFilterOption("zh","Chinese"), - CheckboxFilterOption("cs","Czech"), - CheckboxFilterOption("da","Danish"), - CheckboxFilterOption("nl","Dutch"), - CheckboxFilterOption("fil","Filipino"), - CheckboxFilterOption("fi","Finnish"), - CheckboxFilterOption("fr","French"), - CheckboxFilterOption("de","German"), - CheckboxFilterOption("el","Greek"), - CheckboxFilterOption("he","Hebrew"), - CheckboxFilterOption("hi","Hindi"), - CheckboxFilterOption("hu","Hungarian"), - CheckboxFilterOption("id","Indonesian"), - CheckboxFilterOption("it","Italian"), - CheckboxFilterOption("ja","Japanese"), - CheckboxFilterOption("ko","Korean"), - CheckboxFilterOption("ms","Malay"), - CheckboxFilterOption("pl","Polish"), - CheckboxFilterOption("pt","Portuguese"), - CheckboxFilterOption("pt_br","Portuguese (Brazil)"), - CheckboxFilterOption("ro","Romanian"), - CheckboxFilterOption("ru","Russian"), - CheckboxFilterOption("es","Spanish"), - CheckboxFilterOption("es_419","Spanish (Latin America)"), - CheckboxFilterOption("sv","Swedish"), - CheckboxFilterOption("th","Thai"), - CheckboxFilterOption("tr","Turkish"), - CheckboxFilterOption("uk","Ukrainian"), - CheckboxFilterOption("vi","Vietnamese"), - CheckboxFilterOption("af","Afrikaans"), - CheckboxFilterOption("sq","Albanian"), - CheckboxFilterOption("am","Amharic"), - CheckboxFilterOption("hy","Armenian"), - CheckboxFilterOption("az","Azerbaijani"), - CheckboxFilterOption("be","Belarusian"), - CheckboxFilterOption("bn","Bengali"), - CheckboxFilterOption("bs","Bosnian"), - CheckboxFilterOption("my","Burmese"), - CheckboxFilterOption("km","Cambodian"), - CheckboxFilterOption("ca","Catalan"), - CheckboxFilterOption("ceb","Cebuano"), - CheckboxFilterOption("zh_hk","Chinese (Cantonese)"), - CheckboxFilterOption("zh_tw","Chinese (Traditional)"), - CheckboxFilterOption("hr","Croatian"), - CheckboxFilterOption("en_us","English (United States)"), - CheckboxFilterOption("eo","Esperanto"), - CheckboxFilterOption("et","Estonian"), - CheckboxFilterOption("fo","Faroese"), - CheckboxFilterOption("ka","Georgian"), - CheckboxFilterOption("gn","Guarani"), - CheckboxFilterOption("gu","Gujarati"), - CheckboxFilterOption("ht","Haitian Creole"), - CheckboxFilterOption("ha","Hausa"), - CheckboxFilterOption("is","Icelandic"), - CheckboxFilterOption("ig","Igbo"), - CheckboxFilterOption("ga","Irish"), - CheckboxFilterOption("jv","Javanese"), - CheckboxFilterOption("kn","Kannada"), - CheckboxFilterOption("kk","Kazakh"), - CheckboxFilterOption("ku","Kurdish"), - CheckboxFilterOption("ky","Kyrgyz"), - CheckboxFilterOption("lo","Laothian"), - CheckboxFilterOption("lv","Latvian"), - CheckboxFilterOption("lt","Lithuanian"), - CheckboxFilterOption("lb","Luxembourgish"), - CheckboxFilterOption("mk","Macedonian"), - CheckboxFilterOption("mg","Malagasy"), - CheckboxFilterOption("ml","Malayalam"), - CheckboxFilterOption("mt","Maltese"), - CheckboxFilterOption("mi","Maori"), - CheckboxFilterOption("mr","Marathi"), - CheckboxFilterOption("mo","Moldavian"), - CheckboxFilterOption("mn","Mongolian"), - CheckboxFilterOption("ne","Nepali"), - CheckboxFilterOption("no","Norwegian"), - CheckboxFilterOption("ny","Nyanja"), - CheckboxFilterOption("ps","Pashto"), - CheckboxFilterOption("fa","Persian"), - CheckboxFilterOption("rm","Romansh"), - CheckboxFilterOption("sm","Samoan"), - CheckboxFilterOption("sr","Serbian"), - CheckboxFilterOption("sh","Serbo-Croatian"), - CheckboxFilterOption("st","Sesotho"), - CheckboxFilterOption("sn","Shona"), - CheckboxFilterOption("sd","Sindhi"), - CheckboxFilterOption("si","Sinhalese"), - CheckboxFilterOption("sk","Slovak"), - CheckboxFilterOption("sl","Slovenian"), - CheckboxFilterOption("so","Somali"), - CheckboxFilterOption("sw","Swahili"), - CheckboxFilterOption("tg","Tajik"), - CheckboxFilterOption("ta","Tamil"), - CheckboxFilterOption("ti","Tigrinya"), - CheckboxFilterOption("to","Tonga"), - CheckboxFilterOption("tk","Turkmen"), - CheckboxFilterOption("ur","Urdu"), - CheckboxFilterOption("uz","Uzbek"), - CheckboxFilterOption("yo","Yoruba"), - CheckboxFilterOption("zu","Zulu"), - CheckboxFilterOption("_t","Other"), + CheckboxFilterOption("en", "English"), + CheckboxFilterOption("ar", "Arabic"), + CheckboxFilterOption("bg", "Bulgarian"), + CheckboxFilterOption("zh", "Chinese"), + CheckboxFilterOption("cs", "Czech"), + CheckboxFilterOption("da", "Danish"), + CheckboxFilterOption("nl", "Dutch"), + CheckboxFilterOption("fil", "Filipino"), + CheckboxFilterOption("fi", "Finnish"), + CheckboxFilterOption("fr", "French"), + CheckboxFilterOption("de", "German"), + CheckboxFilterOption("el", "Greek"), + CheckboxFilterOption("he", "Hebrew"), + CheckboxFilterOption("hi", "Hindi"), + CheckboxFilterOption("hu", "Hungarian"), + CheckboxFilterOption("id", "Indonesian"), + CheckboxFilterOption("it", "Italian"), + CheckboxFilterOption("ja", "Japanese"), + CheckboxFilterOption("ko", "Korean"), + CheckboxFilterOption("ms", "Malay"), + CheckboxFilterOption("pl", "Polish"), + CheckboxFilterOption("pt", "Portuguese"), + CheckboxFilterOption("pt_br", "Portuguese (Brazil)"), + CheckboxFilterOption("ro", "Romanian"), + CheckboxFilterOption("ru", "Russian"), + CheckboxFilterOption("es", "Spanish"), + CheckboxFilterOption("es_419", "Spanish (Latin America)"), + CheckboxFilterOption("sv", "Swedish"), + CheckboxFilterOption("th", "Thai"), + CheckboxFilterOption("tr", "Turkish"), + CheckboxFilterOption("uk", "Ukrainian"), + CheckboxFilterOption("vi", "Vietnamese"), + CheckboxFilterOption("af", "Afrikaans"), + CheckboxFilterOption("sq", "Albanian"), + CheckboxFilterOption("am", "Amharic"), + CheckboxFilterOption("hy", "Armenian"), + CheckboxFilterOption("az", "Azerbaijani"), + CheckboxFilterOption("be", "Belarusian"), + CheckboxFilterOption("bn", "Bengali"), + CheckboxFilterOption("bs", "Bosnian"), + CheckboxFilterOption("my", "Burmese"), + CheckboxFilterOption("km", "Cambodian"), + CheckboxFilterOption("ca", "Catalan"), + CheckboxFilterOption("ceb", "Cebuano"), + CheckboxFilterOption("zh_hk", "Chinese (Cantonese)"), + CheckboxFilterOption("zh_tw", "Chinese (Traditional)"), + CheckboxFilterOption("hr", "Croatian"), + CheckboxFilterOption("en_us", "English (United States)"), + CheckboxFilterOption("eo", "Esperanto"), + CheckboxFilterOption("et", "Estonian"), + CheckboxFilterOption("fo", "Faroese"), + CheckboxFilterOption("ka", "Georgian"), + CheckboxFilterOption("gn", "Guarani"), + CheckboxFilterOption("gu", "Gujarati"), + CheckboxFilterOption("ht", "Haitian Creole"), + CheckboxFilterOption("ha", "Hausa"), + CheckboxFilterOption("is", "Icelandic"), + CheckboxFilterOption("ig", "Igbo"), + CheckboxFilterOption("ga", "Irish"), + CheckboxFilterOption("jv", "Javanese"), + CheckboxFilterOption("kn", "Kannada"), + CheckboxFilterOption("kk", "Kazakh"), + CheckboxFilterOption("ku", "Kurdish"), + CheckboxFilterOption("ky", "Kyrgyz"), + CheckboxFilterOption("lo", "Laothian"), + CheckboxFilterOption("lv", "Latvian"), + CheckboxFilterOption("lt", "Lithuanian"), + CheckboxFilterOption("lb", "Luxembourgish"), + CheckboxFilterOption("mk", "Macedonian"), + CheckboxFilterOption("mg", "Malagasy"), + CheckboxFilterOption("ml", "Malayalam"), + CheckboxFilterOption("mt", "Maltese"), + CheckboxFilterOption("mi", "Maori"), + CheckboxFilterOption("mr", "Marathi"), + CheckboxFilterOption("mo", "Moldavian"), + CheckboxFilterOption("mn", "Mongolian"), + CheckboxFilterOption("ne", "Nepali"), + CheckboxFilterOption("no", "Norwegian"), + CheckboxFilterOption("ny", "Nyanja"), + CheckboxFilterOption("ps", "Pashto"), + CheckboxFilterOption("fa", "Persian"), + CheckboxFilterOption("rm", "Romansh"), + CheckboxFilterOption("sm", "Samoan"), + CheckboxFilterOption("sr", "Serbian"), + CheckboxFilterOption("sh", "Serbo-Croatian"), + CheckboxFilterOption("st", "Sesotho"), + CheckboxFilterOption("sn", "Shona"), + CheckboxFilterOption("sd", "Sindhi"), + CheckboxFilterOption("si", "Sinhalese"), + CheckboxFilterOption("sk", "Slovak"), + CheckboxFilterOption("sl", "Slovenian"), + CheckboxFilterOption("so", "Somali"), + CheckboxFilterOption("sw", "Swahili"), + CheckboxFilterOption("tg", "Tajik"), + CheckboxFilterOption("ta", "Tamil"), + CheckboxFilterOption("ti", "Tigrinya"), + CheckboxFilterOption("to", "Tonga"), + CheckboxFilterOption("tk", "Turkmen"), + CheckboxFilterOption("ur", "Urdu"), + CheckboxFilterOption("uz", "Uzbek"), + CheckboxFilterOption("yo", "Yoruba"), + CheckboxFilterOption("zu", "Zulu"), + CheckboxFilterOption("_t", "Other"), // Lang options from bato.to brows not in publish.bato.to CheckboxFilterOption("eu", "Basque"), - CheckboxFilterOption("pt-PT","Portuguese (Portugal)"), + CheckboxFilterOption("pt-PT", "Portuguese (Portugal)"), ).filterNot { it.value == siteLang } private inline fun Iterable<*>.findInstance() = find { it is T } as? T diff --git a/src/en/dynasty/build.gradle b/src/en/dynasty/build.gradle index b293610ee..06c328730 100644 --- a/src/en/dynasty/build.gradle +++ b/src/en/dynasty/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' ext { extName = 'Dynasty' pkgNameSuffix = 'en.dynasty' extClass = '.DynastyFactory' - extVersionCode = 13 + extVersionCode = 14 libVersion = '1.2' } diff --git a/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyScans.kt b/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyScans.kt index 088ed42f9..94a414005 100644 --- a/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyScans.kt +++ b/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyScans.kt @@ -10,15 +10,19 @@ import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive import okhttp3.Request import okhttp3.Response -import org.json.JSONArray import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.jsoup.nodes.Node import org.jsoup.nodes.TextNode import org.jsoup.select.Elements import rx.Observable +import uy.kohesive.injekt.injectLazy import java.text.SimpleDateFormat import java.util.ArrayList import java.util.Locale @@ -43,6 +47,8 @@ abstract class DynastyScans : ParsedHttpSource() { private var _valid: Validate = Validate(false, -1) + private val json: Json by injectLazy() + override fun popularMangaRequest(page: Int): Request { return GET(popularMangaInitialUrl(), headers) } @@ -189,19 +195,16 @@ abstract class DynastyScans : ParsedHttpSource() { } override fun pageListParse(document: Document): List { - val pages = mutableListOf() - try { + return try { val imageUrl = document.select("script").last().html().substringAfter("var pages = [").substringBefore("];") - val imageUrls = JSONArray("[$imageUrl]") - (0 until imageUrls.length()) - .map { imageUrls.getJSONObject(it) } - .map { baseUrl + it.get("image") } - .forEach { pages.add(Page(pages.size, "", it)) } + json.parseToJsonElement("[$imageUrl]").jsonArray.mapIndexed { index, it -> + Page(index, imageUrl = "$baseUrl${it.jsonObject["image"]!!.jsonPrimitive.content}") + } } catch (e: Exception) { e.printStackTrace() + emptyList() } - return pages } class InternalList(nodes: List, type: String) : ArrayList() { diff --git a/src/en/mangapark/build.gradle b/src/en/mangapark/build.gradle index 9b5fbe4b9..78e15f7ff 100644 --- a/src/en/mangapark/build.gradle +++ b/src/en/mangapark/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' ext { extName = 'MangaPark' pkgNameSuffix = 'en.mangapark' extClass = '.MangaPark' - extVersionCode = 20 + extVersionCode = 21 libVersion = '1.2' } diff --git a/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt b/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt index 134ce2564..b2f13c1a3 100644 --- a/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt +++ b/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt @@ -13,14 +13,18 @@ import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive import okhttp3.CacheControl import okhttp3.Request import okhttp3.Response -import org.json.JSONArray import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale @@ -36,7 +40,7 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { override val baseUrl = "https://v2.mangapark.net" private val nextPageSelector = ".paging:not(.order) > li:last-child > a" - + private val json: Json by injectLazy() private val dateFormat = SimpleDateFormat("MMM d, yyyy, HH:mm a", Locale.ENGLISH) private val dateFormatTimeOnly = SimpleDateFormat("HH:mm a", Locale.ENGLISH) @@ -278,9 +282,11 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { override fun pageListParse(response: Response): List { val obj = objRegex.find(response.body!!.string())?.groupValues?.get(1) ?: throw Exception("_load_pages not found - ${response.request.url}") - val jsonArray = JSONArray(obj) - return (0 until jsonArray.length()).map { i -> jsonArray.getJSONObject(i).getString("u") } - .mapIndexed { i, url -> Page(i, "", if (url.startsWith("//")) "https://$url" else url) } + + return json.parseToJsonElement(obj).jsonArray.mapIndexed { i, it -> + val url = it.jsonObject["u"]!!.jsonPrimitive.content + Page(i, imageUrl = if (url.startsWith("//")) "https://$url" else url) + } } override fun pageListParse(document: Document): List = throw UnsupportedOperationException("Not used") diff --git a/src/en/readm/build.gradle b/src/en/readm/build.gradle index 5148f9455..95360ed8f 100644 --- a/src/en/readm/build.gradle +++ b/src/en/readm/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' ext { extName = 'ReadM' pkgNameSuffix = 'en.readm' extClass = '.ReadM' - extVersionCode = 5 + extVersionCode = 6 libVersion = '1.2' } diff --git a/src/en/readm/src/eu/kanade/tachiyomi/extension/en/readm/ReadM.kt b/src/en/readm/src/eu/kanade/tachiyomi/extension/en/readm/ReadM.kt index b8ec82351..7cadd512d 100644 --- a/src/en/readm/src/eu/kanade/tachiyomi/extension/en/readm/ReadM.kt +++ b/src/en/readm/src/eu/kanade/tachiyomi/extension/en/readm/ReadM.kt @@ -8,13 +8,17 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response -import org.json.JSONObject import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import uy.kohesive.injekt.injectLazy import java.util.Calendar import java.util.concurrent.TimeUnit @@ -32,6 +36,7 @@ class ReadM : ParsedHttpSource() { .followRedirects(true) .build() + private val json: Json by injectLazy() // Popular override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/popular-manga/$page", headers) @@ -76,20 +81,14 @@ class ReadM : ParsedHttpSource() { override fun searchMangaSelector(): String = throw Exception("Not used") override fun searchMangaFromElement(element: Element): SManga = throw Exception("Not used") - override fun searchMangaParse(response: Response): MangasPage { - val json = JSONObject(response.body!!.string()).getJSONArray("manga") - - val manga = (0 until json.length()).asSequence().toList().map { it -> - SManga.create().apply { - val jsonObject = json.getJSONObject(it) - title = jsonObject.getString("title") - url = jsonObject.getString("url") - thumbnail_url = jsonObject.getString("image") - } + override fun searchMangaParse(response: Response) = json.parseToJsonElement(response.body!!.string()).jsonObject["manga"]?.jsonArray?.map { + val obj = it.jsonObject + SManga.create().apply { + title = obj["title"]!!.jsonPrimitive.content + url = obj["url"]!!.jsonPrimitive.content + thumbnail_url = "$baseUrl${obj["image"]!!.jsonPrimitive.content}" } - - return MangasPage(manga, false) - } + }.let { MangasPage(it ?: emptyList(), false) } // Details