From f08e124df60b9b5d844213229af3364addc6428a Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Mon, 3 Jul 2023 20:57:44 +0800 Subject: [PATCH] Support downloading original images in reader --- .../ehviewer/gallery/ArchivePageLoader.kt | 2 +- .../hippo/ehviewer/gallery/EhPageLoader.kt | 4 ++-- .../com/hippo/ehviewer/spider/SpiderQueen.kt | 22 ++++++++++--------- .../tachiyomi/ui/reader/ReaderPageSheet.kt | 6 +++++ .../tachiyomi/ui/reader/loader/PageLoader.kt | 6 ++--- .../ui/reader/viewer/pager/PagerPageHolder.kt | 1 + .../viewer/webtoon/WebtoonPageHolder.kt | 1 + app/src/main/res/layout/reader_page_sheet.xml | 15 +++++++++++++ 8 files changed, 41 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt index 57d674bb7..ab5b346db 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt @@ -128,7 +128,7 @@ class ArchivePageLoader(context: Context, private val uri: Uri, passwdFlow: Flow notifyPageSucceed(index, image) } - override fun onForceRequest(index: Int) { + override fun onForceRequest(index: Int, orgImg: Boolean) { onRequest(index) } diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/EhPageLoader.kt b/app/src/main/java/com/hippo/ehviewer/gallery/EhPageLoader.kt index feb736400..faeb9dfbf 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/EhPageLoader.kt +++ b/app/src/main/java/com/hippo/ehviewer/gallery/EhPageLoader.kt @@ -76,8 +76,8 @@ class EhPageLoader(private val mGalleryInfo: GalleryInfo) : PageLoader2(), OnSpi mSpiderQueen.request(index) } - override fun onForceRequest(index: Int) { - mSpiderQueen.forceRequest(index) + override fun onForceRequest(index: Int, orgImg: Boolean) { + mSpiderQueen.forceRequest(index, orgImg) } override suspend fun awaitReady(): Boolean { diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt index 134fc3057..b33d23496 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -255,8 +255,8 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS val error: String? get() = null - fun forceRequest(index: Int) { - request(index, true) + fun forceRequest(index: Int, orgImg: Boolean) { + request(index, true, orgImg) } fun request(index: Int) { @@ -281,7 +281,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS mWorkerScope.updateRAList(pages, pair) } - private fun request(index: Int, force: Boolean) { + private fun request(index: Int, force: Boolean, orgImg: Boolean = false) { // Get page state val state = getPageState(index) @@ -290,7 +290,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS // Update state to none at once updatePageState(index, STATE_NONE) } - mWorkerScope.launch(index, force) + mWorkerScope.launch(index, force, orgImg) } fun save(index: Int, file: UniFile): Boolean { @@ -558,7 +558,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS } } - private fun doLaunchDownloadJob(index: Int, force: Boolean) { + private fun doLaunchDownloadJob(index: Int, force: Boolean, orgImg: Boolean = false) { val state = mPageStateArray[index] if (!force && state == STATE_FINISHED) return val currentJob = mFetcherJobMap[index] @@ -566,7 +566,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS if (currentJob?.isActive != true) { mFetcherJobMap[index] = launch { mSemaphore.withPermit { - doInJob(index, force) + doInJob(index, force, orgImg) } }.apply { invokeOnCompletion { @@ -579,14 +579,16 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS } } - fun launch(index: Int, force: Boolean = false) { + fun launch(index: Int, force: Boolean = false, orgImg: Boolean) { check(index in 0 until size) - if (!isDownloadMode) synchronized(mFetcherJobMap) { doLaunchDownloadJob(index, force) } + if (!isDownloadMode) { + synchronized(mFetcherJobMap) { doLaunchDownloadJob(index, force, orgImg) } + } if (force) decoder.cancel(index) decoder.launch(index) } - private suspend fun doInJob(index: Int, force: Boolean) { + private suspend fun doInJob(index: Int, force: Boolean, orgImg: Boolean) { suspend fun getPToken(index: Int): String? { if (index !in 0 until size) return null return mSpiderInfo.pTokenMap[index].takeIf { it != TOKEN_FAILED } @@ -715,7 +717,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS val targetImageUrl: String? val referer: String? - if (Settings.downloadOriginImage && !originImageUrl.isNullOrBlank()) { + if ((Settings.downloadOriginImage || orgImg) && !originImageUrl.isNullOrBlank()) { targetImageUrl = originImageUrl referer = EhUrl.getPageUrl(mSpiderInfo.gid, index, pToken) } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt index 4bf795fa7..7fa24ddb8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt @@ -24,6 +24,7 @@ class ReaderPageSheet( binding.save.setOnClickListener { save() } binding.saveTo.setOnClickListener { saveTo() } binding.refresh.setOnClickListener { refresh() } + binding.refreshOrgImg.setOnClickListener { refreshOrgImg() } return binding.root } @@ -64,4 +65,9 @@ class ReaderPageSheet( activity.mGalleryProvider?.retryPage(page.index) dismiss() } + + private fun refreshOrgImg() { + activity.mGalleryProvider?.retryPage(page.index, true) + dismiss() + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt index 68d42af82..00c4c0ed1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt @@ -53,16 +53,16 @@ abstract class PageLoader { preloadPages(pagesAbsent, (index - 10).coerceAtLeast(0) to (mPreloads + index + 10).coerceAtMost(size)) } - fun retryPage(index: Int) { + fun retryPage(index: Int, orgImg: Boolean = false) { notifyPageWait(index) - onForceRequest(index) + onForceRequest(index, orgImg) } protected abstract fun preloadPages(pages: List, pair: Pair) protected abstract fun onRequest(index: Int) - protected abstract fun onForceRequest(index: Int) + protected abstract fun onForceRequest(index: Int, orgImg: Boolean) fun cancelRequest(index: Int) { onCancelRequest(index) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt index d03ab72e6..4300cbf22 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt @@ -131,6 +131,7 @@ class PagerPageHolder( private fun setQueued() { progressIndicator.show() errorLayout?.root?.isVisible = false + recycle() } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt index 13928d21e..13710049e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt @@ -171,6 +171,7 @@ class WebtoonPageHolder( progressContainer.isVisible = true progressIndicator.show() removeErrorLayout() + frame.recycle() } /** diff --git a/app/src/main/res/layout/reader_page_sheet.xml b/app/src/main/res/layout/reader_page_sheet.xml index 9e85e14cb..e1757f7cb 100644 --- a/app/src/main/res/layout/reader_page_sheet.xml +++ b/app/src/main/res/layout/reader_page_sheet.xml @@ -20,6 +20,21 @@ app:drawableStartCompat="@drawable/v_refresh_dark_x24" app:drawableTint="?attr/colorOnBackground" /> + +