From 487925b1f2d6d22a805f46c0e987b032f9f63720 Mon Sep 17 00:00:00 2001 From: tarsin Date: Mon, 30 Jan 2023 14:32:43 +0800 Subject: [PATCH] Refactor SpiderDen --- .../com/hippo/ehviewer/spider/SpiderDen.kt | 99 +++++++-------- .../hippo/ehviewer/spider/SpiderQueen.java | 120 ++---------------- 2 files changed, 56 insertions(+), 163 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt index d1b3af679..3366cca5a 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -27,24 +27,20 @@ import com.hippo.ehviewer.client.EhUtils.getSuitableTitle import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.gallery.PageLoader2 import com.hippo.image.Image.ByteBufferSource -import com.hippo.io.UniFileInputStreamPipe -import com.hippo.streampipe.InputStreamPipe import com.hippo.unifile.RawFile import com.hippo.unifile.UniFile import com.hippo.yorozuya.FileUtils -import com.hippo.yorozuya.IOUtils import com.hippo.yorozuya.MathUtils import com.hippo.yorozuya.Utilities import okhttp3.ResponseBody import java.io.File import java.io.FileInputStream import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream import java.io.RandomAccessFile import java.nio.ByteBuffer import java.nio.channels.FileChannel import java.util.Locale +import kotlin.io.path.readText class SpiderDen(private val mGalleryInfo: GalleryInfo) { private val mGid: Long = mGalleryInfo.gid @@ -117,7 +113,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { val file = dir.createFile(generateImageFilename(index, extension)) ?: return false (file.openOutputStream() as FileOutputStream).use { outputStream -> outputStream.channel.use { outChannel -> - FileInputStream(snapshot.data.toFile()).use { inputStream -> + snapshot.data.toFile().inputStream().use { inputStream -> inputStream.channel.use { outChannel.transferFrom(it, 0, it.size()) } @@ -210,7 +206,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { var received: Long = 0 runCatching { editor.metadata.toFile().writeText(extension) - FileOutputStream(editor.data.toFile()).use { outputStream -> + editor.data.toFile().outputStream().use { outputStream -> outputStream.channel.use { received = doSave(it) } } }.onFailure { @@ -226,61 +222,56 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { return -1 } - private fun openCacheInputStreamPipe(index: Int): InputStreamPipe? { - val key = EhCacheKeyFactory.getImageKey(mGid, index) - val snapshot = sCache[key] ?: return null - return object : InputStreamPipe { - private var `is`: InputStream? = null - override fun release() { - snapshot.close() - } + fun saveToUniFile(index: Int, file: UniFile): Boolean { + (file.openOutputStream() as FileOutputStream).use { outputStream -> + outputStream.channel.use { outChannel -> + val key = EhCacheKeyFactory.getImageKey(mGid, index) - @Throws(IOException::class) - override fun open(): InputStream { - if (`is` != null) IOUtils.closeQuietly(`is`) - `is` = FileInputStream(snapshot.data.toFile()) - return `is`!! - } - - override fun close() { - if (`is` != null) IOUtils.closeQuietly(`is`) - } - } - } - - private fun openDownloadInputStreamPipe(index: Int): InputStreamPipe? { - val dir = downloadDir ?: return null - for (i in 0..1) { - val file = findImageFile(dir, index) - if (file != null) { - return UniFileInputStreamPipe(file) - } else if (!copyFromCacheToDownloadDir(index)) { - return null - } - } - return null - } - - fun openInputStreamPipe(index: Int): InputStreamPipe? { - return when (mMode) { - SpiderQueen.MODE_READ -> { - var pipe = openCacheInputStreamPipe(index) - if (pipe == null) { - pipe = openDownloadInputStreamPipe(index) + fun copy(inputStream: FileInputStream) { + inputStream.channel.use { + outChannel.transferFrom(it, 0, it.size()) + } } - pipe - } - SpiderQueen.MODE_DOWNLOAD -> { - openDownloadInputStreamPipe(index) - } + // Read from diskCache first + sCache[key]?.use { snapshot -> + runCatching { + snapshot.data.toFile().inputStream().use { copy(it) } + }.onSuccess { + return true + }.onFailure { + it.printStackTrace() + return false + } + } - else -> { - null + downloadDir?.let { uniFile -> + runCatching { + findImageFile(uniFile, index)?.openInputStream()?.use { + copy(it as FileInputStream) + } + }.onFailure { + it.printStackTrace() + return false + }.onSuccess { + return true + } + } + return false } } } + fun checkPlainText(index: Int): Boolean { + return false + } + + fun getExtension(index: Int): String? { + val key = EhCacheKeyFactory.getImageKey(mGid, index) + return sCache[key]?.use { it.metadata.toNioPath().readText() } + ?: downloadDir?.let { findImageFile(it, index) }?.name.let { FileUtils.getExtensionFromFilename(it) } + } + fun getImageSource(index: Int): ByteBufferSource? { if (mMode == SpiderQueen.MODE_READ) { val key = EhCacheKeyFactory.getImageKey(mGid, index) diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java index d1696e155..bacfaa632 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java @@ -16,11 +16,9 @@ package com.hippo.ehviewer.spider; -import android.graphics.BitmapFactory; import android.os.Process; import android.text.TextUtils; import android.util.Log; -import android.webkit.MimeTypeMap; import androidx.annotation.IntDef; import androidx.annotation.NonNull; @@ -45,20 +43,15 @@ import com.hippo.ehviewer.client.parser.GalleryPageApiParser; import com.hippo.ehviewer.client.parser.GalleryPageParser; import com.hippo.ehviewer.client.parser.GalleryPageUrlParser; import com.hippo.image.Image; -import com.hippo.streampipe.InputStreamPipe; import com.hippo.unifile.UniFile; import com.hippo.util.ExceptionUtils; -import com.hippo.yorozuya.IOUtils; import com.hippo.yorozuya.MathUtils; import com.hippo.yorozuya.OSUtils; import com.hippo.yorozuya.StringUtils; import com.hippo.yorozuya.thread.PriorityThread; import com.hippo.yorozuya.thread.PriorityThreadFactory; -import java.io.BufferedInputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -563,23 +556,7 @@ public final class SpiderQueen implements Runnable { return false; } - InputStreamPipe pipe = mSpiderDen.openInputStreamPipe(index); - if (null == pipe) { - return false; - } - - OutputStream os = null; - try { - os = file.openOutputStream(); - IOUtils.copy(pipe.open(), os); - return true; - } catch (IOException e) { - return false; - } finally { - pipe.close(); - pipe.release(); - IOUtils.closeQuietly(os); - } + return mSpiderDen.saveToUniFile(index, file); } @Nullable @@ -589,35 +566,13 @@ public final class SpiderQueen implements Runnable { return null; } - InputStreamPipe pipe = mSpiderDen.openInputStreamPipe(index); - if (null == pipe) { + var ext = mSpiderDen.getExtension(index); + UniFile dst = dir.subFile(null != ext ? filename + "." + ext : filename); + if (null == dst) { return null; } - - OutputStream os = null; - try { - // Get dst file - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inJustDecodeBounds = true; - BitmapFactory.decodeStream(pipe.open(), null, options); - pipe.close(); - String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(options.outMimeType); - UniFile dst = dir.subFile(null != extension ? filename + "." + extension : filename); - if (null == dst) { - return null; - } - - // Copy - os = dst.openOutputStream(); - IOUtils.copy(pipe.open(), os); - return dst; - } catch (IOException e) { - return null; - } finally { - pipe.close(); - pipe.release(); - IOUtils.closeQuietly(os); - } + if (!mSpiderDen.saveToUniFile(index, dst)) return null; + return dst; } @@ -628,25 +583,7 @@ public final class SpiderQueen implements Runnable { return null; } - InputStreamPipe pipe = mSpiderDen.openInputStreamPipe(index); - if (null == pipe) { - return null; - } - - try { - // Get dst file - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inJustDecodeBounds = true; - BitmapFactory.decodeStream(pipe.open(), null, options); - pipe.close(); - - return MimeTypeMap.getSingleton().getExtensionFromMimeType(options.outMimeType); - } catch (IOException e) { - return null; - } finally { - pipe.close(); - pipe.release(); - } + return mSpiderDen.getExtension(index); } // Mark as suspend fun when kotlinize, need IO @@ -1248,45 +1185,10 @@ public final class SpiderQueen implements Runnable { } } - InputStreamPipe isPipe = null; - try { - // Get InputStreamPipe - isPipe = mSpiderDen.openInputStreamPipe(index); - if (isPipe == null) { - // Can't get pipe - error = GetText.getString(R.string.error_reading_failed); - break; - } - - // Check plain txt - InputStream inputStream = new BufferedInputStream(isPipe.open()); - boolean isPlainTxt = true; - int j = 0; - for (; ; ) { - int b = inputStream.read(); - if (b == -1) { - break; - } - // Skip first three bytes - if (j < 3) { - j++; - continue; - } - if (b > 126) { - isPlainTxt = false; - break; - } - } - if (isPlainTxt) { - error = GetText.getString(R.string.error_reading_failed); - forceHtml = true; - continue; - } - } finally { - if (isPipe != null) { - isPipe.close(); - isPipe.release(); - } + if (mSpiderDen.checkPlainText(index)) { + error = GetText.getString(R.string.error_reading_failed); + forceHtml = true; + continue; } // Check Stopped