mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-15 17:22:03 +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()
|
packageName = project.group.toString()
|
||||||
|
|
||||||
buildConfigField("boolean", "DEBUG", project.hasProperty("debugApp").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 {
|
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.]*")"
|
#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 "$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
|
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 $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"
|
Expand-Archive -Path "tmp/Tachidesk.zip" -DestinationPath "tmp"
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
package ca.gosyer.data.models
|
package ca.gosyer.data.models
|
||||||
|
|
||||||
|
import ca.gosyer.data.server.interactions.ChapterInteractionHandler
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@@ -23,5 +24,20 @@ data class Chapter(
|
|||||||
val chapterCount: Int?,
|
val chapterCount: Int?,
|
||||||
val pageCount: Int?,
|
val pageCount: Int?,
|
||||||
val lastReadAt: 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 status: String,
|
||||||
val inLibrary: Boolean,
|
val inLibrary: Boolean,
|
||||||
val source: Source?,
|
val source: Source?,
|
||||||
val freshData: Boolean
|
val freshData: Boolean,
|
||||||
|
val meta: MangaMeta
|
||||||
) {
|
) {
|
||||||
fun cover(serverUrl: String) = thumbnailUrl?.let { serverUrl + it }
|
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.getMangaChaptersQuery
|
||||||
import ca.gosyer.data.server.requests.getPageQuery
|
import ca.gosyer.data.server.requests.getPageQuery
|
||||||
import ca.gosyer.data.server.requests.queueDownloadChapterRequest
|
import ca.gosyer.data.server.requests.queueDownloadChapterRequest
|
||||||
|
import ca.gosyer.data.server.requests.updateChapterMetaRequest
|
||||||
import ca.gosyer.data.server.requests.updateChapterRequest
|
import ca.gosyer.data.server.requests.updateChapterRequest
|
||||||
import ca.gosyer.util.lang.withIOContext
|
import ca.gosyer.util.lang.withIOContext
|
||||||
import io.ktor.client.request.HttpRequestBuilder
|
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, chapterIndex: Int) = deleteChapterDownload(manga.id, chapterIndex)
|
||||||
|
|
||||||
suspend fun deleteChapterDownload(manga: Manga, chapter: Chapter) = deleteChapterDownload(manga.id, chapter.index)
|
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.ServerPreferences
|
||||||
import ca.gosyer.data.server.requests.mangaQuery
|
import ca.gosyer.data.server.requests.mangaQuery
|
||||||
import ca.gosyer.data.server.requests.mangaThumbnailQuery
|
import ca.gosyer.data.server.requests.mangaThumbnailQuery
|
||||||
|
import ca.gosyer.data.server.requests.updateMangaMetaRequest
|
||||||
import ca.gosyer.util.lang.withIOContext
|
import ca.gosyer.util.lang.withIOContext
|
||||||
import io.ktor.client.request.HttpRequestBuilder
|
import io.ktor.client.request.HttpRequestBuilder
|
||||||
import io.ktor.client.request.parameter
|
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
|
import javax.inject.Inject
|
||||||
|
|
||||||
class MangaInteractionHandler @Inject constructor(
|
class MangaInteractionHandler @Inject constructor(
|
||||||
@@ -42,4 +46,18 @@ class MangaInteractionHandler @Inject constructor(
|
|||||||
block
|
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
|
@Delete
|
||||||
fun deleteDownloadChapterRequest(mangaId: Long, chapterIndex: Int) =
|
fun deleteDownloadChapterRequest(mangaId: Long, chapterIndex: Int) =
|
||||||
"/api/v1/download/$mangaId/chapter/$chapterIndex"
|
"/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
|
@Get
|
||||||
fun mangaThumbnailQuery(mangaId: Long) =
|
fun mangaThumbnailQuery(mangaId: Long) =
|
||||||
"/api/v1/manga/$mangaId/thumbnail"
|
"/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 maxSize by vm.readerModeSettings.maxSize.collectAsState()
|
||||||
val navigationMode by vm.readerModeSettings.navigationMode.collectAsState()
|
val navigationMode by vm.readerModeSettings.navigationMode.collectAsState()
|
||||||
val currentPage by vm.currentPage.collectAsState()
|
val currentPage by vm.currentPage.collectAsState()
|
||||||
|
val currentPageOffset by vm.currentPageOffset.collectAsState()
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
setHotkeys(
|
setHotkeys(
|
||||||
listOf(
|
listOf(
|
||||||
@@ -160,6 +161,7 @@ fun ReaderMenu(chapterIndex: Int, mangaId: Long, setHotkeys: (List<KeyboardShort
|
|||||||
maxSize,
|
maxSize,
|
||||||
padding,
|
padding,
|
||||||
currentPage,
|
currentPage,
|
||||||
|
currentPageOffset,
|
||||||
previousChapter,
|
previousChapter,
|
||||||
chapter,
|
chapter,
|
||||||
nextChapter,
|
nextChapter,
|
||||||
@@ -175,7 +177,8 @@ fun ReaderMenu(chapterIndex: Int, mangaId: Long, setHotkeys: (List<KeyboardShort
|
|||||||
},
|
},
|
||||||
vm.pageEmitter,
|
vm.pageEmitter,
|
||||||
vm::retry,
|
vm::retry,
|
||||||
vm::progress
|
vm::progress,
|
||||||
|
vm::updateLastPageReadOffset
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
PagerReader(
|
PagerReader(
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ class ReaderMenuViewModel @Inject constructor(
|
|||||||
private val _currentPage = MutableStateFlow(1)
|
private val _currentPage = MutableStateFlow(1)
|
||||||
val currentPage = _currentPage.asStateFlow()
|
val currentPage = _currentPage.asStateFlow()
|
||||||
|
|
||||||
|
private val _currentPageOffset = MutableStateFlow(1)
|
||||||
|
val currentPageOffset = _currentPageOffset.asStateFlow()
|
||||||
|
|
||||||
private val _pageEmitter = MutableSharedFlow<Pair<MoveTo, Int>>()
|
private val _pageEmitter = MutableSharedFlow<Pair<MoveTo, Int>>()
|
||||||
val pageEmitter = _pageEmitter.asSharedFlow()
|
val pageEmitter = _pageEmitter.asSharedFlow()
|
||||||
|
|
||||||
@@ -147,7 +150,12 @@ class ReaderMenuViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
val lastPageRead = chapter.chapter.lastPageRead
|
val lastPageRead = chapter.chapter.lastPageRead
|
||||||
if (lastPageRead != 0) {
|
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
|
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)
|
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.items
|
||||||
import androidx.compose.foundation.lazy.rememberLazyListState
|
import androidx.compose.foundation.lazy.rememberLazyListState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.DisposableEffect
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
@@ -44,6 +45,7 @@ fun ContinuousReader(
|
|||||||
maxSize: Int,
|
maxSize: Int,
|
||||||
padding: Int,
|
padding: Int,
|
||||||
currentPage: Int,
|
currentPage: Int,
|
||||||
|
currentPageOffset: Int,
|
||||||
previousChapter: ReaderChapter?,
|
previousChapter: ReaderChapter?,
|
||||||
currentChapter: ReaderChapter,
|
currentChapter: ReaderChapter,
|
||||||
nextChapter: ReaderChapter?,
|
nextChapter: ReaderChapter?,
|
||||||
@@ -51,10 +53,11 @@ fun ContinuousReader(
|
|||||||
pageContentScale: ContentScale,
|
pageContentScale: ContentScale,
|
||||||
pageEmitter: SharedFlow<Pair<MoveTo, Int>>,
|
pageEmitter: SharedFlow<Pair<MoveTo, Int>>,
|
||||||
retry: (ReaderPage) -> Unit,
|
retry: (ReaderPage) -> Unit,
|
||||||
progress: (Int) -> Unit
|
progress: (Int) -> Unit,
|
||||||
|
updateLastPageReadOffset: (Int) -> Unit
|
||||||
) {
|
) {
|
||||||
BoxWithConstraints {
|
BoxWithConstraints {
|
||||||
val state = rememberLazyListState(currentPage)
|
val state = rememberLazyListState(currentPage, currentPageOffset)
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
pageEmitter
|
pageEmitter
|
||||||
.mapLatest { (moveTo) ->
|
.mapLatest { (moveTo) ->
|
||||||
@@ -66,6 +69,11 @@ fun ContinuousReader(
|
|||||||
}
|
}
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
}
|
}
|
||||||
|
DisposableEffect(Unit) {
|
||||||
|
onDispose {
|
||||||
|
updateLastPageReadOffset(state.firstVisibleItemScrollOffset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val imageModifier = if (maxSize != 0) {
|
val imageModifier = if (maxSize != 0) {
|
||||||
when (direction) {
|
when (direction) {
|
||||||
|
|||||||
Reference in New Issue
Block a user