From 474634586e4feea4804fce6db5e86b794fadb64c Mon Sep 17 00:00:00 2001 From: Syer10 Date: Wed, 16 Jun 2021 16:59:25 -0400 Subject: [PATCH] Update to Tachidesk 0.4.3, save last page read offset in chapter meta --- build.gradle.kts | 2 +- scripts/SetupUnix.sh | 2 +- scripts/SetupWindows.ps1 | 2 +- .../kotlin/ca/gosyer/data/models/Chapter.kt | 18 +++++++++++++++++- .../kotlin/ca/gosyer/data/models/Manga.kt | 8 +++++++- .../interactions/ChapterInteractionHandler.kt | 19 +++++++++++++++++++ .../interactions/MangaInteractionHandler.kt | 18 ++++++++++++++++++ .../gosyer/data/server/requests/Chapters.kt | 3 +++ .../ca/gosyer/data/server/requests/Manga.kt | 3 +++ .../kotlin/ca/gosyer/ui/reader/ReaderMenu.kt | 5 ++++- .../gosyer/ui/reader/ReaderMenuViewModel.kt | 16 +++++++++++++++- .../ca/gosyer/ui/reader/viewer/Continuous.kt | 12 ++++++++++-- 12 files changed, 99 insertions(+), 9 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 02eb781c..9131bd7a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -169,7 +169,7 @@ buildConfig { packageName = project.group.toString() buildConfigField("boolean", "DEBUG", project.hasProperty("debugApp").toString()) - buildConfigField("String", "TACHIDESK_SP_VERSION", "v0.4.2") + buildConfigField("String", "TACHIDESK_SP_VERSION", "v0.4.3") } kotlinter { diff --git a/scripts/SetupUnix.sh b/scripts/SetupUnix.sh index f10e728e..7df318b1 100755 --- a/scripts/SetupUnix.sh +++ b/scripts/SetupUnix.sh @@ -10,7 +10,7 @@ echo "Getting latest Tachidesk build files" #TARBALL_LINK="$(curl -s "https://api.github.com/repos/Suwayomi/Tachidesk/releases/latest" | grep -o "https.*tarball\/[a-zA-Z0-9.]*")" #curl -L "$TARBALL_LINK" -o tmp/Tachidesk.tar -curl -L "https://github.com/Suwayomi/Tachidesk/archive/refs/tags/v0.4.2.tar.gz" -o tmp/Tachidesk.tar.gz +curl -L "https://github.com/Suwayomi/Tachidesk/archive/refs/tags/v0.4.3.tar.gz" -o tmp/Tachidesk.tar.gz tar -xvf tmp/Tachidesk.tar.gz -C tmp diff --git a/scripts/SetupWindows.ps1 b/scripts/SetupWindows.ps1 index 08a81740..b312bb8e 100644 --- a/scripts/SetupWindows.ps1 +++ b/scripts/SetupWindows.ps1 @@ -10,7 +10,7 @@ Write-Output "Getting latest Tachidesk build files" #Invoke-WebRequest -Uri $zipball.Matches.Value -OutFile tmp/Tachidesk.zip -UseBasicParsing -Invoke-WebRequest -Uri "https://github.com/Suwayomi/Tachidesk/archive/refs/tags/v0.4.2.zip" -OutFile tmp/Tachidesk.zip -UseBasicParsing +Invoke-WebRequest -Uri "https://github.com/Suwayomi/Tachidesk/archive/refs/tags/v0.4.3.zip" -OutFile tmp/Tachidesk.zip -UseBasicParsing Expand-Archive -Path "tmp/Tachidesk.zip" -DestinationPath "tmp" diff --git a/src/main/kotlin/ca/gosyer/data/models/Chapter.kt b/src/main/kotlin/ca/gosyer/data/models/Chapter.kt index 1efda819..5a1206cd 100644 --- a/src/main/kotlin/ca/gosyer/data/models/Chapter.kt +++ b/src/main/kotlin/ca/gosyer/data/models/Chapter.kt @@ -6,6 +6,7 @@ package ca.gosyer.data.models +import ca.gosyer.data.server.interactions.ChapterInteractionHandler import kotlinx.serialization.Serializable @Serializable @@ -23,5 +24,20 @@ data class Chapter( val chapterCount: Int?, val pageCount: Int?, val lastReadAt: Int?, - val downloaded: Boolean + val downloaded: Boolean, + val meta: ChapterMeta +) { + suspend fun updateRemote( + chapterHandler: ChapterInteractionHandler, + pageOffset: Int = meta.juiPageOffset + ) { + if (pageOffset != meta.juiPageOffset) { + chapterHandler.updateChapterMeta(this, "juiPageOffset", pageOffset.toString()) + } + } +} + +@Serializable +data class ChapterMeta( + var juiPageOffset: Int = 0 ) diff --git a/src/main/kotlin/ca/gosyer/data/models/Manga.kt b/src/main/kotlin/ca/gosyer/data/models/Manga.kt index 165d9e40..499a6354 100644 --- a/src/main/kotlin/ca/gosyer/data/models/Manga.kt +++ b/src/main/kotlin/ca/gosyer/data/models/Manga.kt @@ -23,7 +23,13 @@ data class Manga( val status: String, val inLibrary: Boolean, val source: Source?, - val freshData: Boolean + val freshData: Boolean, + val meta: MangaMeta ) { fun cover(serverUrl: String) = thumbnailUrl?.let { serverUrl + it } } + +@Serializable +data class MangaMeta( + val jui: Int? = null +) diff --git a/src/main/kotlin/ca/gosyer/data/server/interactions/ChapterInteractionHandler.kt b/src/main/kotlin/ca/gosyer/data/server/interactions/ChapterInteractionHandler.kt index e8c7cb53..05e9e3e3 100644 --- a/src/main/kotlin/ca/gosyer/data/server/interactions/ChapterInteractionHandler.kt +++ b/src/main/kotlin/ca/gosyer/data/server/interactions/ChapterInteractionHandler.kt @@ -15,6 +15,7 @@ import ca.gosyer.data.server.requests.getChapterQuery import ca.gosyer.data.server.requests.getMangaChaptersQuery import ca.gosyer.data.server.requests.getPageQuery import ca.gosyer.data.server.requests.queueDownloadChapterRequest +import ca.gosyer.data.server.requests.updateChapterMetaRequest import ca.gosyer.data.server.requests.updateChapterRequest import ca.gosyer.util.lang.withIOContext import io.ktor.client.request.HttpRequestBuilder @@ -153,4 +154,22 @@ class ChapterInteractionHandler @Inject constructor( suspend fun deleteChapterDownload(manga: Manga, chapterIndex: Int) = deleteChapterDownload(manga.id, chapterIndex) suspend fun deleteChapterDownload(manga: Manga, chapter: Chapter) = deleteChapterDownload(manga.id, chapter.index) + + suspend fun updateChapterMeta(mangaId: Long, chapterIndex: Int, key: String, value: String) = withIOContext { + client.submitFormRepeat( + serverUrl + updateChapterMetaRequest(mangaId, chapterIndex), + formParameters = Parameters.build { + append("key", key) + append("value", value) + } + ) { + method = HttpMethod.Patch + } + } + + suspend fun updateChapterMeta(chapter: Chapter, key: String, value: String) = updateChapterMeta(chapter.mangaId, chapter.index, key, value) + + suspend fun updateChapterMeta(manga: Manga, chapterIndex: Int, key: String, value: String) = updateChapterMeta(manga.id, chapterIndex, key, value) + + suspend fun updateChapterMeta(manga: Manga, chapter: Chapter, key: String, value: String) = updateChapterMeta(manga.id, chapter.index, key, value) } diff --git a/src/main/kotlin/ca/gosyer/data/server/interactions/MangaInteractionHandler.kt b/src/main/kotlin/ca/gosyer/data/server/interactions/MangaInteractionHandler.kt index 22b9a9ca..b5b0c4c9 100644 --- a/src/main/kotlin/ca/gosyer/data/server/interactions/MangaInteractionHandler.kt +++ b/src/main/kotlin/ca/gosyer/data/server/interactions/MangaInteractionHandler.kt @@ -11,9 +11,13 @@ import ca.gosyer.data.server.Http import ca.gosyer.data.server.ServerPreferences import ca.gosyer.data.server.requests.mangaQuery import ca.gosyer.data.server.requests.mangaThumbnailQuery +import ca.gosyer.data.server.requests.updateMangaMetaRequest import ca.gosyer.util.lang.withIOContext import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.parameter +import io.ktor.client.statement.HttpResponse +import io.ktor.http.HttpMethod +import io.ktor.http.Parameters import javax.inject.Inject class MangaInteractionHandler @Inject constructor( @@ -42,4 +46,18 @@ class MangaInteractionHandler @Inject constructor( block ) } + + suspend fun updateMangaMeta(mangaId: Long, key: String, value: String) = withIOContext { + client.submitFormRepeat( + serverUrl + updateMangaMetaRequest(mangaId), + formParameters = Parameters.build { + append("key", key) + append("value", value) + } + ) { + method = HttpMethod.Patch + } + } + + suspend fun updateMangaMeta(manga: Manga, key: String, value: String) = updateMangaMeta(manga.id, key, value) } diff --git a/src/main/kotlin/ca/gosyer/data/server/requests/Chapters.kt b/src/main/kotlin/ca/gosyer/data/server/requests/Chapters.kt index cbc6afd7..1016c859 100644 --- a/src/main/kotlin/ca/gosyer/data/server/requests/Chapters.kt +++ b/src/main/kotlin/ca/gosyer/data/server/requests/Chapters.kt @@ -29,3 +29,6 @@ fun queueDownloadChapterRequest(mangaId: Long, chapterIndex: Int) = @Delete fun deleteDownloadChapterRequest(mangaId: Long, chapterIndex: Int) = "/api/v1/download/$mangaId/chapter/$chapterIndex" + +fun updateChapterMetaRequest(mangaId: Long, chapterIndex: Int) = + "/api/v1/manga/$mangaId/chapter/$chapterIndex/meta" diff --git a/src/main/kotlin/ca/gosyer/data/server/requests/Manga.kt b/src/main/kotlin/ca/gosyer/data/server/requests/Manga.kt index 95067720..225b1121 100644 --- a/src/main/kotlin/ca/gosyer/data/server/requests/Manga.kt +++ b/src/main/kotlin/ca/gosyer/data/server/requests/Manga.kt @@ -13,3 +13,6 @@ fun mangaQuery(mangaId: Long) = @Get fun mangaThumbnailQuery(mangaId: Long) = "/api/v1/manga/$mangaId/thumbnail" + +fun updateMangaMetaRequest(mangaId: Long) = + "/api/v1/manga/$mangaId/meta" diff --git a/src/main/kotlin/ca/gosyer/ui/reader/ReaderMenu.kt b/src/main/kotlin/ca/gosyer/ui/reader/ReaderMenu.kt index fda0b754..f9275123 100644 --- a/src/main/kotlin/ca/gosyer/ui/reader/ReaderMenu.kt +++ b/src/main/kotlin/ca/gosyer/ui/reader/ReaderMenu.kt @@ -126,6 +126,7 @@ fun ReaderMenu(chapterIndex: Int, mangaId: Long, setHotkeys: (List>() val pageEmitter = _pageEmitter.asSharedFlow() @@ -147,7 +150,12 @@ class ReaderMenuViewModel @Inject constructor( } val lastPageRead = chapter.chapter.lastPageRead if (lastPageRead != 0) { - _currentPage.value = chapter.chapter.lastPageRead + _currentPage.value = lastPageRead + } + + val lastPageReadOffset = chapter.chapter.meta.juiPageOffset + if (lastPageReadOffset != 0) { + _currentPage.value = lastPageReadOffset } chapter.stateObserver @@ -186,5 +194,11 @@ class ReaderMenuViewModel @Inject constructor( } } + fun updateLastPageReadOffset(offset: Int) { + GlobalScope.launch { + chapter.value?.chapter?.updateRemote(chapterHandler, offset) + } + } + data class Params(val chapterIndex: Int, val mangaId: Long) } diff --git a/src/main/kotlin/ca/gosyer/ui/reader/viewer/Continuous.kt b/src/main/kotlin/ca/gosyer/ui/reader/viewer/Continuous.kt index 61eed02e..e6f70760 100644 --- a/src/main/kotlin/ca/gosyer/ui/reader/viewer/Continuous.kt +++ b/src/main/kotlin/ca/gosyer/ui/reader/viewer/Continuous.kt @@ -21,6 +21,7 @@ import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment @@ -44,6 +45,7 @@ fun ContinuousReader( maxSize: Int, padding: Int, currentPage: Int, + currentPageOffset: Int, previousChapter: ReaderChapter?, currentChapter: ReaderChapter, nextChapter: ReaderChapter?, @@ -51,10 +53,11 @@ fun ContinuousReader( pageContentScale: ContentScale, pageEmitter: SharedFlow>, retry: (ReaderPage) -> Unit, - progress: (Int) -> Unit + progress: (Int) -> Unit, + updateLastPageReadOffset: (Int) -> Unit ) { BoxWithConstraints { - val state = rememberLazyListState(currentPage) + val state = rememberLazyListState(currentPage, currentPageOffset) LaunchedEffect(Unit) { pageEmitter .mapLatest { (moveTo) -> @@ -66,6 +69,11 @@ fun ContinuousReader( } .launchIn(this) } + DisposableEffect(Unit) { + onDispose { + updateLastPageReadOffset(state.firstVisibleItemScrollOffset) + } + } val imageModifier = if (maxSize != 0) { when (direction) {