From b4f4d442eb74aaac7f620dab58fe6925165d6f77 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:58:32 +0800 Subject: [PATCH] Ensure images use .jpg extension instead of .jpeg --- .../com/hippo/ehviewer/spider/SpiderDen.kt | 24 +++++++--------- .../com/hippo/unifile/TreeDocumentFile.kt | 28 +++++-------------- 2 files changed, 17 insertions(+), 35 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderDen.kt b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderDen.kt index af0138970..a190bf1ad 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderDen.kt @@ -15,6 +15,7 @@ */ package com.hippo.ehviewer.spider +import android.webkit.MimeTypeMap import arrow.fx.coroutines.autoCloseable import arrow.fx.coroutines.closeable import arrow.fx.coroutines.parMap @@ -40,10 +41,9 @@ import eu.kanade.tachiyomi.util.lang.withNonCancellableContext import io.ktor.client.plugins.onDownload import io.ktor.client.statement.HttpResponse import io.ktor.client.statement.bodyAsChannel -import io.ktor.http.contentType +import io.ktor.client.statement.request import io.ktor.http.isSuccess import io.ktor.utils.io.jvm.nio.copyTo -import java.util.Locale import kotlin.io.path.readText class SpiderDen(val info: GalleryInfo) { @@ -77,7 +77,7 @@ class SpiderDen(val info: GalleryInfo) { val key = getImageKey(gid, index) return runCatching { sCache.read(key) { - val extension = "." + metadata.toFile().readText() + val extension = metadata.toFile().readText() val file = dir.createFile(perFilename(index, extension)) ?: return false data.asUniFile() sendTo file true @@ -118,8 +118,7 @@ class SpiderDen(val info: GalleryInfo) { private fun findDownloadFileForIndex(index: Int, extension: String): UniFile? { val dir = downloadDir ?: return null - val ext = ".$extension" - return dir.createFile(perFilename(index, ext)) + return dir.createFile(perFilename(index, extension)) } suspend fun makeHttpCallAndSaveImage( @@ -163,8 +162,8 @@ class SpiderDen(val info: GalleryInfo) { } private suspend fun saveFromHttpResponse(index: Int, response: HttpResponse): Boolean { - val contentType = response.contentType() - val extension = contentType?.contentSubtype ?: "jpg" + val url = response.request.url.toString() + val extension = MimeTypeMap.getFileExtensionFromUrl(url).takeUnless { it.isEmpty() } ?: "jpg" return saveResponseMeta(index, extension) { outFile -> outFile.openOutputStream().use { val chan = it.channel.apply { truncate(0) } @@ -236,7 +235,7 @@ class SpiderDen(val info: GalleryInfo) { val (fdBatch, names) = (0 until pages).parMap { idx -> val ext = requireNotNull(getExtension(idx)) val f = autoCloseable { requireNotNull(getImageSource(idx)) } - closeable { f.source.openFileDescriptor("r") }.fd to perFilename(idx, ".$ext") + closeable { f.source.openFileDescriptor("r") }.fd to perFilename(idx, ext) }.run { plus(comicInfo.fd to COMIC_INFO_FILE) }.unzip() val arcFd = closeable { file.openFileDescriptor("rw") } archiveFdBatch(fdBatch.toIntArray(), names.toTypedArray(), arcFd.fd, pages + 1) @@ -262,15 +261,12 @@ class SpiderDen(val info: GalleryInfo) { } } -/** - * @param extension with dot - */ -fun perFilename(index: Int, extension: String?): String { - return String.format(Locale.US, "%08d%s", index + 1, extension) +fun perFilename(index: Int, extension: String = ""): String { + return "%08d.%s".format(index + 1, extension) } private fun findImageFile(dir: UniFile, index: Int): UniFile? { - val head = perFilename(index, ".") + val head = perFilename(index) return dir.findFirst { name -> name.startsWith(head) } } diff --git a/app/src/main/kotlin/com/hippo/unifile/TreeDocumentFile.kt b/app/src/main/kotlin/com/hippo/unifile/TreeDocumentFile.kt index 0c473f309..776b4cb92 100644 --- a/app/src/main/kotlin/com/hippo/unifile/TreeDocumentFile.kt +++ b/app/src/main/kotlin/com/hippo/unifile/TreeDocumentFile.kt @@ -50,27 +50,13 @@ class TreeDocumentFile( if (child != null) { if (child.isFile) return child } else { - val index = displayName.lastIndexOf('.') - if (index > 0) { - val name = displayName.substring(0, index) - val extension = displayName.substring(index + 1) - val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) - if (!mimeType.isNullOrEmpty()) { - val result = DocumentsContractApi21.createFile(uri, mimeType, name) - if (result != null) { - val f = TreeDocumentFile(this, result, displayName) - popCacheIfPresent(f) - return f - } - } - } else { - // Not dot in displayName or dot is the first char or can't get MimeType - val result = DocumentsContractApi21.createFile(uri, "application/octet-stream", displayName) - if (result != null) { - val f = TreeDocumentFile(this, result, displayName) - popCacheIfPresent(f) - return f - } + val extension = displayName.substringAfterLast('.', "") + val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) ?: "application/octet-stream" + val result = DocumentsContractApi21.createFile(uri, mimeType, displayName) + if (result != null) { + val f = TreeDocumentFile(this, result, displayName) + popCacheIfPresent(f) + return f } } return null