Update to Tachidesk 0.4.3, save last page read offset in chapter meta

This commit is contained in:
Syer10
2021-06-16 16:59:25 -04:00
parent 51e8718c29
commit 474634586e
12 changed files with 99 additions and 9 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -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"

View File

@@ -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
)

View File

@@ -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
)

View File

@@ -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<HttpResponse>(
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)
}

View File

@@ -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<HttpResponse>(
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)
}

View File

@@ -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"

View File

@@ -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"

View File

@@ -126,6 +126,7 @@ fun ReaderMenu(chapterIndex: Int, mangaId: Long, setHotkeys: (List<KeyboardShort
val maxSize by vm.readerModeSettings.maxSize.collectAsState()
val navigationMode by vm.readerModeSettings.navigationMode.collectAsState()
val currentPage by vm.currentPage.collectAsState()
val currentPageOffset by vm.currentPageOffset.collectAsState()
LaunchedEffect(Unit) {
setHotkeys(
listOf(
@@ -160,6 +161,7 @@ fun ReaderMenu(chapterIndex: Int, mangaId: Long, setHotkeys: (List<KeyboardShort
maxSize,
padding,
currentPage,
currentPageOffset,
previousChapter,
chapter,
nextChapter,
@@ -175,7 +177,8 @@ fun ReaderMenu(chapterIndex: Int, mangaId: Long, setHotkeys: (List<KeyboardShort
},
vm.pageEmitter,
vm::retry,
vm::progress
vm::progress,
vm::updateLastPageReadOffset
)
} else {
PagerReader(

View File

@@ -52,6 +52,9 @@ class ReaderMenuViewModel @Inject constructor(
private val _currentPage = MutableStateFlow(1)
val currentPage = _currentPage.asStateFlow()
private val _currentPageOffset = MutableStateFlow(1)
val currentPageOffset = _currentPageOffset.asStateFlow()
private val _pageEmitter = MutableSharedFlow<Pair<MoveTo, Int>>()
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)
}

View File

@@ -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<Pair<MoveTo, Int>>,
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) {