From a3f384e3b3d887001f58544ad94dfd68a77cd669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ho=C3=A0ng=20Phi=20H=C3=B9ng?= <83570379+hung319@users.noreply.github.com> Date: Tue, 30 Sep 2025 19:27:46 +0700 Subject: [PATCH] =?UTF-8?q?=E1=BB=94=20Truy=E1=BB=87n:=20Fix=20no=20value?= =?UTF-8?q?=20for=20=5Fid=20in=20getListPage=20(#2259)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Draken <131387159+dragonx943@users.noreply.github.com> --- .../kotatsu/parsers/site/vi/OTruyenParser.kt | 141 +++++++++--------- 1 file changed, 68 insertions(+), 73 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/OTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/OTruyenParser.kt index fda8335c..3d3e7346 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/OTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/OTruyenParser.kt @@ -1,6 +1,5 @@ package org.koitharu.kotatsu.parsers.site.vi -import org.jsoup.HttpStatusException import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey @@ -27,7 +26,6 @@ import org.koitharu.kotatsu.parsers.util.oneOrThrowIfMany import org.koitharu.kotatsu.parsers.util.parseJson import org.koitharu.kotatsu.parsers.util.parseSafe import org.koitharu.kotatsu.parsers.util.urlEncoded -import java.net.HttpURLConnection import java.text.SimpleDateFormat import java.util.EnumSet import java.util.Locale @@ -75,77 +73,74 @@ internal class OTruyenParser(context: MangaLoaderContext) : ) } - override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { - val url = buildString { - append("https://") - append(domain) - when { - !filter.query.isNullOrEmpty() -> { - append("/v1/api/tim-kiem?keyword=") - append(filter.query.urlEncoded()) - append("&page=") - append(page.toString()) - } - - else -> { - val tag = filter.tags.oneOrThrowIfMany() - if (tag != null) { - append("/v1/api/the-loai/") - append(tag.key) - append("?page=") - append(page) - } else if (filter.states.isNotEmpty()) { - filter.states.oneOrThrowIfMany()?.let { - append( - when (it) { - MangaState.ONGOING -> "/v1/api/danh-sach/dang-phat-hanh?page=${page}" - MangaState.FINISHED -> "/v1/api/danh-sach/hoan-thanh?page=${page}" - MangaState.UPCOMING -> "/v1/api/danh-sach/sap-ra-mat?page=${page}" - else -> "/v1/api/danh-sach/dang-phat-hanh?page=${page}" // default - } - ) - } - } else { - append("/v1/api/danh-sach/truyen-moi") // SortOrder.NEWEST - append("?page=${page}") - } - } - } - } - - val json = try { - webClient.httpGet(url).parseJson() - } catch (e: HttpStatusException) { - if (e.statusCode == HttpURLConnection.HTTP_INTERNAL_ERROR) { - return emptyList() - } else { - throw e - } - } - - val items = json.getJSONObject("data").getJSONArray("items") - return items.mapJSON { jo -> - Manga( - id = generateUid(jo.getString("_id").hashCode().toLong()), - url = jo.getString("slug"), - publicUrl = "https://otruyen.cc/truyen-tranh/${jo.getString("slug")}", - title = jo.getString("name"), - altTitles = emptySet(), - coverUrl = "https://img.otruyenapi.com/uploads/comics/${jo.getString("thumb_url")}", - authors = emptySet(), - tags = emptySet(), - state = when (jo.getString("status")) { - "ongoing" -> MangaState.ONGOING - "coming_soon" -> MangaState.UPCOMING - "completed" -> MangaState.FINISHED - else -> null - }, - contentRating = if (isNsfwSource) ContentRating.ADULT else null, - source = source, - rating = RATING_UNKNOWN, - ) - } - } + override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { + val url = buildString { + append("https://") + append(domain) + when { + !filter.query.isNullOrEmpty() -> { + append("/v1/api/tim-kiem?keyword=") + append(filter.query.urlEncoded()) + append("&page=") + append(page.toString()) + } + + else -> { + if (!filter.tags.isEmpty()) { + filter.tags.oneOrThrowIfMany()?.let { + append("/v1/api/the-loai/") + append(it.key) + append("?page=") + append(page) + } + } else if (filter.states.isNotEmpty()) { + filter.states.oneOrThrowIfMany()?.let { + append( + when (it) { + MangaState.FINISHED -> "/v1/api/danh-sach/hoan-thanh?page=${page}" + MangaState.UPCOMING -> "/v1/api/danh-sach/sap-ra-mat?page=${page}" + else -> "/v1/api/danh-sach/dang-phat-hanh?page=${page}" // ONGOING + } + ) + } + } else { + append("/v1/api/danh-sach/truyen-moi") // SortOrder.NEWEST + append("?page=${page}") + } + } + } + } + + val json = try { + webClient.httpGet(url).parseJson() + } catch (_: Exception) { + return emptyList() + } + + val items = json.getJSONObject("data").getJSONArray("items") + return items.mapJSON { jo -> + val slug = jo.getString("slug") + Manga( + id = generateUid(slug.hashCode().toLong()), + url = slug, + publicUrl = "https://otruyen.cc/truyen-tranh/${slug}", + title = jo.getString("name"), + altTitles = emptySet(), + coverUrl = "https://img.otruyenapi.com/uploads/comics/${jo.getString("thumb_url")}", + authors = emptySet(), + tags = emptySet(), + state = when (jo.getString("status")) { + "ongoing" -> MangaState.ONGOING + "coming_soon" -> MangaState.UPCOMING + "completed" -> MangaState.FINISHED + else -> null + }, + contentRating = if (isNsfwSource) ContentRating.ADULT else null, + source = source, + rating = RATING_UNKNOWN, + ) + } + } override suspend fun getDetails(manga: Manga): Manga { val url = "https://$domain/v1/api/truyen-tranh/${manga.url}"