diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhCacheKeyFactory.kt b/app/src/main/java/com/hippo/ehviewer/client/EhCacheKeyFactory.kt index c2df053c5..7062200a1 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhCacheKeyFactory.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhCacheKeyFactory.kt @@ -18,8 +18,8 @@ package com.hippo.ehviewer.client import com.hippo.ehviewer.client.data.GalleryPreview import com.hippo.ehviewer.client.data.NormalGalleryPreview -// ExHentai Large Preview: https://exhentai.org/t/*** -// ExHentai Normal Preview: https://exhentai.org/m/*** +// ExHentai Large Preview: https://s.exhentai.org/t/*** +// ExHentai Normal Preview: https://s.exhentai.org/m/*** // EHentai Normal Preview: https://ehgt.org/m/*** // EHentai Large Preview: https://ehgt.org/*** @@ -30,12 +30,12 @@ fun getImageKey(gid: Long, index: Int): String { return "image:$gid:$index" } -fun getPreviewThumbKey(url: String): String { - return url.removePrefix(URL_PREFIX_THUMB_E) - .removePrefix(URL_PREFIX_THUMB_EX) - .removePrefix("t/") +fun getThumbKey(url: String): String { + return url.removePrefix(URL_PREFIX_THUMB_E).removePrefix(URL_PREFIX_THUMB_EX).removePrefix("t/") } +fun getUrlByThumbKey(key: String): String = if (EhUtils.isExHentai) URL_PREFIX_THUMB_EX + "t/" + key else URL_PREFIX_THUMB_E + key + val GalleryPreview.url get() = if (this is NormalGalleryPreview) { if (EhUtils.isExHentai) URL_PREFIX_THUMB_EX + imageKey else URL_PREFIX_THUMB_E + imageKey diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt index b111459f0..b619c49a2 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt @@ -5,7 +5,7 @@ interface AbstractGalleryInfo { var token: String? var title: String? var titleJpn: String? - var thumb: String? + var thumbKey: String? var category: Int var posted: String? var uploader: String? diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt index 1d64ca3a3..6f0021e8d 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt @@ -36,7 +36,7 @@ open class BaseGalleryInfo( override var titleJpn: String? = null, @ColumnInfo(name = "THUMB") - override var thumb: String? = null, + override var thumbKey: String? = null, @ColumnInfo(name = "CATEGORY") override var category: Int = 0, diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryApiParser.kt b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryApiParser.kt index cfd46dd71..88fb142c8 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryApiParser.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryApiParser.kt @@ -18,6 +18,7 @@ package com.hippo.ehviewer.client.parser import com.hippo.ehviewer.client.EhUtils.getCategory import com.hippo.ehviewer.client.EhUtils.handleThumbUrlResolution import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.getThumbKey import com.hippo.ehviewer.yorozuya.NumberUtils import org.json.JSONObject @@ -32,7 +33,7 @@ object GalleryApiParser { gi.title = ParserUtils.trim(g.getString("title")) gi.titleJpn = ParserUtils.trim(g.getString("title_jpn")) gi.category = getCategory(g.getString("category")) - gi.thumb = handleThumbUrlResolution(g.getString("thumb")) + gi.thumbKey = getThumbKey(handleThumbUrlResolution(g.getString("thumb"))!!) gi.uploader = g.getString("uploader") gi.posted = ParserUtils.formatDate(ParserUtils.parseLong(g.getString("posted"), 0) * 1000) diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt index 38d13a98b..d582f12a1 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt @@ -33,7 +33,7 @@ import com.hippo.ehviewer.client.exception.EhException import com.hippo.ehviewer.client.exception.OffensiveException import com.hippo.ehviewer.client.exception.ParseException import com.hippo.ehviewer.client.exception.PiningException -import com.hippo.ehviewer.client.getPreviewThumbKey +import com.hippo.ehviewer.client.getThumbKey import com.hippo.ehviewer.util.ExceptionUtils import com.hippo.ehviewer.util.JsoupUtils import com.hippo.ehviewer.yorozuya.NumberUtils @@ -130,9 +130,11 @@ object GalleryDetailParser { val gm = d.getElementsByClass("gm")[0] // Thumb url gm.getElementById("gd1")?.child(0)?.attr("style")?.trim()?.let { - gd.thumb = PATTERN_COVER.find(it)?.run { - handleThumbUrlResolution(groupValues[3]) - } + gd.thumbKey = getThumbKey( + PATTERN_COVER.find(it)?.run { + handleThumbUrlResolution(groupValues[3]) + }!!, + ) } gd.title = gm.getElementById("gn")?.text()?.trim() @@ -481,7 +483,7 @@ object GalleryDetailParser { check(PATTERN_LARGE_PREVIEW.containsMatchIn(body)) return PATTERN_LARGE_PREVIEW.findAll(body).unzip { val position = it.groupValues[2].toInt() - 1 - val imageKey = getPreviewThumbKey(it.groupValues[3].trim()) + val imageKey = getThumbKey(it.groupValues[3].trim()) val pageUrl = it.groupValues[1].trim() LargeGalleryPreview(imageKey, position) to pageUrl }.run { @@ -493,7 +495,7 @@ object GalleryDetailParser { check(PATTERN_NORMAL_PREVIEW.containsMatchIn(body)) return PATTERN_NORMAL_PREVIEW.findAll(body).unzip { val position = it.groupValues[6].toInt() - 1 - val imageKey = getPreviewThumbKey(it.groupValues[3].trim()) + val imageKey = getThumbKey(it.groupValues[3].trim()) val xOffset = it.groupValues[4].toIntOrNull() ?: 0 val width = it.groupValues[1].toInt() val height = it.groupValues[2].toInt() diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.kt b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.kt index 40401af2f..edd972813 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.kt @@ -21,6 +21,7 @@ import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.client.exception.ParseException +import com.hippo.ehviewer.client.getThumbKey import com.hippo.ehviewer.util.ExceptionUtils import com.hippo.ehviewer.util.JsoupUtils import com.hippo.ehviewer.yorozuya.NumberUtils @@ -160,7 +161,7 @@ object GalleryListParser { url = img.attr("src") } if (url.isNotEmpty()) { - gi.thumb = EhUtils.handleThumbUrlResolution(url) + gi.thumbKey = EhUtils.handleThumbUrlResolution(url) } } @@ -174,7 +175,7 @@ object GalleryListParser { } } // Try extended and thumbnail version - if (gi.thumb == null) { + if (gi.thumbKey == null) { var gl = JsoupUtils.getElementByClass(e, "gl1e") if (gl == null) { gl = JsoupUtils.getElementByClass(e, "gl3t") @@ -192,11 +193,13 @@ object GalleryListParser { gi.thumbWidth = 0 gi.thumbHeight = 0 } - gi.thumb = EhUtils.handleThumbUrlResolution(img.attr("src")) + gi.thumbKey = EhUtils.handleThumbUrlResolution(img.attr("src")) } } } + gi.thumbKey = getThumbKey(gi.thumbKey!!) + // Posted val posted = e.getElementById("posted_" + gi.gid) if (posted != null) { diff --git a/app/src/main/java/com/hippo/ehviewer/coil/Extensions.kt b/app/src/main/java/com/hippo/ehviewer/coil/Extensions.kt index a3ce9e940..fe1d8604f 100644 --- a/app/src/main/java/com/hippo/ehviewer/coil/Extensions.kt +++ b/app/src/main/java/com/hippo/ehviewer/coil/Extensions.kt @@ -10,17 +10,14 @@ import coil.request.CachePolicy import coil.request.ImageRequest import coil.size.Size import com.hippo.ehviewer.client.data.GalleryPreview -import com.hippo.ehviewer.client.getPreviewThumbKey +import com.hippo.ehviewer.client.getUrlByThumbKey import com.hippo.ehviewer.client.url -fun ImageRequest.Builder.ehUrl(url: String?) = apply { - url?.let { - val key = getPreviewThumbKey(url) - data(url) - memoryCacheKey(key) - diskCacheKey(key) - size(Size.ORIGINAL) - } +fun ImageRequest.Builder.ehUrl(key: String) = apply { + data(getUrlByThumbKey(key)) + memoryCacheKey(key) + diskCacheKey(key) + size(Size.ORIGINAL) } fun ImageRequest.Builder.ehPreviewKey(key: GalleryPreview) = apply { @@ -39,5 +36,5 @@ fun ImageRequest.Builder.justDownload() = apply { } inline fun Context.imageRequest(key: GalleryPreview, builder: ImageRequest.Builder.() -> Unit = {}) = ImageRequest.Builder(this).ehPreviewKey(key).apply(builder).build() -inline fun Context.imageRequest(key: String?, builder: ImageRequest.Builder.() -> Unit = {}) = ImageRequest.Builder(this).ehUrl(key).apply(builder).build() +inline fun Context.imageRequest(key: String, builder: ImageRequest.Builder.() -> Unit = {}) = ImageRequest.Builder(this).ehUrl(key).apply(builder).build() inline fun diskCache(builder: DiskCache.Builder.() -> Unit) = DiskCache.Builder().apply(builder).build() diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.kt b/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.kt index 25f8bac5a..8abb5d028 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.kt @@ -49,7 +49,7 @@ class DownloadInfo() : BaseGalleryInfo() { token = galleryInfo.token title = galleryInfo.title titleJpn = galleryInfo.titleJpn - thumb = galleryInfo.thumb + thumbKey = galleryInfo.thumbKey this.category = galleryInfo.category posted = galleryInfo.posted uploader = galleryInfo.uploader diff --git a/app/src/main/java/com/hippo/ehviewer/dao/EhDatabase.kt b/app/src/main/java/com/hippo/ehviewer/dao/EhDatabase.kt index 025b1c131..490741d46 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/EhDatabase.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/EhDatabase.kt @@ -5,10 +5,32 @@ import androidx.room.AutoMigration import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +private val EHDB_MIGRATION_4_5 = object : Migration(4, 5) { + override fun migrate(db: SupportSQLiteDatabase) { + val needMigrationTables = arrayOf( + "DOWNLOADS", + "HISTORY", + "LOCAL_FAVORITES", + ) + val prefixToRemove = arrayOf( + "https://ehgt.org/", + "https://s.exhentai.org/t/", + "https://exhentai.org/t/", + ) + needMigrationTables.forEach { table -> + prefixToRemove.forEach { prefix -> + db.execSQL("UPDATE $table SET thumb = SUBSTR(thumb ,LENGTH('$prefix') + 1) WHERE thumb LIKE '$prefix%'") + } + } + } +} @Database( entities = [BookmarkInfo::class, DownloadInfo::class, DownloadLabel::class, DownloadDirname::class, Filter::class, HistoryInfo::class, LocalFavoriteInfo::class, QuickSearch::class], - version = 4, + version = 5, exportSchema = false, ) abstract class EhDatabase : RoomDatabase() { @@ -40,6 +62,7 @@ abstract class CookiesDatabase : RoomDatabase() { fun buildMainDB(context: Context): EhDatabase { // TODO: Remove allowMainThreadQueries return Room.databaseBuilder(context, EhDatabase::class.java, "eh.db").allowMainThreadQueries() + .addMigrations(EHDB_MIGRATION_4_5) .build() } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.kt b/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.kt index 7fc6e0b9c..b808e58bf 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.kt @@ -27,7 +27,7 @@ class HistoryInfo() : BaseGalleryInfo() { token = galleryInfo.token title = galleryInfo.title titleJpn = galleryInfo.titleJpn - thumb = galleryInfo.thumb + thumbKey = galleryInfo.thumbKey this.category = galleryInfo.category posted = galleryInfo.posted uploader = galleryInfo.uploader diff --git a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.kt b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.kt index b053008a5..f0c247a5c 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.kt @@ -16,7 +16,7 @@ class LocalFavoriteInfo() : BaseGalleryInfo() { token = galleryInfo.token title = galleryInfo.title titleJpn = galleryInfo.titleJpn - thumb = galleryInfo.thumb + thumbKey = galleryInfo.thumbKey this.category = galleryInfo.category posted = galleryInfo.posted uploader = galleryInfo.uploader diff --git a/app/src/main/java/com/hippo/ehviewer/ui/GalleryInfoBottomSheet.kt b/app/src/main/java/com/hippo/ehviewer/ui/GalleryInfoBottomSheet.kt index 59beadf44..3b8f5bdc7 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryInfoBottomSheet.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryInfoBottomSheet.kt @@ -39,6 +39,7 @@ import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.GalleryDetail +import com.hippo.ehviewer.client.getUrlByThumbKey import com.hippo.ehviewer.ui.login.LocalNavController import com.hippo.ehviewer.util.tellClipboardWithToast @@ -82,7 +83,7 @@ fun GalleryInfoBottomSheet( EhUrl.getGalleryDetailUrl(gid, token), title, titleJpn, - thumb, + getUrlByThumbKey(thumbKey!!), EhUtils.getCategory(category), uploader, posted, diff --git a/app/src/main/java/com/hippo/ehviewer/ui/compose/EhAsyncThumb.kt b/app/src/main/java/com/hippo/ehviewer/ui/compose/EhAsyncThumb.kt index aef0078de..58d83304e 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/compose/EhAsyncThumb.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/compose/EhAsyncThumb.kt @@ -16,13 +16,13 @@ import com.hippo.ehviewer.coil.imageRequest @Composable @ReadOnlyComposable -fun requestOf(model: String?): ImageRequest { +fun requestOf(model: String): ImageRequest { return LocalContext.current.imageRequest(model) } @Composable fun EhAsyncThumb( - model: String?, + model: String, modifier: Modifier = Modifier, contentScale: ContentScale = ContentScale.Fit, ) = AsyncImage( @@ -34,12 +34,12 @@ fun EhAsyncThumb( @Composable fun EhAsyncCropThumb( - model: String?, + key: String, modifier: Modifier = Modifier, ) { var contentScale by remember { mutableStateOf(ContentScale.Fit) } AsyncImage( - model = requestOf(model), + model = requestOf(key), contentDescription = null, modifier = modifier, onState = { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryDetail.kt b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryDetail.kt index 342c68f85..5e8dd7ddc 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryDetail.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryDetail.kt @@ -103,7 +103,7 @@ fun GalleryDetailHeaderCard( Row { Card { EhAsyncCropThumb( - model = remember(info.thumb) { info.thumb }, + key = remember(info.thumbKey!!) { info.thumbKey!! }, modifier = Modifier.height(dimensionResource(id = R.dimen.gallery_detail_thumb_height)).width(dimensionResource(id = R.dimen.gallery_detail_thumb_width)), ) } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryInfo.kt index eb4e8a9d4..cd3baa9fc 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryInfo.kt @@ -57,7 +57,7 @@ fun GalleryInfoListItem( Row { Card { EhAsyncCropThumb( - model = info.thumb, + key = info.thumbKey!!, modifier = Modifier.aspectRatio(0.6666667F).fillMaxSize(), ) } @@ -141,7 +141,7 @@ fun GalleryInfoGridItem( ) { Box { EhAsyncThumb( - model = info.thumb, + model = info.thumbKey!!, modifier = Modifier.aspectRatio(aspect).fillMaxWidth(), contentScale = ContentScale.Crop, ) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt index 9748e0865..79518de15 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt @@ -867,7 +867,7 @@ class DownloadsScene : onClick = ::onClick.partially1(binding.thumb), ) { EhAsyncCropThumb( - model = info.thumb, + key = info.thumbKey!!, modifier = Modifier .height(height) .aspectRatio(0.6666667F), diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index b3aab5b67..22cf8d630 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -133,7 +133,6 @@ import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.client.data.GalleryTagGroup import com.hippo.ehviewer.client.data.ListUrlBuilder import com.hippo.ehviewer.client.exception.NoHAtHClientException -import com.hippo.ehviewer.client.getPreviewThumbKey import com.hippo.ehviewer.client.parser.ArchiveParser import com.hippo.ehviewer.client.parser.HomeParser import com.hippo.ehviewer.client.parser.ParserUtils @@ -1217,7 +1216,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { return } try { - val key = getPreviewThumbKey(composeBindingGI!!.thumb!!) + val key = composeBindingGI!!.thumbKey!! val path = imageLoader(context).diskCache!![key]!!.use { it.data } val lub = ListUrlBuilder() lub.mode = ListUrlBuilder.MODE_IMAGE_SEARCH diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt index 1a9b9c8a0..6ff0fbeeb 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt @@ -1053,7 +1053,7 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, SearchLayout.H private fun onGetGalleryListSuccess(result: GalleryListParser.Result, taskId: Int) { if (Settings.preloadThumbAggressively) { lifecycleScope.launchIO { - result.galleryInfoList.forEach { context?.run { imageLoader.enqueue(imageRequest(it.thumb) { justDownload() }) } } + result.galleryInfoList.forEach { context?.run { imageLoader.enqueue(imageRequest(it.thumbKey!!) { justDownload() }) } } } } if (mHelper != null && mHelper!!.isCurrentTask(taskId)) {