From 5959e0db328efe0b0d083e589372849ea45a9b51 Mon Sep 17 00:00:00 2001
From: are-are-are <62763969+dejavui@users.noreply.github.com>
Date: Tue, 20 Dec 2022 22:17:31 +0700
Subject: [PATCH] Add search ID hentaivn (#14619)

---
 src/vi/hentaivn/build.gradle                  |  2 +-
 .../extension/vi/hentaivn/HentaiVN.kt         | 29 +++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/vi/hentaivn/build.gradle b/src/vi/hentaivn/build.gradle
index fb2c793da..b7ac667ba 100644
--- a/src/vi/hentaivn/build.gradle
+++ b/src/vi/hentaivn/build.gradle
@@ -5,7 +5,7 @@ ext {
     extName = 'HentaiVN'
     pkgNameSuffix = 'vi.hentaivn'
     extClass = '.HentaiVN'
-    extVersionCode = 17
+    extVersionCode = 18
     isNsfw = true
 }
 
diff --git a/src/vi/hentaivn/src/eu/kanade/tachiyomi/extension/vi/hentaivn/HentaiVN.kt b/src/vi/hentaivn/src/eu/kanade/tachiyomi/extension/vi/hentaivn/HentaiVN.kt
index 364740d1e..fb49db60b 100644
--- a/src/vi/hentaivn/src/eu/kanade/tachiyomi/extension/vi/hentaivn/HentaiVN.kt
+++ b/src/vi/hentaivn/src/eu/kanade/tachiyomi/extension/vi/hentaivn/HentaiVN.kt
@@ -1,6 +1,7 @@
 package eu.kanade.tachiyomi.extension.vi.hentaivn
 
 import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.asObservableSuccess
 import eu.kanade.tachiyomi.source.model.Filter
 import eu.kanade.tachiyomi.source.model.FilterList
 import eu.kanade.tachiyomi.source.model.MangasPage
@@ -17,6 +18,7 @@ import okhttp3.Request
 import okhttp3.Response
 import org.jsoup.nodes.Document
 import org.jsoup.nodes.Element
+import rx.Observable
 import java.text.ParseException
 import java.text.SimpleDateFormat
 import java.util.Locale
@@ -162,6 +164,33 @@ class HentaiVN : ParsedHttpSource() {
 
     override fun searchMangaNextPageSelector() = "ul.pagination > li:contains(Cuối)"
 
+    private fun searchMangaByIdRequest(id: String) = GET("$baseUrl/tim-kiem-truyen.html?key=$id", headers)
+    private fun searchMangaByIdParse(response: Response, ids: String): MangasPage {
+        val details = mangaDetailsParse(response)
+        details.url = "$baseUrl/$ids-doc-truyen-id.html"
+        return MangasPage(listOf(details), false)
+    }
+
+    override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
+        return when {
+            query.startsWith(PREFIX_ID_SEARCH) -> {
+                val ids = query.removePrefix(PREFIX_ID_SEARCH)
+                client.newCall(searchMangaByIdRequest(ids))
+                    .asObservableSuccess()
+                    .map { response -> searchMangaByIdParse(response, ids) }
+            }
+            query.toIntOrNull() != null -> {
+                client.newCall(searchMangaByIdRequest(query))
+                    .asObservableSuccess()
+                    .map { response -> searchMangaByIdParse(response, query) }
+            }
+            else -> super.fetchSearchManga(page, query, filters)
+        }
+    }
+    companion object {
+        const val PREFIX_ID_SEARCH = "id:"
+    }
+
     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
         val url = "$searchUrl?name=$query&page=$page&dou=&char=&group=0&search=".toHttpUrlOrNull()!!.newBuilder()
         (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->