From d50732286acc987b31df67a7bc169d4a33fae1d5 Mon Sep 17 00:00:00 2001 From: zhongfly <11155705+zhongfly@users.noreply.github.com> Date: Wed, 7 May 2025 23:28:39 +0800 Subject: [PATCH] dmzj: add apiv1 search (#8749) * dmzj: add apiv1 search * dmzj: remove old text search --- src/zh/dmzj/build.gradle | 2 +- .../tachiyomi/extension/zh/dmzj/ApiSearch.kt | 54 +++++++++++++------ .../tachiyomi/extension/zh/dmzj/Dmzj.kt | 4 +- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/zh/dmzj/build.gradle b/src/zh/dmzj/build.gradle index f9cb012b6..a10b02998 100644 --- a/src/zh/dmzj/build.gradle +++ b/src/zh/dmzj/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'DMZJ' extClass = '.Dmzj' - extVersionCode = 45 + extVersionCode = 46 } apply from: "$rootDir/common.gradle" diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiSearch.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiSearch.kt index 1d27f7f7f..7fa804bf0 100644 --- a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiSearch.kt +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiSearch.kt @@ -3,40 +3,62 @@ package eu.kanade.tachiyomi.extension.zh.dmzj import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.SManga import kotlinx.serialization.Serializable -import kotlinx.serialization.decodeFromString import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Response object ApiSearch { - fun textSearchUrl(query: String) = - "http://sacg.idmzj.com/comicsum/search.php".toHttpUrl().newBuilder() - .addQueryParameter("s", query) + fun searchUrlV1(page: Int, query: String) = + "https://manhua.idmzj.com/api/v1/comic2/search".toHttpUrl().newBuilder() + .addQueryParameter("page", page.toString()) + .addQueryParameter("size", "30") + .addQueryParameter("keyword", query) .toString() - fun parsePage(response: Response): MangasPage { + fun parsePageV1(response: Response): MangasPage { if (!response.isSuccessful) { response.close() return MangasPage(emptyList(), false) } - // "var g_search_data = [...];" - val js = response.body.string().run { substring(20, length - 1) } - val data: List = json.decodeFromString(js) - return MangasPage(data.map { it.toSManga() }, false) + val result = response.parseAs>() + if (result.errmsg.isNotBlank()) { + throw Exception(result.errmsg) + } else { + val url = response.request.url + val page = url.queryParameter("page")?.toInt() + val size = url.queryParameter("size")?.toInt() + return if (result.data != null) { + MangasPage(result.data.comicList.map { it.toSManga() }, page!! * size!! < result.data.totalNum) + } else { + MangasPage(emptyList(), false) + } + } } @Serializable - class MangaDto( + class MangaDtoV1( private val id: Int, - private val comic_name: String, - private val comic_author: String, - private val comic_cover: String, + private val name: String, + private val authors: String, + private val cover: String, ) { fun toSManga() = SManga.create().apply { url = getMangaUrl(id.toString()) - title = comic_name - author = comic_author.formatList() - thumbnail_url = comic_cover + title = name + author = authors + thumbnail_url = cover } } + + @Serializable + class SearchResultDto( + val comicList: List, + val totalNum: Int, + ) + + @Serializable + class ResponseDto( + val errmsg: String = "", + val data: T, + ) } diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt index b44d6bca3..16b89e9dc 100644 --- a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt @@ -107,11 +107,11 @@ class Dmzj : ConfigurableSource, HttpSource() { val id = query.removePrefix(PREFIX_ID_SEARCH).removeSuffix(".html") Observable.fromCallable { searchMangaById(id) } } else { - val request = GET(ApiSearch.textSearchUrl(query), headers) + val request = GET(ApiSearch.searchUrlV1(page, query), headers) Observable.fromCallable { // this API fails randomly, and might return empty list repeat(5) { - val result = ApiSearch.parsePage(client.newCall(request).execute()) + val result = ApiSearch.parsePageV1(client.newCall(request).execute()) if (result.mangas.isNotEmpty()) return@fromCallable result } throw Exception("搜索出错或无结果")