mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-23 04:52:33 +01:00
Start working on Batch chapter downloading
This commit is contained in:
@@ -92,18 +92,6 @@ interface ChapterRepository {
|
|||||||
@Path("chapterIndex") chapterIndex: Int
|
@Path("chapterIndex") chapterIndex: Int
|
||||||
): Flow<HttpResponse>
|
): Flow<HttpResponse>
|
||||||
|
|
||||||
@GET("api/v1/download/{mangaId}/chapter/{chapterIndex}")
|
|
||||||
fun queueChapterDownload(
|
|
||||||
@Path("mangaId") mangaId: Long,
|
|
||||||
@Path("chapterIndex") chapterIndex: Int
|
|
||||||
): Flow<HttpResponse>
|
|
||||||
|
|
||||||
@DELETE("api/v1/download/{mangaId}/chapter/{chapterIndex}")
|
|
||||||
fun stopChapterDownload(
|
|
||||||
@Path("mangaId") mangaId: Long,
|
|
||||||
@Path("chapterIndex") chapterIndex: Int
|
|
||||||
): Flow<HttpResponse>
|
|
||||||
|
|
||||||
@FormUrlEncoded
|
@FormUrlEncoded
|
||||||
@PATCH("api/v1/manga/{mangaId}/chapter/{chapterIndex}/meta")
|
@PATCH("api/v1/manga/{mangaId}/chapter/{chapterIndex}/meta")
|
||||||
fun updateChapterMeta(
|
fun updateChapterMeta(
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ca.gosyer.jui.domain.download.interactor
|
||||||
|
|
||||||
|
import ca.gosyer.jui.domain.download.model.DownloadEnqueue
|
||||||
|
import ca.gosyer.jui.domain.download.service.DownloadRepository
|
||||||
|
import kotlinx.coroutines.flow.catch
|
||||||
|
import kotlinx.coroutines.flow.collect
|
||||||
|
import me.tatarka.inject.annotations.Inject
|
||||||
|
import org.lighthousegames.logging.logging
|
||||||
|
|
||||||
|
class BatchChapterDownload @Inject constructor(private val downloadRepository: DownloadRepository) {
|
||||||
|
|
||||||
|
suspend fun await(chapterIds: List<Long>, onError: suspend (Throwable) -> Unit = {}) = asFlow(chapterIds)
|
||||||
|
.catch {
|
||||||
|
onError(it)
|
||||||
|
log.warn(it) { "Failed to queue chapters $chapterIds for a download" }
|
||||||
|
}
|
||||||
|
.collect()
|
||||||
|
|
||||||
|
suspend fun await(vararg chapterIds: Long, onError: suspend (Throwable) -> Unit = {}) = asFlow(*chapterIds)
|
||||||
|
.catch {
|
||||||
|
onError(it)
|
||||||
|
log.warn(it) { "Failed to queue chapters ${chapterIds.asList()} for a download" }
|
||||||
|
}
|
||||||
|
.collect()
|
||||||
|
|
||||||
|
fun asFlow(chapterIds: List<Long>) = downloadRepository.batchDownload(DownloadEnqueue(chapterIds))
|
||||||
|
|
||||||
|
fun asFlow(vararg chapterIds: Long) = downloadRepository.batchDownload(DownloadEnqueue(chapterIds.asList()))
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val log = logging()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,17 +4,17 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ca.gosyer.jui.domain.chapter.interactor
|
package ca.gosyer.jui.domain.download.interactor
|
||||||
|
|
||||||
import ca.gosyer.jui.domain.chapter.model.Chapter
|
import ca.gosyer.jui.domain.chapter.model.Chapter
|
||||||
import ca.gosyer.jui.domain.chapter.service.ChapterRepository
|
import ca.gosyer.jui.domain.download.service.DownloadRepository
|
||||||
import ca.gosyer.jui.domain.manga.model.Manga
|
import ca.gosyer.jui.domain.manga.model.Manga
|
||||||
import kotlinx.coroutines.flow.catch
|
import kotlinx.coroutines.flow.catch
|
||||||
import kotlinx.coroutines.flow.collect
|
import kotlinx.coroutines.flow.collect
|
||||||
import me.tatarka.inject.annotations.Inject
|
import me.tatarka.inject.annotations.Inject
|
||||||
import org.lighthousegames.logging.logging
|
import org.lighthousegames.logging.logging
|
||||||
|
|
||||||
class QueueChapterDownload @Inject constructor(private val chapterRepository: ChapterRepository) {
|
class QueueChapterDownload @Inject constructor(private val downloadRepository: DownloadRepository) {
|
||||||
|
|
||||||
suspend fun await(mangaId: Long, index: Int, onError: suspend (Throwable) -> Unit = {}) = asFlow(mangaId, index)
|
suspend fun await(mangaId: Long, index: Int, onError: suspend (Throwable) -> Unit = {}) = asFlow(mangaId, index)
|
||||||
.catch {
|
.catch {
|
||||||
@@ -37,11 +37,11 @@ class QueueChapterDownload @Inject constructor(private val chapterRepository: Ch
|
|||||||
}
|
}
|
||||||
.collect()
|
.collect()
|
||||||
|
|
||||||
fun asFlow(mangaId: Long, index: Int) = chapterRepository.queueChapterDownload(mangaId, index)
|
fun asFlow(mangaId: Long, index: Int) = downloadRepository.queueChapterDownload(mangaId, index)
|
||||||
|
|
||||||
fun asFlow(manga: Manga, index: Int) = chapterRepository.queueChapterDownload(manga.id, index)
|
fun asFlow(manga: Manga, index: Int) = downloadRepository.queueChapterDownload(manga.id, index)
|
||||||
|
|
||||||
fun asFlow(chapter: Chapter) = chapterRepository.queueChapterDownload(chapter.mangaId, chapter.index)
|
fun asFlow(chapter: Chapter) = downloadRepository.queueChapterDownload(chapter.mangaId, chapter.index)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val log = logging()
|
private val log = logging()
|
||||||
@@ -4,17 +4,17 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ca.gosyer.jui.domain.chapter.interactor
|
package ca.gosyer.jui.domain.download.interactor
|
||||||
|
|
||||||
import ca.gosyer.jui.domain.chapter.model.Chapter
|
import ca.gosyer.jui.domain.chapter.model.Chapter
|
||||||
import ca.gosyer.jui.domain.chapter.service.ChapterRepository
|
import ca.gosyer.jui.domain.download.service.DownloadRepository
|
||||||
import ca.gosyer.jui.domain.manga.model.Manga
|
import ca.gosyer.jui.domain.manga.model.Manga
|
||||||
import kotlinx.coroutines.flow.catch
|
import kotlinx.coroutines.flow.catch
|
||||||
import kotlinx.coroutines.flow.collect
|
import kotlinx.coroutines.flow.collect
|
||||||
import me.tatarka.inject.annotations.Inject
|
import me.tatarka.inject.annotations.Inject
|
||||||
import org.lighthousegames.logging.logging
|
import org.lighthousegames.logging.logging
|
||||||
|
|
||||||
class StopChapterDownload @Inject constructor(private val chapterRepository: ChapterRepository) {
|
class StopChapterDownload @Inject constructor(private val downloadRepository: DownloadRepository) {
|
||||||
|
|
||||||
suspend fun await(mangaId: Long, index: Int, onError: suspend (Throwable) -> Unit = {}) = asFlow(mangaId, index)
|
suspend fun await(mangaId: Long, index: Int, onError: suspend (Throwable) -> Unit = {}) = asFlow(mangaId, index)
|
||||||
.catch {
|
.catch {
|
||||||
@@ -37,11 +37,11 @@ class StopChapterDownload @Inject constructor(private val chapterRepository: Cha
|
|||||||
}
|
}
|
||||||
.collect()
|
.collect()
|
||||||
|
|
||||||
fun asFlow(mangaId: Long, index: Int) = chapterRepository.stopChapterDownload(mangaId, index)
|
fun asFlow(mangaId: Long, index: Int) = downloadRepository.stopChapterDownload(mangaId, index)
|
||||||
|
|
||||||
fun asFlow(manga: Manga, index: Int) = chapterRepository.stopChapterDownload(manga.id, index)
|
fun asFlow(manga: Manga, index: Int) = downloadRepository.stopChapterDownload(manga.id, index)
|
||||||
|
|
||||||
fun asFlow(chapter: Chapter) = chapterRepository.stopChapterDownload(chapter.mangaId, chapter.index)
|
fun asFlow(chapter: Chapter) = downloadRepository.stopChapterDownload(chapter.mangaId, chapter.index)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val log = logging()
|
private val log = logging()
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ca.gosyer.jui.domain.download.model
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class DownloadEnqueue(
|
||||||
|
val chapterIds: List<Long>
|
||||||
|
)
|
||||||
@@ -6,7 +6,13 @@
|
|||||||
|
|
||||||
package ca.gosyer.jui.domain.download.service
|
package ca.gosyer.jui.domain.download.service
|
||||||
|
|
||||||
|
import ca.gosyer.jui.domain.download.model.DownloadEnqueue
|
||||||
|
import de.jensklingenberg.ktorfit.http.Body
|
||||||
|
import de.jensklingenberg.ktorfit.http.DELETE
|
||||||
import de.jensklingenberg.ktorfit.http.GET
|
import de.jensklingenberg.ktorfit.http.GET
|
||||||
|
import de.jensklingenberg.ktorfit.http.Headers
|
||||||
|
import de.jensklingenberg.ktorfit.http.POST
|
||||||
|
import de.jensklingenberg.ktorfit.http.Path
|
||||||
import io.ktor.client.statement.HttpResponse
|
import io.ktor.client.statement.HttpResponse
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
@@ -19,4 +25,22 @@ interface DownloadRepository {
|
|||||||
|
|
||||||
@GET("api/v1/downloads/clear")
|
@GET("api/v1/downloads/clear")
|
||||||
fun clearDownloadQueue(): Flow<HttpResponse>
|
fun clearDownloadQueue(): Flow<HttpResponse>
|
||||||
|
|
||||||
|
@GET("api/v1/download/{mangaId}/chapter/{chapterIndex}")
|
||||||
|
fun queueChapterDownload(
|
||||||
|
@Path("mangaId") mangaId: Long,
|
||||||
|
@Path("chapterIndex") chapterIndex: Int
|
||||||
|
): Flow<HttpResponse>
|
||||||
|
|
||||||
|
@DELETE("api/v1/download/{mangaId}/chapter/{chapterIndex}")
|
||||||
|
fun stopChapterDownload(
|
||||||
|
@Path("mangaId") mangaId: Long,
|
||||||
|
@Path("chapterIndex") chapterIndex: Int
|
||||||
|
): Flow<HttpResponse>
|
||||||
|
|
||||||
|
@POST("api/v1/download/batch")
|
||||||
|
@Headers("Content-Type: application/json")
|
||||||
|
fun batchDownload(
|
||||||
|
@Body downloadEnqueue: DownloadEnqueue
|
||||||
|
): Flow<HttpResponse>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ import androidx.compose.ui.Modifier
|
|||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.DeleteChapterDownload
|
import ca.gosyer.jui.domain.chapter.interactor.DeleteChapterDownload
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.StopChapterDownload
|
|
||||||
import ca.gosyer.jui.domain.chapter.model.Chapter
|
import ca.gosyer.jui.domain.chapter.model.Chapter
|
||||||
|
import ca.gosyer.jui.domain.download.interactor.StopChapterDownload
|
||||||
import ca.gosyer.jui.domain.download.model.DownloadChapter
|
import ca.gosyer.jui.domain.download.model.DownloadChapter
|
||||||
import ca.gosyer.jui.domain.download.model.DownloadState
|
import ca.gosyer.jui.domain.download.model.DownloadState
|
||||||
import ca.gosyer.jui.domain.manga.model.Manga
|
import ca.gosyer.jui.domain.manga.model.Manga
|
||||||
|
|||||||
@@ -7,11 +7,11 @@
|
|||||||
package ca.gosyer.jui.ui.downloads
|
package ca.gosyer.jui.ui.downloads
|
||||||
|
|
||||||
import ca.gosyer.jui.domain.base.WebsocketService.Actions
|
import ca.gosyer.jui.domain.base.WebsocketService.Actions
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.QueueChapterDownload
|
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.StopChapterDownload
|
|
||||||
import ca.gosyer.jui.domain.chapter.model.Chapter
|
import ca.gosyer.jui.domain.chapter.model.Chapter
|
||||||
import ca.gosyer.jui.domain.download.interactor.ClearDownloadQueue
|
import ca.gosyer.jui.domain.download.interactor.ClearDownloadQueue
|
||||||
|
import ca.gosyer.jui.domain.download.interactor.QueueChapterDownload
|
||||||
import ca.gosyer.jui.domain.download.interactor.StartDownloading
|
import ca.gosyer.jui.domain.download.interactor.StartDownloading
|
||||||
|
import ca.gosyer.jui.domain.download.interactor.StopChapterDownload
|
||||||
import ca.gosyer.jui.domain.download.interactor.StopDownloading
|
import ca.gosyer.jui.domain.download.interactor.StopDownloading
|
||||||
import ca.gosyer.jui.domain.download.service.DownloadService
|
import ca.gosyer.jui.domain.download.service.DownloadService
|
||||||
import ca.gosyer.jui.uicore.vm.ContextWrapper
|
import ca.gosyer.jui.uicore.vm.ContextWrapper
|
||||||
|
|||||||
@@ -15,13 +15,13 @@ import ca.gosyer.jui.domain.category.interactor.RemoveMangaFromCategory
|
|||||||
import ca.gosyer.jui.domain.category.model.Category
|
import ca.gosyer.jui.domain.category.model.Category
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.DeleteChapterDownload
|
import ca.gosyer.jui.domain.chapter.interactor.DeleteChapterDownload
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.GetChapters
|
import ca.gosyer.jui.domain.chapter.interactor.GetChapters
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.QueueChapterDownload
|
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.RefreshChapters
|
import ca.gosyer.jui.domain.chapter.interactor.RefreshChapters
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.StopChapterDownload
|
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.UpdateChapterBookmarked
|
import ca.gosyer.jui.domain.chapter.interactor.UpdateChapterBookmarked
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.UpdateChapterMarkPreviousRead
|
import ca.gosyer.jui.domain.chapter.interactor.UpdateChapterMarkPreviousRead
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.UpdateChapterRead
|
import ca.gosyer.jui.domain.chapter.interactor.UpdateChapterRead
|
||||||
import ca.gosyer.jui.domain.chapter.model.Chapter
|
import ca.gosyer.jui.domain.chapter.model.Chapter
|
||||||
|
import ca.gosyer.jui.domain.download.interactor.QueueChapterDownload
|
||||||
|
import ca.gosyer.jui.domain.download.interactor.StopChapterDownload
|
||||||
import ca.gosyer.jui.domain.download.service.DownloadService
|
import ca.gosyer.jui.domain.download.service.DownloadService
|
||||||
import ca.gosyer.jui.domain.library.interactor.AddMangaToLibrary
|
import ca.gosyer.jui.domain.library.interactor.AddMangaToLibrary
|
||||||
import ca.gosyer.jui.domain.library.interactor.RemoveMangaFromLibrary
|
import ca.gosyer.jui.domain.library.interactor.RemoveMangaFromLibrary
|
||||||
|
|||||||
@@ -7,9 +7,9 @@
|
|||||||
package ca.gosyer.jui.ui.updates
|
package ca.gosyer.jui.ui.updates
|
||||||
|
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.DeleteChapterDownload
|
import ca.gosyer.jui.domain.chapter.interactor.DeleteChapterDownload
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.QueueChapterDownload
|
|
||||||
import ca.gosyer.jui.domain.chapter.interactor.StopChapterDownload
|
|
||||||
import ca.gosyer.jui.domain.chapter.model.Chapter
|
import ca.gosyer.jui.domain.chapter.model.Chapter
|
||||||
|
import ca.gosyer.jui.domain.download.interactor.QueueChapterDownload
|
||||||
|
import ca.gosyer.jui.domain.download.interactor.StopChapterDownload
|
||||||
import ca.gosyer.jui.domain.download.service.DownloadService
|
import ca.gosyer.jui.domain.download.service.DownloadService
|
||||||
import ca.gosyer.jui.domain.updates.interactor.GetRecentUpdates
|
import ca.gosyer.jui.domain.updates.interactor.GetRecentUpdates
|
||||||
import ca.gosyer.jui.ui.base.chapter.ChapterDownloadItem
|
import ca.gosyer.jui.ui.base.chapter.ChapterDownloadItem
|
||||||
|
|||||||
Reference in New Issue
Block a user