From 6335d5bca40b9a856c910cdfce5e4502d26a8ee7 Mon Sep 17 00:00:00 2001 From: GG Bond Date: Sun, 10 Dec 2023 20:09:08 +0800 Subject: [PATCH] Fix search image --- .../com/hippo/ehviewer/client/EhEngine.kt | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt index 71e56f844..9d60a6587 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt @@ -36,6 +36,7 @@ import com.hippo.ehviewer.client.parser.ForumsParser import com.hippo.ehviewer.client.parser.GalleryApiParser import com.hippo.ehviewer.client.parser.GalleryDetailParser import com.hippo.ehviewer.client.parser.GalleryListParser +import com.hippo.ehviewer.client.parser.GalleryListResult import com.hippo.ehviewer.client.parser.GalleryNotAvailableParser import com.hippo.ehviewer.client.parser.GalleryPageParser import com.hippo.ehviewer.client.parser.GalleryTokenApiParser @@ -64,6 +65,7 @@ import io.ktor.utils.io.pool.useInstance import java.io.File import java.io.RandomAccessFile import java.nio.ByteBuffer +import java.nio.channels.FileChannel import kotlin.math.ceil import kotlinx.coroutines.CancellationException import kotlinx.coroutines.delay @@ -426,19 +428,23 @@ object EhEngine { } }.fetchUsingAsText(GalleryTokenApiParser::parse) - /** - * @param image Must be jpeg - */ - suspend fun imageSearch(image: File, uss: Boolean, osc: Boolean) = ehRequest(EhUrl.imageSearchUrl, EhUrl.referer, EhUrl.origin) { - multipartBody { - append("sfile", "a.jpg", ContentType.Image.JPEG, image.length()) { - writeFully(image.readBytes()) + suspend fun imageSearch(jpeg: File, uss: Boolean, osc: Boolean): GalleryListResult { + val location = noRedirectEhRequest(EhUrl.imageSearchUrl, EhUrl.referer, EhUrl.origin) { + multipartBody { + append("sfile", "a.jpg", ContentType.Image.JPEG, jpeg.length()) { + RandomAccessFile(jpeg, "r").use { + writeFully(it.channel.map(FileChannel.MapMode.READ_ONLY, 0, it.length())) + } + } + if (uss) append("fs_similar", "on") + if (osc) append("fs_covers", "on") + append("f_sfile", "File Search") } - if (uss) append("fs_similar", "on") - if (osc) append("fs_covers", "on") - append("f_sfile", "File Search") + }.execute { it.headers["Location"] ?: error("Failed to search image!!!") } + return ehRequest(location).fetchUsingAsByteBuffer(GalleryListParser::parse).apply { + galleryInfoList.fillInfo(EhUrl.imageSearchUrl) } - }.fetchUsingAsByteBuffer(GalleryListParser::parse).apply { galleryInfoList.fillInfo(EhUrl.imageSearchUrl) } + } private suspend fun MutableList.fillInfo(url: String, filter: Boolean = false) = with(EhFilter) { if (filter) removeAllSuspend { filterTitle(it) || filterUploader(it) }