@@ -21,6 +21,7 @@ import eu.kanade.tachiyomi.source.model.Page
2121import eu.kanade.tachiyomi.source.model.SChapter
2222import eu.kanade.tachiyomi.source.model.SManga
2323import eu.kanade.tachiyomi.source.online.HttpSource
24+ import keiyoushi.utils.firstInstanceOrNull
2425import keiyoushi.utils.getPreferencesLazy
2526import keiyoushi.utils.parseAs
2627import kotlinx.serialization.json.Json
@@ -256,27 +257,54 @@ class CopyMangas : HttpSource(), ConfigurableSource {
256257 val builder = getUrl(" api" ).toHttpUrl().newBuilder()
257258 .addQueryParameter(" limit" , " $PAGE_SIZE " )
258259 .addQueryParameter(" offset" , " $offset " )
260+
259261 if (query.isNotBlank()) {
260262 builder.addPathSegments(" api/v3/search/comic" )
261263 .addQueryParameter(" q" , query)
262- filters.filterIsInstance <SearchFilter >().firstOrNull ()?.addQuery(builder)
264+ filters.firstInstanceOrNull <SearchFilter >()?.addQuery(builder)
263265 // builder.addQueryParameter("q_type", "")
264266 headersBuilder.setToken(preferences.getString(if (useHotmanga) HOTMANGA_TOKEN_PREF else TOKEN_PREF , " " )!! )
265267 } else {
266- builder.addPathSegments(" api/v3/comics" )
267- filters.filterIsInstance<CopyMangaFilter >().forEach {
268- if (it !is SearchFilter ) {
269- it.addQuery(builder)
268+ val ranking = filters.firstInstanceOrNull<RankingGroup >()
269+ if (ranking != null && (ranking.state[0 ] as TypeFilter ).state != 0 ) {
270+ val rankType = (ranking.state[0 ] as TypeFilter ).state
271+ if (rankType != 1 ) {
272+ // 排行榜
273+ builder.addPathSegments(" api/v3/ranks" )
274+ .addQueryParameter(" type" , " 1" )
275+ ranking.state.filterIsInstance<CopyMangaFilter >().forEach {
276+ it.addQuery(builder)
277+ }
278+ } else {
279+ // 最新上架
280+ builder.addPathSegments(" api/v3/update/newest" )
281+ }
282+ } else {
283+ // 分类/发现
284+ builder.addPathSegments(" api/v3/comics" )
285+ filters.filterIsInstance<CopyMangaFilter >().forEach {
286+ if (it !is SearchFilter ) {
287+ it.addQuery(builder)
288+ }
270289 }
271290 }
272291 }
273292 return Request .Builder ().url(builder.build()).headers(headersBuilder.build()).build()
274293 }
275294
276295 override fun searchMangaParse (response : Response ): MangasPage {
277- val page = response.parseAs<ResultDto <ListDto <MangaDto >>>().results
296+ val page = if (response.request.url.pathSegments.last() != " comics" ) {
297+ response.parseAs<ResultDto <ListDto <RanksListWrapperDto >>>().results
298+ } else {
299+ response.parseAs<ResultDto <ListDto <MangaDto >>>().results
300+ }
301+
302+ val mangas = page.list.map {
303+ if (it is RanksListWrapperDto ) it.comic.toSManga() else (it as MangaDto ).toSManga()
304+ }
278305 val hasNextPage = page.offset + page.limit < page.total
279- return MangasPage (page.list.map { it.toSManga() }, hasNextPage)
306+
307+ return MangasPage (mangas, hasNextPage)
280308 }
281309
282310 override fun getMangaUrl (manga : SManga ) = getUrl(" web" ) + manga.url
@@ -410,6 +438,8 @@ class CopyMangas : HttpSource(), ConfigurableSource {
410438 return FilterList (
411439 SearchFilter (),
412440 Filter .Separator (),
441+ RankingGroup (),
442+ Filter .Separator (),
413443 Filter .Header (" 分类(搜索文本时无效)" ),
414444 genreFilter,
415445 TopFilter (),
@@ -430,7 +460,7 @@ class CopyMangas : HttpSource(), ConfigurableSource {
430460 apiHeaders,
431461 ),
432462 ).execute()
433- val list = response.parseAs<ListDto <KeywordDto >>().list.sortedBy { it.name }
463+ val list = response.parseAs<ResultDto < ListDto <KeywordDto >>> ().results. list.filter { it.count != null && it.count != 0 } .sortedBy { it.name }
434464 val result = ArrayList <Param >(list.size + 1 ).apply { add(Param (" 全部" , " " )) }
435465 genres = list.mapTo(result) { it.toParam() }.toTypedArray()
436466 } catch (e: Exception ) {
0 commit comments