mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-10 06:42:05 +01:00
Update to Tachidesk 0.4.3, save last page read offset in chapter meta
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user