diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/HoneyMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/HoneyMangaParser.kt index 161943d2..d9d8ead9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/HoneyMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/HoneyMangaParser.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.core.parser +import androidx.collection.ArraySet import okhttp3.Headers import okhttp3.Interceptor import okhttp3.Response @@ -26,6 +27,7 @@ import org.koitharu.kotatsu.parsers.util.parseJson import org.koitharu.kotatsu.parsers.util.parseJsonArray import org.koitharu.kotatsu.parsers.util.removeSuffix import org.koitharu.kotatsu.parsers.util.tryParse +import org.koitharu.kotatsu.parsers.util.urlEncoded import java.text.SimpleDateFormat import java.util.EnumSet import java.util.Locale @@ -36,14 +38,15 @@ private const val PAGE_SIZE = 20 @MangaSourceParser("HONEYMANGA", "Honey Manga", "uk") class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.HONEYMANGA, PAGE_SIZE), Interceptor { - private val urlApi = "https://data.api.$domain" - private val mangaApi = "$urlApi/v2/manga/cursor-list" - private val chapterApi = "$urlApi/v2/chapter/cursor-list" - private val genresListApi = "$urlApi/genres-tags/genres-list" - private val framesApi = "$urlApi/chapter/frames" + private val urlApi get() = "https://data.api.$domain" + private val mangaApi get() = "$urlApi/v2/manga/cursor-list" + private val chapterApi get() = "$urlApi/v2/chapter/cursor-list" + private val genresListApi get() = "$urlApi/genres-tags/genres-list" + private val framesApi get() = "$urlApi/chapter/frames" private val searchApi = "https://search.api.$domain/api/v1/title/search-matching?query=" private val imageStorageUrl = "https://manga-storage.fra1.digitaloceanspaces.com/public-resources" + override val headers get() = Headers.Builder() .add("User-Agent", "Mozilla/5.0 (Android 13; Mobile; rv:68.0) Gecko/68.0 Firefox/109.0") @@ -98,12 +101,10 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, sortOrder: SortOrder ): List { val body = JSONObject() - var content: JSONArray? = null - content = if (!query.isNullOrEmpty()) { - if((query.length < 3) || (page > 1)) return emptyList() - body.put("query", query) - webClient.httpGet(searchApi + query).parseJsonArray() - } else { + var content: JSONArray = JSONArray() + + // Popular/Newest + content = if (query.isNullOrEmpty()) { body.put("page", page) body.put("pageSize", PAGE_SIZE) body.put("filters", JSONArray()) @@ -112,8 +113,12 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, sort.put("sortOrder", "DESC") body.put("sort", sort) webClient.httpPost(mangaApi, body).parseJson().getJSONArray("data") + // Search + } else { + if((query.length < 3) || (page > 1)) return emptyList() + webClient.httpGet(searchApi + query.urlEncoded()).parseJsonArray() } - return content!!.mapJSON { jo -> + return content.mapJSON { jo -> val id = jo.getString("id") val posterUrl = jo.getString("posterUrl") Manga( @@ -125,7 +130,7 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, rating = RATING_UNKNOWN, isNsfw = isNsfw(jo.getStringOrNull("adult")), coverUrl = getCoverUrl(posterUrl, 256), - tags = getTags(jo.optJSONArray("genresAndTags")!!), + tags = getTitleTags(jo.optJSONArray("genresAndTags")), state = when (jo.getStringOrNull("titleStatus")) { "Онгоінг" -> MangaState.ONGOING "Завершено" -> MangaState.FINISHED @@ -145,13 +150,10 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, body.put("chapterId", chapter.url) val content = webClient.httpPost(framesApi, body).parseJson().getJSONObject("resourceIds") - val mangaPage = mutableListOf() - (0 until content.length()).forEach { i -> + return List(content.length()) { i -> val item = content.get(i.toString()).toString() - - mangaPage.add(MangaPage(id = generateUid(item), "$imageStorageUrl/$item", getCoverUrl(item, 256), source)) + MangaPage(id = generateUid(item), "$imageStorageUrl/$item", getCoverUrl(item, 256), source) } - return mangaPage } override suspend fun getTags(): Set { @@ -187,8 +189,14 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, return "https://$domain/_next/image?url=https%3A%2F%2Fmanga-storage.fra1.digitaloceanspaces.com%2Fpublic-resources%2F$id&w=$w&q=75" } - private fun getTags(jsonTags: JSONArray): Set { - val tagsSet = mutableListOf() + private fun getSortKey(order: SortOrder?) = when (order) { + SortOrder.POPULARITY -> "likes" + SortOrder.NEWEST -> "lastUpdated" + else -> "likes" + } + + private fun getTitleTags(jsonTags: JSONArray): Set { + val tagsSet = ArraySet(jsonTags.length()) (0 until jsonTags.length()).forEach { i -> val item = jsonTags.get(i) @@ -197,10 +205,4 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, return tagsSet.toSet() } - - private fun getSortKey(order: SortOrder?) = when (order) { - SortOrder.POPULARITY -> "likes" - SortOrder.NEWEST -> "lastUpdated" - else -> "likes" - } }