From 54a7cdb04193353d4bf2a5f9fa51fe6383f31427 Mon Sep 17 00:00:00 2001
From: FourTOne5 <59261191+FourTOne5@users.noreply.github.com>
Date: Mon, 24 May 2021 16:12:39 +0600
Subject: [PATCH] Bilibili Comics Add search from Api instead of scrapping
 (#7119)

* Update BilibiliComics.kt

* Update build.gradle

* Update BilibiliComics.kt
---
 src/en/bilibilicomics/build.gradle            |  2 +-
 .../en/bilibilicomics/BilibiliComics.kt       | 50 ++++++-------------
 2 files changed, 17 insertions(+), 35 deletions(-)

diff --git a/src/en/bilibilicomics/build.gradle b/src/en/bilibilicomics/build.gradle
index 82fa0a90d..8f975f56c 100644
--- a/src/en/bilibilicomics/build.gradle
+++ b/src/en/bilibilicomics/build.gradle
@@ -5,7 +5,7 @@ ext {
     extName = 'Bilibili Comics'
     pkgNameSuffix = 'en.bilibilicomics'
     extClass = '.BilibiliComics'
-    extVersionCode = 1
+    extVersionCode = 2
     libVersion = '1.2'
     containsNsfw = true
 }
diff --git a/src/en/bilibilicomics/src/eu/kanade/tachiyomi/extension/en/bilibilicomics/BilibiliComics.kt b/src/en/bilibilicomics/src/eu/kanade/tachiyomi/extension/en/bilibilicomics/BilibiliComics.kt
index 039681c96..fbd811d9b 100644
--- a/src/en/bilibilicomics/src/eu/kanade/tachiyomi/extension/en/bilibilicomics/BilibiliComics.kt
+++ b/src/en/bilibilicomics/src/eu/kanade/tachiyomi/extension/en/bilibilicomics/BilibiliComics.kt
@@ -22,11 +22,13 @@ import eu.kanade.tachiyomi.source.model.SChapter
 import eu.kanade.tachiyomi.source.model.SManga
 import eu.kanade.tachiyomi.source.online.HttpSource
 import okhttp3.Headers
+import okhttp3.HttpUrl.Companion.toHttpUrl
 import okhttp3.MediaType.Companion.toMediaType
 import okhttp3.OkHttpClient
 import okhttp3.Request
 import okhttp3.RequestBody.Companion.toRequestBody
 import okhttp3.Response
+import org.jsoup.Jsoup
 import rx.Observable
 import java.text.ParseException
 import java.text.SimpleDateFormat
@@ -48,8 +50,6 @@ class BilibiliComics : HttpSource() {
         .addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
         .build()
 
-    private val comicList: MutableList<SManga> = mutableListOf()
-
     override fun headersBuilder(): Headers.Builder = Headers.Builder()
         .add("Accept", ACCEPT_JSON)
         .add("Origin", baseUrl)
@@ -95,71 +95,53 @@ class BilibiliComics : HttpSource() {
         url = "/detail/mc" + obj["comic_id"].int
     }
 
-    override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
-        return if (comicList.isEmpty()) {
-            super.fetchSearchManga(page, query, filters)
-                .map { result ->
-                    val filteredComics = result.mangas.filter { it.title.contains(query, true) }
-                    MangasPage(filteredComics, result.hasNextPage)
-                }
-        } else {
-            val filteredComics = comicList.filter { it.title.contains(query, true) }
-            Observable.just(MangasPage(filteredComics, hasNextPage = false))
-        }
-    }
-
     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
         val jsonPayload = jsonObject(
             "area_id" to -1,
             "is_finish" to -1,
             "is_free" to 1,
+            "key_word" to query,
             "order" to 0,
             "page_num" to page,
-            "page_size" to 18,
+            "page_size" to 9,
             "style_id" to -1
         )
         val requestBody = jsonPayload.toString().toRequestBody(JSON_CONTENT_TYPE)
 
+        val refererUrl = "$baseUrl/search".toHttpUrl().newBuilder()
+            .addQueryParameter("keyword", query)
+            .toString()
         val newHeaders = headersBuilder()
             .add("Content-Length", requestBody.contentLength().toString())
             .add("Content-Type", requestBody.contentType().toString())
             .add("X-Page", page.toString())
-            .set("Referer", "$baseUrl/genre")
+            .set("Referer", refererUrl)
             .build()
 
         return POST(
-            "$baseUrl/$BASE_API_ENDPOINT/ClassPage?device=pc&platform=web",
+            "$baseUrl/$BASE_API_ENDPOINT/Search?device=pc&platform=web",
             headers = newHeaders,
             body = requestBody
         )
     }
 
-    // Site does not have search in the API, so we need to fetch all the pages
-    // and then filter to find the query provided by the user.
     override fun searchMangaParse(response: Response): MangasPage {
-        var request = response.request
-        var currentPage = request.headers["X-Page"]!!.toInt()
-        var jsonResponse = response.asJson().obj
+        val jsonResponse = response.asJson().obj
 
         if (jsonResponse["code"].int != 0) {
             return MangasPage(emptyList(), hasNextPage = false)
         }
 
-        while (jsonResponse["data"].array.size() > 0) {
-            comicList += jsonResponse["data"].array
-                .map(::searchMangaFromObject)
-
-            request = searchMangaRequest(++currentPage, "", FilterList())
-            jsonResponse = client.newCall(request).execute().asJson().obj
-        }
+        val comicList = jsonResponse["data"]["list"].array
+            .map(::searchMangaFromObject)
 
         return MangasPage(comicList, hasNextPage = false)
     }
 
     private fun searchMangaFromObject(obj: JsonElement): SManga = SManga.create().apply {
-        title = obj["title"].string
+        title = Jsoup.parse(obj["title"].string).text()
         thumbnail_url = obj["vertical_cover"].string
-        url = "/detail/mc" + obj["season_id"].int
+        url = "/detail/mc" + obj["id"].int
     }
 
     // Workaround to allow "Open in browser" use the real URL.
@@ -225,9 +207,9 @@ class BilibiliComics : HttpSource() {
     }
 
     override fun pageListRequest(chapter: SChapter): Request {
-        val comicId = chapter.url.substringAfterLast("/").toInt()
+        val chapterId = chapter.url.substringAfterLast("/").toInt()
 
-        val jsonPayload = jsonObject("ep_id" to comicId)
+        val jsonPayload = jsonObject("ep_id" to chapterId)
         val requestBody = jsonPayload.toString().toRequestBody(JSON_CONTENT_TYPE)
 
         val newHeaders = headersBuilder()