From 4e04218353ff28a38784a7ff9c4f7d10408c8afd Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Mon, 4 Nov 2024 01:46:34 +0700 Subject: [PATCH 01/16] Always update fresh data from source if manga isn't favorited --- .../ui/deeplink/DeepLinkScreenModel.kt | 5 +---- app/src/main/java/exh/GalleryAdder.kt | 3 +-- .../manga/interactor/NetworkToLocalManga.kt | 18 +++++++++++++++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/DeepLinkScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/DeepLinkScreenModel.kt index 5bef14675b..892d4c0f24 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/DeepLinkScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/DeepLinkScreenModel.kt @@ -15,7 +15,6 @@ import kotlinx.coroutines.flow.update import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.chapter.interactor.GetChapterByUrlAndMangaId import tachiyomi.domain.chapter.model.Chapter -import tachiyomi.domain.manga.interactor.GetMangaByUrlAndSourceId import tachiyomi.domain.manga.interactor.NetworkToLocalManga import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager @@ -27,7 +26,6 @@ class DeepLinkScreenModel( private val sourceManager: SourceManager = Injekt.get(), private val networkToLocalManga: NetworkToLocalManga = Injekt.get(), private val getChapterByUrlAndMangaId: GetChapterByUrlAndMangaId = Injekt.get(), - private val getMangaByUrlAndSourceId: GetMangaByUrlAndSourceId = Injekt.get(), private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(), ) : StateScreenModel(State.Loading) { @@ -74,8 +72,7 @@ class DeepLinkScreenModel( } private suspend fun getMangaFromSManga(sManga: SManga, sourceId: Long): Manga { - return getMangaByUrlAndSourceId.await(sManga.url, sourceId) - ?: networkToLocalManga.await(sManga.toDomainManga(sourceId)) + return networkToLocalManga.await(sManga.toDomainManga(sourceId)) } sealed interface State { diff --git a/app/src/main/java/exh/GalleryAdder.kt b/app/src/main/java/exh/GalleryAdder.kt index 1f035ecb5f..c092dc4ed2 100644 --- a/app/src/main/java/exh/GalleryAdder.kt +++ b/app/src/main/java/exh/GalleryAdder.kt @@ -135,8 +135,7 @@ class GalleryAdder( } ?: return GalleryAddEvent.Fail.UnknownType(url, context) // Use manga in DB if possible, otherwise, make a new manga - var manga = getManga.await(cleanedMangaUrl, source.id) - ?: networkToLocalManga.await( + var manga = networkToLocalManga.await( Manga.create().copy( source = source.id, url = cleanedMangaUrl, diff --git a/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt b/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt index 255951568e..7871741f3a 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt @@ -1,6 +1,8 @@ package tachiyomi.domain.manga.interactor +import exh.util.nullIfBlank import tachiyomi.domain.manga.model.Manga +import tachiyomi.domain.manga.model.toMangaUpdate import tachiyomi.domain.manga.repository.MangaRepository class NetworkToLocalManga( @@ -15,9 +17,9 @@ class NetworkToLocalManga( manga.copy(id = id!!) } !localManga.favorite -> { - // if the manga isn't a favorite, set its display title from source - // if it later becomes a favorite, updated title will go to db - localManga.copy(/* SY --> */ogTitle/* SY <-- */ = manga.title) + // if the manga isn't a favorite, update new info from source to db + manga.updateManga(localManga.id) + manga.copy(id = localManga.id) } else -> { localManga @@ -32,4 +34,14 @@ class NetworkToLocalManga( private suspend fun insertManga(manga: Manga): Long? { return mangaRepository.insert(manga) } + + private suspend fun Manga.updateManga(id: Long) { + mangaRepository.update( + toMangaUpdate() + .copy( + id = id, + thumbnailUrl = ogThumbnailUrl?.nullIfBlank() + ) + ) + } } From e402ee70759e73f716b5995efea594dc1cfc90d5 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Mon, 4 Nov 2024 01:47:23 +0700 Subject: [PATCH 02/16] fix spotless --- app/src/main/java/exh/GalleryAdder.kt | 10 +++++----- .../domain/manga/interactor/NetworkToLocalManga.kt | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/exh/GalleryAdder.kt b/app/src/main/java/exh/GalleryAdder.kt index c092dc4ed2..91b272120f 100644 --- a/app/src/main/java/exh/GalleryAdder.kt +++ b/app/src/main/java/exh/GalleryAdder.kt @@ -136,11 +136,11 @@ class GalleryAdder( // Use manga in DB if possible, otherwise, make a new manga var manga = networkToLocalManga.await( - Manga.create().copy( - source = source.id, - url = cleanedMangaUrl, - ), - ) + Manga.create().copy( + source = source.id, + url = cleanedMangaUrl, + ), + ) // Fetch and copy details val newManga = retry(retry) { source.getMangaDetails(manga.toSManga()) } diff --git a/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt b/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt index 7871741f3a..80856f65c1 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt @@ -40,8 +40,8 @@ class NetworkToLocalManga( toMangaUpdate() .copy( id = id, - thumbnailUrl = ogThumbnailUrl?.nullIfBlank() - ) + thumbnailUrl = ogThumbnailUrl?.nullIfBlank(), + ), ) } } From f3b48d96b3137883b968748551ddd38fbe37b903 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 15 Nov 2024 03:02:38 +0700 Subject: [PATCH 03/16] move `Suggestions` settings to same place --- .../screen/SettingsAppearanceScreen.kt | 25 ------------------- .../settings/screen/SettingsBrowseScreen.kt | 21 ++++++++++++++++ 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt index 5a9063862f..9ffd09a8fc 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt @@ -13,7 +13,6 @@ import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import com.materialkolor.PaletteStyle import eu.kanade.core.preference.asState -import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.AppTheme import eu.kanade.domain.ui.model.TabletUiMode @@ -269,10 +268,6 @@ object SettingsAppearanceScreen : SearchableSettings { @Composable fun getForkGroup(uiPreferences: UiPreferences): Preference.PreferenceGroup { val previewsRowCount by uiPreferences.previewsRowCount().collectAsState() - // KMK --> - val sourcePreferences = remember { Injekt.get() } - val relatedMangasInOverflow by uiPreferences.expandRelatedMangas().collectAsState() - // KMK <-- return Preference.PreferenceGroup( stringResource(SYMR.strings.pref_category_fork), @@ -288,26 +283,6 @@ object SettingsAppearanceScreen : SearchableSettings { pref = uiPreferences.expandFilters(), title = stringResource(SYMR.strings.toggle_expand_search_filters), ), - // KMK --> - Preference.PreferenceItem.SwitchPreference( - pref = uiPreferences.expandRelatedMangas(), - title = stringResource(KMR.strings.pref_expand_related_mangas), - subtitle = stringResource(KMR.strings.pref_expand_related_mangas_summary), - enabled = sourcePreferences.relatedMangas().get(), - ), - Preference.PreferenceItem.SwitchPreference( - pref = uiPreferences.relatedMangasInOverflow(), - enabled = !relatedMangasInOverflow, - title = stringResource(KMR.strings.put_related_mangas_in_overflow), - subtitle = stringResource(KMR.strings.put_related_mangas_in_overflow_summary), - ), - Preference.PreferenceItem.SwitchPreference( - pref = uiPreferences.showHomeOnRelatedMangas(), - title = stringResource(KMR.strings.pref_show_home_on_related_mangas), - subtitle = stringResource(KMR.strings.pref_show_home_on_related_mangas_summary), - enabled = sourcePreferences.relatedMangas().get(), - ), - // KMK <-- Preference.PreferenceItem.SwitchPreference( pref = uiPreferences.recommendsInOverflow(), title = stringResource(SYMR.strings.put_recommends_in_overflow), diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt index a071a24441..a0239a5c19 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt @@ -53,6 +53,9 @@ object SettingsBrowseScreen : SearchableSettings { val uiPreferences = remember { Injekt.get() } val unsortedPreferences = remember { Injekt.get() } // SY <-- + // KMK --> + val relatedMangasInOverflow by uiPreferences.expandRelatedMangas().collectAsState() + // KMK <-- return listOf( // SY --> Preference.PreferenceGroup( @@ -64,6 +67,24 @@ object SettingsBrowseScreen : SearchableSettings { title = stringResource(KMR.strings.pref_source_related_mangas), subtitle = stringResource(KMR.strings.pref_source_related_mangas_summary), ), + Preference.PreferenceItem.SwitchPreference( + pref = uiPreferences.expandRelatedMangas(), + title = stringResource(KMR.strings.pref_expand_related_mangas), + subtitle = stringResource(KMR.strings.pref_expand_related_mangas_summary), + enabled = sourcePreferences.relatedMangas().get(), + ), + Preference.PreferenceItem.SwitchPreference( + pref = uiPreferences.relatedMangasInOverflow(), + enabled = !relatedMangasInOverflow, + title = stringResource(KMR.strings.put_related_mangas_in_overflow), + subtitle = stringResource(KMR.strings.put_related_mangas_in_overflow_summary), + ), + Preference.PreferenceItem.SwitchPreference( + pref = uiPreferences.showHomeOnRelatedMangas(), + title = stringResource(KMR.strings.pref_show_home_on_related_mangas), + subtitle = stringResource(KMR.strings.pref_show_home_on_related_mangas_summary), + enabled = sourcePreferences.relatedMangas().get(), + ), // KMK <-- kotlin.run { val count by sourcePreferences.sourcesTabCategories().collectAsState() From e81f95876ca137e93ef76a2420765122a2f28f88 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Thu, 21 Nov 2024 01:10:40 +0700 Subject: [PATCH 04/16] inline manga update --- .../manga/interactor/NetworkToLocalManga.kt | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt b/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt index 80856f65c1..4e1422c274 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/interactor/NetworkToLocalManga.kt @@ -18,7 +18,13 @@ class NetworkToLocalManga( } !localManga.favorite -> { // if the manga isn't a favorite, update new info from source to db - manga.updateManga(localManga.id) + mangaRepository.update( + manga.toMangaUpdate() + .copy( + id = localManga.id, + thumbnailUrl = manga.ogThumbnailUrl?.nullIfBlank(), + ), + ) manga.copy(id = localManga.id) } else -> { @@ -34,14 +40,4 @@ class NetworkToLocalManga( private suspend fun insertManga(manga: Manga): Long? { return mangaRepository.insert(manga) } - - private suspend fun Manga.updateManga(id: Long) { - mangaRepository.update( - toMangaUpdate() - .copy( - id = id, - thumbnailUrl = ogThumbnailUrl?.nullIfBlank(), - ), - ) - } } From 4f4af3be4aee4c15c0bc2c75d1525225d84f8aaa Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Wed, 27 Nov 2024 23:18:57 +0700 Subject: [PATCH 05/16] fix vertical chapter navigator overlap bottom bar --- .../eu/kanade/presentation/reader/appbars/ReaderAppBars.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt b/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt index 68e699d05f..19bda87a02 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt @@ -143,7 +143,7 @@ fun ReaderAppBars( animationSpec = animationSpec, ), modifier = modifierWithInsetsPadding - .padding(bottom = 48.dp, top = 120.dp) + .padding(bottom = 64.dp, top = 112.dp) .align(Alignment.TopStart), ) { ChapterNavigator( @@ -171,7 +171,7 @@ fun ReaderAppBars( animationSpec = animationSpec, ), modifier = modifierWithInsetsPadding - .padding(bottom = 48.dp, top = 120.dp) + .padding(bottom = 64.dp, top = 112.dp) .align(Alignment.TopEnd), ) { ChapterNavigator( From 909b1e9c56575fae2875dd2d11426d066089a9f2 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 10 Jan 2025 01:01:27 +0700 Subject: [PATCH 06/16] Show description which sources support batch-add --- app/src/main/java/exh/ui/batchadd/BatchAddScreen.kt | 8 +++++++- i18n-kmk/src/commonMain/moko-resources/base/strings.xml | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/exh/ui/batchadd/BatchAddScreen.kt b/app/src/main/java/exh/ui/batchadd/BatchAddScreen.kt index acb857910b..3d1e7f9ea4 100644 --- a/app/src/main/java/exh/ui/batchadd/BatchAddScreen.kt +++ b/app/src/main/java/exh/ui/batchadd/BatchAddScreen.kt @@ -32,6 +32,7 @@ import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen import tachiyomi.i18n.MR +import tachiyomi.i18n.kmk.KMR import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Button import tachiyomi.presentation.core.components.material.Scaffold @@ -86,7 +87,6 @@ class BatchAddScreen : Screen() { }, keyboardOptions = KeyboardOptions(autoCorrectEnabled = false), textStyle = MaterialTheme.typography.bodyLarge, - ) Spacer(Modifier.height(8.dp)) Button( @@ -95,6 +95,12 @@ class BatchAddScreen : Screen() { ) { Text(text = stringResource(SYMR.strings.eh_batch_add_button)) } + // KMK --> + Spacer(Modifier.height(8.dp)) + Text( + text = stringResource(KMR.strings.batch_add_description), + ) + // KMK <-- } } BatchAddScreenModel.State.PROGRESS -> { diff --git a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml index f05ba44952..591b5f20f4 100644 --- a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml @@ -168,4 +168,5 @@ To be updated + Support: MangaDex, E-H, ExH, nH, 8Muses, Tsumino From 52c9e99777185967cf5ddd7f36d3e836b2d4e42f Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Tue, 21 Jan 2025 13:14:46 +0700 Subject: [PATCH 07/16] allow edit cover only if manga is favorite --- .../eu/kanade/presentation/manga/components/MangaCoverDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaCoverDialog.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaCoverDialog.kt index 569c13e660..23ddfe6002 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaCoverDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaCoverDialog.kt @@ -126,7 +126,7 @@ fun MangaCoverDialog( ), ), ) - if (onEditClick != null) { + if (onEditClick != null && manga.favorite) { Box { var expanded by remember { mutableStateOf(false) } IconButton( From c10b1fa6b4dd1e482aece7fe82ed32c41f9b2d64 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Tue, 21 Jan 2025 15:37:21 +0700 Subject: [PATCH 08/16] correctly using `is` condition --- .../eu/kanade/presentation/browse/components/BrowseIcons.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseIcons.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseIcons.kt index 4134656adb..a010a9d4ac 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseIcons.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseIcons.kt @@ -99,13 +99,13 @@ fun ExtensionIcon( is Extension.Installed -> { val icon by extension.getIcon(density) when (icon) { - Result.Loading -> Box(modifier = modifier) + is Result.Loading -> Box(modifier = modifier) is Result.Success -> Image( bitmap = (icon as Result.Success).value, contentDescription = null, modifier = modifier, ) - Result.Error -> Image( + is Result.Error -> Image( bitmap = ImageBitmap.imageResource(id = R.mipmap.ic_default_source), contentDescription = null, modifier = modifier, From b76b366a3243aba01fbd13a9299a3f4e59b32951 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Thu, 23 Jan 2025 23:40:26 +0700 Subject: [PATCH 09/16] merge queries for Updates view --- .../tachiyomi/data/AndroidDatabaseHandler.kt | 2 - .../main/java/tachiyomi/data/UpdatesQuery.kt | 95 ------------------- .../data/updates/UpdatesRepositoryImpl.kt | 32 +------ .../sqldelight/tachiyomi/view/updatesView.sq | 32 ++++++- 4 files changed, 31 insertions(+), 130 deletions(-) delete mode 100644 data/src/main/java/tachiyomi/data/UpdatesQuery.kt diff --git a/data/src/main/java/tachiyomi/data/AndroidDatabaseHandler.kt b/data/src/main/java/tachiyomi/data/AndroidDatabaseHandler.kt index f0781c7560..73bf21e403 100644 --- a/data/src/main/java/tachiyomi/data/AndroidDatabaseHandler.kt +++ b/data/src/main/java/tachiyomi/data/AndroidDatabaseHandler.kt @@ -113,7 +113,5 @@ class AndroidDatabaseHandler( // SY --> fun getLibraryQuery(condition: String = "M.favorite = 1") = LibraryQuery(driver, condition) - - fun getUpdatesQuery(after: Long, limit: Long) = UpdatesQuery(driver, after, limit) // SY <-- } diff --git a/data/src/main/java/tachiyomi/data/UpdatesQuery.kt b/data/src/main/java/tachiyomi/data/UpdatesQuery.kt deleted file mode 100644 index 5c8b85fe03..0000000000 --- a/data/src/main/java/tachiyomi/data/UpdatesQuery.kt +++ /dev/null @@ -1,95 +0,0 @@ -package tachiyomi.data - -import app.cash.sqldelight.ExecutableQuery -import app.cash.sqldelight.db.QueryResult -import app.cash.sqldelight.db.SqlCursor -import app.cash.sqldelight.db.SqlDriver -import exh.source.MERGED_SOURCE_ID -import tachiyomi.view.UpdatesView - -private val mapper = { cursor: SqlCursor -> - UpdatesView( - cursor.getLong(0)!!, - cursor.getString(1)!!, - cursor.getLong(2)!!, - cursor.getString(3)!!, - cursor.getString(4), - cursor.getLong(5)!! == 1L, - cursor.getLong(6)!! == 1L, - cursor.getLong(7)!!, - cursor.getLong(8)!!, - cursor.getLong(9)!! == 1L, - cursor.getString(10), - cursor.getLong(11)!!, - cursor.getLong(12)!!, - cursor.getLong(13)!!, - ) -} - -class UpdatesQuery(val driver: SqlDriver, val after: Long, val limit: Long) : ExecutableQuery(mapper) { - override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult { - return driver.executeQuery( - null, - """ - SELECT - mangas._id AS mangaId, - mangas.title AS mangaTitle, - chapters._id AS chapterId, - chapters.name AS chapterName, - chapters.scanlator, - chapters.read, - chapters.bookmark, - chapters.last_page_read, - mangas.source, - mangas.favorite, - mangas.thumbnail_url AS thumbnailUrl, - mangas.cover_last_modified AS coverLastModified, - chapters.date_upload AS dateUpload, - chapters.date_fetch AS datefetch - FROM mangas JOIN chapters - ON mangas._id = chapters.manga_id - WHERE favorite = 1 AND source <> $MERGED_SOURCE_ID - AND date_fetch > date_added - AND dateUpload > :after - UNION - SELECT - mangas._id AS mangaId, - mangas.title AS mangaTitle, - chapters._id AS chapterId, - chapters.name AS chapterName, - chapters.scanlator, - chapters.read, - chapters.bookmark, - chapters.last_page_read, - mangas.source, - mangas.favorite, - mangas.thumbnail_url AS thumbnailUrl, - mangas.cover_last_modified AS coverLastModified, - chapters.date_upload AS dateUpload, - chapters.date_fetch AS datefetch - FROM mangas - LEFT JOIN ( - SELECT merged.manga_id,merged.merge_id - FROM merged - GROUP BY merged.merge_id - ) as ME - ON ME.merge_id = mangas._id - JOIN chapters - ON ME.manga_id = chapters.manga_id - WHERE favorite = 1 AND source = $MERGED_SOURCE_ID - AND date_fetch > date_added - AND dateUpload > :after - ORDER BY datefetch DESC - LIMIT :limit; - """.trimIndent(), - mapper, - 2, - binders = { - bindLong(0, after) - bindLong(1, limit) - }, - ) - } - - override fun toString(): String = "LibraryQuery.sq:get" -} diff --git a/data/src/main/java/tachiyomi/data/updates/UpdatesRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/updates/UpdatesRepositoryImpl.kt index 26047219b4..be2c2ad0f3 100644 --- a/data/src/main/java/tachiyomi/data/updates/UpdatesRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/updates/UpdatesRepositoryImpl.kt @@ -1,13 +1,10 @@ package tachiyomi.data.updates import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map -import tachiyomi.data.AndroidDatabaseHandler import tachiyomi.data.DatabaseHandler import tachiyomi.domain.manga.model.MangaCover import tachiyomi.domain.updates.model.UpdatesWithRelations import tachiyomi.domain.updates.repository.UpdatesRepository -import tachiyomi.view.UpdatesView class UpdatesRepositoryImpl( private val databaseHandler: DatabaseHandler, @@ -31,11 +28,6 @@ class UpdatesRepositoryImpl( override fun subscribeAll(after: Long, limit: Long): Flow> { return databaseHandler.subscribeToList { updatesViewQueries.getRecentUpdates(after, limit, ::mapUpdatesWithRelations) - }.map { - databaseHandler.awaitListExecutable { - (databaseHandler as AndroidDatabaseHandler).getUpdatesQuery(after, limit) - } - .map(::mapUpdatesView) } } @@ -67,7 +59,7 @@ class UpdatesRepositoryImpl( favorite: Boolean, thumbnailUrl: String?, coverLastModified: Long, - dateUpload: Long, + @Suppress("UNUSED_PARAMETER") dateUpload: Long, dateFetch: Long, ): UpdatesWithRelations = UpdatesWithRelations( mangaId = mangaId, @@ -90,26 +82,4 @@ class UpdatesRepositoryImpl( lastModified = coverLastModified, ), ) - - fun mapUpdatesView(updatesView: UpdatesView): UpdatesWithRelations { - return UpdatesWithRelations( - mangaId = updatesView.mangaId, - ogMangaTitle = updatesView.mangaTitle, - chapterId = updatesView.chapterId, - chapterName = updatesView.chapterName, - scanlator = updatesView.scanlator, - read = updatesView.read, - bookmark = updatesView.bookmark, - lastPageRead = updatesView.last_page_read, - sourceId = updatesView.source, - dateFetch = updatesView.datefetch, - coverData = MangaCover( - mangaId = updatesView.mangaId, - sourceId = updatesView.source, - isMangaFavorite = updatesView.favorite, - ogUrl = updatesView.thumbnailUrl, - lastModified = updatesView.coverLastModified, - ), - ) - } } diff --git a/data/src/main/sqldelight/tachiyomi/view/updatesView.sq b/data/src/main/sqldelight/tachiyomi/view/updatesView.sq index 5fdd3ea757..78c17f93ae 100644 --- a/data/src/main/sqldelight/tachiyomi/view/updatesView.sq +++ b/data/src/main/sqldelight/tachiyomi/view/updatesView.sq @@ -1,3 +1,4 @@ +-- NOTE: must update MERGED_SOURCE_ID (6969) here CREATE VIEW updatesView AS SELECT mangas._id AS mangaId, @@ -16,9 +17,36 @@ SELECT chapters.date_fetch AS datefetch FROM mangas JOIN chapters ON mangas._id = chapters.manga_id -WHERE favorite = 1 +WHERE favorite = 1 AND source <> 6969 AND date_fetch > date_added -ORDER BY date_fetch DESC; +UNION +SELECT + mangas._id AS mangaId, + mangas.title AS mangaTitle, + chapters._id AS chapterId, + chapters.name AS chapterName, + chapters.scanlator, + chapters.read, + chapters.bookmark, + chapters.last_page_read, + mangas.source, + mangas.favorite, + mangas.thumbnail_url AS thumbnailUrl, + mangas.cover_last_modified AS coverLastModified, + chapters.date_upload AS dateUpload, + chapters.date_fetch AS datefetch +FROM mangas +LEFT JOIN ( + SELECT merged.manga_id,merged.merge_id + FROM merged + GROUP BY merged.merge_id +) AS ME +ON ME.merge_id = mangas._id +JOIN chapters +ON ME.manga_id = chapters.manga_id +WHERE favorite = 1 AND source = 6969 +AND date_fetch > date_added +ORDER BY datefetch DESC; getRecentUpdates: SELECT * From 9025f68fd824eddce3470e55421b3420ea72379e Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 24 Jan 2025 00:38:39 +0700 Subject: [PATCH 10/16] merge queries for Library view --- .../tachiyomi/data/AndroidDatabaseHandler.kt | 4 - .../main/java/tachiyomi/data/LibraryQuery.kt | 136 ------------------ .../java/tachiyomi/data/manga/MangaMapper.kt | 38 ----- .../data/manga/MangaRepositoryImpl.kt | 14 +- .../sqldelight/tachiyomi/view/libraryView.sq | 57 +++++++- 5 files changed, 55 insertions(+), 194 deletions(-) delete mode 100644 data/src/main/java/tachiyomi/data/LibraryQuery.kt diff --git a/data/src/main/java/tachiyomi/data/AndroidDatabaseHandler.kt b/data/src/main/java/tachiyomi/data/AndroidDatabaseHandler.kt index 73bf21e403..bfcf634fbe 100644 --- a/data/src/main/java/tachiyomi/data/AndroidDatabaseHandler.kt +++ b/data/src/main/java/tachiyomi/data/AndroidDatabaseHandler.kt @@ -110,8 +110,4 @@ class AndroidDatabaseHandler( val context = getCurrentDatabaseContext() return withContext(context) { block(db) } } - - // SY --> - fun getLibraryQuery(condition: String = "M.favorite = 1") = LibraryQuery(driver, condition) - // SY <-- } diff --git a/data/src/main/java/tachiyomi/data/LibraryQuery.kt b/data/src/main/java/tachiyomi/data/LibraryQuery.kt deleted file mode 100644 index 64f7b40c4c..0000000000 --- a/data/src/main/java/tachiyomi/data/LibraryQuery.kt +++ /dev/null @@ -1,136 +0,0 @@ -package tachiyomi.data - -import app.cash.sqldelight.ExecutableQuery -import app.cash.sqldelight.db.QueryResult -import app.cash.sqldelight.db.SqlCursor -import app.cash.sqldelight.db.SqlDriver -import exh.source.MERGED_SOURCE_ID -import tachiyomi.view.LibraryView - -private val mapper = { cursor: SqlCursor -> - LibraryView( - _id = cursor.getLong(0)!!, - source = cursor.getLong(1)!!, - url = cursor.getString(2)!!, - artist = cursor.getString(3), - author = cursor.getString(4), - description = cursor.getString(5), - genre = cursor.getString(6)?.let(StringListColumnAdapter::decode), - title = cursor.getString(7)!!, - status = cursor.getLong(8)!!, - thumbnail_url = cursor.getString(9), - favorite = cursor.getLong(10)!! == 1L, - last_update = cursor.getLong(11), - next_update = cursor.getLong(12), - initialized = cursor.getLong(13)!! == 1L, - viewer = cursor.getLong(14)!!, - chapter_flags = cursor.getLong(15)!!, - cover_last_modified = cursor.getLong(16)!!, - date_added = cursor.getLong(17)!!, - filtered_scanlators = null, - update_strategy = UpdateStrategyColumnAdapter.decode(cursor.getLong(19)!!), - calculate_interval = cursor.getLong(20)!!, - last_modified_at = cursor.getLong(21)!!, - favorite_modified_at = cursor.getLong(22), - version = cursor.getLong(23)!!, - is_syncing = cursor.getLong(24)!!, - totalCount = cursor.getLong(25)!!, - readCount = cursor.getDouble(26)!!, - latestUpload = cursor.getLong(27)!!, - chapterFetchedAt = cursor.getLong(28)!!, - lastRead = cursor.getLong(29)!!, - bookmarkCount = cursor.getDouble(30)!!, - category = cursor.getLong(31)!!, - ) -} - -class LibraryQuery( - val driver: SqlDriver, - val condition: String = "M.favorite = 1", -) : ExecutableQuery(mapper) { - - override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult { - return driver.executeQuery( - null, - """ - SELECT - M.*, - coalesce(C.total, 0) AS totalCount, - coalesce(C.readCount, 0) AS readCount, - coalesce(C.latestUpload, 0) AS latestUpload, - coalesce(C.fetchedAt, 0) AS chapterFetchedAt, - coalesce(C.lastRead, 0) AS lastRead, - coalesce(C.bookmarkCount, 0) AS bookmarkCount, - coalesce(MC.category_id, 0) AS category - FROM mangas M - LEFT JOIN( - SELECT - chapters.manga_id, - count(*) AS total, - sum(read) AS readCount, - coalesce(max(chapters.date_upload), 0) AS latestUpload, - coalesce(max(history.last_read), 0) AS lastRead, - coalesce(max(chapters.date_fetch), 0) AS fetchedAt, - sum(chapters.bookmark) AS bookmarkCount - FROM chapters - LEFT JOIN excluded_scanlators - ON chapters.manga_id = excluded_scanlators.manga_id - AND chapters.scanlator = excluded_scanlators.scanlator - LEFT JOIN history - ON chapters._id = history.chapter_id - WHERE excluded_scanlators.scanlator IS NULL - GROUP BY chapters.manga_id - ) AS C - ON M._id = C.manga_id - LEFT JOIN mangas_categories AS MC - ON MC.manga_id = M._id - WHERE $condition AND M.source <> $MERGED_SOURCE_ID - UNION - SELECT - M.*, - coalesce(C.total, 0) AS totalCount, - coalesce(C.readCount, 0) AS readCount, - coalesce(C.latestUpload, 0) AS latestUpload, - coalesce(C.fetchedAt, 0) AS chapterFetchedAt, - coalesce(C.lastRead, 0) AS lastRead, - coalesce(C.bookmarkCount, 0) AS bookmarkCount, - coalesce(MC.category_id, 0) AS category - FROM mangas M - LEFT JOIN ( - SELECT merged.manga_id,merged.merge_id - FROM merged - GROUP BY merged.merge_id - ) as ME - ON ME.merge_id = M._id - LEFT JOIN( - SELECT - ME.merge_id, - count(*) AS total, - sum(read) AS readCount, - coalesce(max(chapters.date_upload), 0) AS latestUpload, - coalesce(max(history.last_read), 0) AS lastRead, - coalesce(max(chapters.date_fetch), 0) AS fetchedAt, - sum(chapters.bookmark) AS bookmarkCount - FROM chapters - LEFT JOIN excluded_scanlators - ON chapters.manga_id = excluded_scanlators.manga_id - AND chapters.scanlator = excluded_scanlators.scanlator - LEFT JOIN history - ON chapters._id = history.chapter_id - LEFT JOIN merged as ME - ON ME.manga_id = chapters.manga_id - WHERE excluded_scanlators.scanlator IS NULL - GROUP BY ME.merge_id - ) AS C - ON ME.merge_id = C.merge_id - LEFT JOIN mangas_categories AS MC - ON MC.manga_id = M._id - WHERE $condition AND M.source = $MERGED_SOURCE_ID; - """.trimIndent(), - mapper, - parameters = 0, - ) - } - - override fun toString(): String = "LibraryQuery.sq:get" -} diff --git a/data/src/main/java/tachiyomi/data/manga/MangaMapper.kt b/data/src/main/java/tachiyomi/data/manga/MangaMapper.kt index be0255398d..b760af53df 100644 --- a/data/src/main/java/tachiyomi/data/manga/MangaMapper.kt +++ b/data/src/main/java/tachiyomi/data/manga/MangaMapper.kt @@ -3,7 +3,6 @@ package tachiyomi.data.manga import eu.kanade.tachiyomi.source.model.UpdateStrategy import tachiyomi.domain.library.model.LibraryManga import tachiyomi.domain.manga.model.Manga -import tachiyomi.view.LibraryView object MangaMapper { fun mapManga( @@ -138,41 +137,4 @@ object MangaMapper { chapterFetchedAt = chapterFetchedAt, lastRead = lastRead, ) - - fun mapLibraryView(libraryView: LibraryView): LibraryManga { - return LibraryManga( - manga = Manga( - id = libraryView._id, - source = libraryView.source, - favorite = libraryView.favorite, - lastUpdate = libraryView.last_update ?: 0, - nextUpdate = libraryView.next_update ?: 0, - dateAdded = libraryView.date_added, - viewerFlags = libraryView.viewer, - chapterFlags = libraryView.chapter_flags, - coverLastModified = libraryView.cover_last_modified, - url = libraryView.url, - ogTitle = libraryView.title, - ogArtist = libraryView.artist, - ogAuthor = libraryView.author, - ogDescription = libraryView.description, - ogGenre = libraryView.genre, - ogStatus = libraryView.status, - ogThumbnailUrl = libraryView.thumbnail_url, - updateStrategy = libraryView.update_strategy, - initialized = libraryView.initialized, - fetchInterval = libraryView.calculate_interval.toInt(), - lastModifiedAt = libraryView.last_modified_at, - favoriteModifiedAt = libraryView.favorite_modified_at, - version = libraryView.version, - ), - category = libraryView.category, - totalChapters = libraryView.totalCount, - readCount = libraryView.readCount.toLong(), - bookmarkCount = libraryView.bookmarkCount.toLong(), - latestUpload = libraryView.latestUpload, - chapterFetchedAt = libraryView.chapterFetchedAt, - lastRead = libraryView.lastRead, - ) - } } diff --git a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt index 3aea143938..d860507e9a 100644 --- a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt @@ -1,10 +1,8 @@ package tachiyomi.data.manga import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map import logcat.LogPriority import tachiyomi.core.common.util.system.logcat -import tachiyomi.data.AndroidDatabaseHandler import tachiyomi.data.DatabaseHandler import tachiyomi.data.StringListColumnAdapter import tachiyomi.data.UpdateStrategyColumnAdapter @@ -56,17 +54,11 @@ class MangaRepositoryImpl( } override suspend fun getLibraryManga(): List { - return handler.awaitListExecutable { - (handler as AndroidDatabaseHandler).getLibraryQuery() - }.map(MangaMapper::mapLibraryView) - // return handler.awaitList { libraryViewQueries.library(MangaMapper::mapLibraryManga) } + return handler.awaitList { libraryViewQueries.library(MangaMapper::mapLibraryManga) } } override fun getLibraryMangaAsFlow(): Flow> { return handler.subscribeToList { libraryViewQueries.library(MangaMapper::mapLibraryManga) } - // SY --> - .map { getLibraryManga() } - // SY <-- } override fun getFavoritesBySourceId(sourceId: Long): Flow> { @@ -203,9 +195,7 @@ class MangaRepositoryImpl( } override suspend fun getReadMangaNotInLibraryView(): List { - return handler.awaitListExecutable { - (handler as AndroidDatabaseHandler).getLibraryQuery("M.favorite = 0 AND C.readCount != 0") - }.map(MangaMapper::mapLibraryView) + return handler.awaitList { libraryViewQueries.readMangaNonLibrary(MangaMapper::mapLibraryManga) } } // SY <-- } diff --git a/data/src/main/sqldelight/tachiyomi/view/libraryView.sq b/data/src/main/sqldelight/tachiyomi/view/libraryView.sq index 1021c544f7..9510660179 100644 --- a/data/src/main/sqldelight/tachiyomi/view/libraryView.sq +++ b/data/src/main/sqldelight/tachiyomi/view/libraryView.sq @@ -17,21 +17,70 @@ LEFT JOIN( coalesce(max(chapters.date_upload), 0) AS latestUpload, coalesce(max(history.last_read), 0) AS lastRead, coalesce(max(chapters.date_fetch), 0) AS fetchedAt, - sum(chapters.bookmark) AS bookmarkCount + sum(chapters.bookmark) AS bookmarkCount, + excluded_scanlators.scanlator AS ex_scanlator FROM chapters LEFT JOIN excluded_scanlators ON chapters.manga_id = excluded_scanlators.manga_id AND chapters.scanlator = excluded_scanlators.scanlator LEFT JOIN history ON chapters._id = history.chapter_id - WHERE excluded_scanlators.scanlator IS NULL + WHERE ex_scanlator IS NULL GROUP BY chapters.manga_id ) AS C ON M._id = C.manga_id LEFT JOIN mangas_categories AS MC ON MC.manga_id = M._id -WHERE M.favorite = 1; +WHERE M.source <> 6969 +UNION +SELECT + M.*, + coalesce(C.total, 0) AS totalCount, + coalesce(C.readCount, 0) AS readCount, + coalesce(C.latestUpload, 0) AS latestUpload, + coalesce(C.fetchedAt, 0) AS chapterFetchedAt, + coalesce(C.lastRead, 0) AS lastRead, + coalesce(C.bookmarkCount, 0) AS bookmarkCount, + coalesce(MC.category_id, 0) AS category +FROM mangas M +LEFT JOIN ( + SELECT merged.manga_id,merged.merge_id + FROM merged + GROUP BY merged.merge_id +) AS ME +ON ME.merge_id = M._id +LEFT JOIN( + SELECT + ME.merge_id, + count(*) AS total, + sum(read) AS readCount, + coalesce(max(chapters.date_upload), 0) AS latestUpload, + coalesce(max(history.last_read), 0) AS lastRead, + coalesce(max(chapters.date_fetch), 0) AS fetchedAt, + sum(chapters.bookmark) AS bookmarkCount, + excluded_scanlators.scanlator AS ex_scanlator + FROM chapters + LEFT JOIN excluded_scanlators + ON chapters.manga_id = excluded_scanlators.manga_id + AND chapters.scanlator = excluded_scanlators.scanlator + LEFT JOIN history + ON chapters._id = history.chapter_id + LEFT JOIN merged ME + ON ME.manga_id = chapters.manga_id + WHERE ex_scanlator IS NULL + GROUP BY ME.merge_id +) AS C +ON M._id = C.merge_id -- ON ME.merge_id = C.merge_id +LEFT JOIN mangas_categories AS MC +ON MC.manga_id = M._id +WHERE M.source = 6969; library: SELECT * -FROM libraryView; \ No newline at end of file +FROM libraryView +WHERE libraryView.favorite = 1; + +readMangaNonLibrary: +SELECT * +FROM libraryView +WHERE libraryView.favorite = 0 AND libraryView.readCount != 0; \ No newline at end of file From da8d190f0f2301289eaf70b8e421044c6df9504c Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Sun, 26 Jan 2025 01:25:08 +0700 Subject: [PATCH 11/16] update remove merged entries text --- i18n-kmk/src/commonMain/moko-resources/base/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml index 591b5f20f4..a382beeb73 100644 --- a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml @@ -10,7 +10,7 @@ Move up Move down Confirm Color - Remove merged entries? + Remove original entries from library? Hide Show hidden categories Panorama cover From e46f38da22f98dfc7d03824ddfb2844cc2dedfbe Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Wed, 29 Jan 2025 13:17:11 +0700 Subject: [PATCH 12/16] add comment --- data/src/main/sqldelight/tachiyomi/view/libraryView.sq | 1 + source-api/src/commonMain/kotlin/exh/source/SourceIds.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/data/src/main/sqldelight/tachiyomi/view/libraryView.sq b/data/src/main/sqldelight/tachiyomi/view/libraryView.sq index 9510660179..4d0ead3187 100644 --- a/data/src/main/sqldelight/tachiyomi/view/libraryView.sq +++ b/data/src/main/sqldelight/tachiyomi/view/libraryView.sq @@ -1,3 +1,4 @@ +-- NOTE: must update MERGED_SOURCE_ID (6969) here CREATE VIEW libraryView AS SELECT M.*, diff --git a/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt b/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt index 07bf5ceb07..65996e8143 100644 --- a/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt +++ b/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt @@ -9,6 +9,7 @@ const val PURURIN_SOURCE_ID = 2221515250486218861L const val TSUMINO_SOURCE_ID = 6707338697138388238L const val EIGHTMUSES_SOURCE_ID = 1802675169972965535L const val HBROWSE_SOURCE_ID = 1401584337232758222L +// If MERGED_SOURCE_ID is to update, remember to update updatesView.sq and libraryView.sq too const val MERGED_SOURCE_ID = LEWD_SOURCE_SERIES + 69 const val NHENTAI_OLD_ID = 6907L From b4a3a47edbc6df9021dc18e1ed4b346e21f4bd50 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 14 Feb 2025 13:03:27 +0700 Subject: [PATCH 13/16] fix spotless --- source-api/src/commonMain/kotlin/exh/source/SourceIds.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt b/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt index 65996e8143..4bda01714c 100644 --- a/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt +++ b/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt @@ -9,6 +9,7 @@ const val PURURIN_SOURCE_ID = 2221515250486218861L const val TSUMINO_SOURCE_ID = 6707338697138388238L const val EIGHTMUSES_SOURCE_ID = 1802675169972965535L const val HBROWSE_SOURCE_ID = 1401584337232758222L + // If MERGED_SOURCE_ID is to update, remember to update updatesView.sq and libraryView.sq too const val MERGED_SOURCE_ID = LEWD_SOURCE_SERIES + 69 From e33179c5421b68d5dea1304e4da4ed409bd9ffac Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 14 Feb 2025 22:59:18 +0700 Subject: [PATCH 14/16] also migrate database --- .../sqldelight/tachiyomi/migrations/36.sqm | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 data/src/main/sqldelight/tachiyomi/migrations/36.sqm diff --git a/data/src/main/sqldelight/tachiyomi/migrations/36.sqm b/data/src/main/sqldelight/tachiyomi/migrations/36.sqm new file mode 100644 index 0000000000..cc58a5d90c --- /dev/null +++ b/data/src/main/sqldelight/tachiyomi/migrations/36.sqm @@ -0,0 +1,129 @@ +-- NOTE: must update MERGED_SOURCE_ID (6969) here +DROP VIEW IF EXISTS libraryView; +DROP VIEW IF EXISTS updatesView; + +CREATE VIEW libraryView AS +SELECT + M.*, + coalesce(C.total, 0) AS totalCount, + coalesce(C.readCount, 0) AS readCount, + coalesce(C.latestUpload, 0) AS latestUpload, + coalesce(C.fetchedAt, 0) AS chapterFetchedAt, + coalesce(C.lastRead, 0) AS lastRead, + coalesce(C.bookmarkCount, 0) AS bookmarkCount, + coalesce(MC.category_id, 0) AS category +FROM mangas M +LEFT JOIN( + SELECT + chapters.manga_id, + count(*) AS total, + sum(read) AS readCount, + coalesce(max(chapters.date_upload), 0) AS latestUpload, + coalesce(max(history.last_read), 0) AS lastRead, + coalesce(max(chapters.date_fetch), 0) AS fetchedAt, + sum(chapters.bookmark) AS bookmarkCount, + excluded_scanlators.scanlator AS ex_scanlator + FROM chapters + LEFT JOIN excluded_scanlators + ON chapters.manga_id = excluded_scanlators.manga_id + AND chapters.scanlator = excluded_scanlators.scanlator + LEFT JOIN history + ON chapters._id = history.chapter_id + WHERE ex_scanlator IS NULL + GROUP BY chapters.manga_id +) AS C +ON M._id = C.manga_id +LEFT JOIN mangas_categories AS MC +ON MC.manga_id = M._id +WHERE M.source <> 6969 +UNION +SELECT + M.*, + coalesce(C.total, 0) AS totalCount, + coalesce(C.readCount, 0) AS readCount, + coalesce(C.latestUpload, 0) AS latestUpload, + coalesce(C.fetchedAt, 0) AS chapterFetchedAt, + coalesce(C.lastRead, 0) AS lastRead, + coalesce(C.bookmarkCount, 0) AS bookmarkCount, + coalesce(MC.category_id, 0) AS category +FROM mangas M +LEFT JOIN ( + SELECT merged.manga_id,merged.merge_id + FROM merged + GROUP BY merged.merge_id +) AS ME +ON ME.merge_id = M._id +LEFT JOIN( + SELECT + ME.merge_id, + count(*) AS total, + sum(read) AS readCount, + coalesce(max(chapters.date_upload), 0) AS latestUpload, + coalesce(max(history.last_read), 0) AS lastRead, + coalesce(max(chapters.date_fetch), 0) AS fetchedAt, + sum(chapters.bookmark) AS bookmarkCount, + excluded_scanlators.scanlator AS ex_scanlator + FROM chapters + LEFT JOIN excluded_scanlators + ON chapters.manga_id = excluded_scanlators.manga_id + AND chapters.scanlator = excluded_scanlators.scanlator + LEFT JOIN history + ON chapters._id = history.chapter_id + LEFT JOIN merged ME + ON ME.manga_id = chapters.manga_id + WHERE ex_scanlator IS NULL + GROUP BY ME.merge_id +) AS C +ON M._id = C.merge_id -- ON ME.merge_id = C.merge_id +LEFT JOIN mangas_categories AS MC +ON MC.manga_id = M._id +WHERE M.source = 6969; + +CREATE VIEW updatesView AS +SELECT + mangas._id AS mangaId, + mangas.title AS mangaTitle, + chapters._id AS chapterId, + chapters.name AS chapterName, + chapters.scanlator, + chapters.read, + chapters.bookmark, + chapters.last_page_read, + mangas.source, + mangas.favorite, + mangas.thumbnail_url AS thumbnailUrl, + mangas.cover_last_modified AS coverLastModified, + chapters.date_upload AS dateUpload, + chapters.date_fetch AS datefetch +FROM mangas JOIN chapters +ON mangas._id = chapters.manga_id +WHERE favorite = 1 AND source <> 6969 +AND date_fetch > date_added +UNION +SELECT + mangas._id AS mangaId, + mangas.title AS mangaTitle, + chapters._id AS chapterId, + chapters.name AS chapterName, + chapters.scanlator, + chapters.read, + chapters.bookmark, + chapters.last_page_read, + mangas.source, + mangas.favorite, + mangas.thumbnail_url AS thumbnailUrl, + mangas.cover_last_modified AS coverLastModified, + chapters.date_upload AS dateUpload, + chapters.date_fetch AS datefetch +FROM mangas +LEFT JOIN ( + SELECT merged.manga_id,merged.merge_id + FROM merged + GROUP BY merged.merge_id +) AS ME +ON ME.merge_id = mangas._id +JOIN chapters +ON ME.manga_id = chapters.manga_id +WHERE favorite = 1 AND source = 6969 +AND date_fetch > date_added +ORDER BY datefetch DESC; \ No newline at end of file From 6735d768163cc4ffa02f0978a51bf975dd41349d Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Wed, 29 Jan 2025 13:20:32 +0700 Subject: [PATCH 15/16] Hide excluded translators from update view --- data/src/main/sqldelight/tachiyomi/view/updatesView.sq | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/data/src/main/sqldelight/tachiyomi/view/updatesView.sq b/data/src/main/sqldelight/tachiyomi/view/updatesView.sq index 78c17f93ae..9829c60650 100644 --- a/data/src/main/sqldelight/tachiyomi/view/updatesView.sq +++ b/data/src/main/sqldelight/tachiyomi/view/updatesView.sq @@ -17,7 +17,11 @@ SELECT chapters.date_fetch AS datefetch FROM mangas JOIN chapters ON mangas._id = chapters.manga_id +LEFT JOIN excluded_scanlators +ON mangas._id = excluded_scanlators.manga_id +AND chapters.scanlator = excluded_scanlators.scanlator WHERE favorite = 1 AND source <> 6969 +AND excluded_scanlators.scanlator IS NULL AND date_fetch > date_added UNION SELECT @@ -44,7 +48,11 @@ LEFT JOIN ( ON ME.merge_id = mangas._id JOIN chapters ON ME.manga_id = chapters.manga_id +LEFT JOIN excluded_scanlators +ON mangas._id = excluded_scanlators.manga_id +AND chapters.scanlator = excluded_scanlators.scanlator WHERE favorite = 1 AND source = 6969 +AND excluded_scanlators.scanlator IS NULL AND date_fetch > date_added ORDER BY datefetch DESC; From 68d0960fc8d830c2623aef2938e2a4a597b9a243 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 14 Feb 2025 23:02:16 +0700 Subject: [PATCH 16/16] also migrate database --- data/src/main/sqldelight/tachiyomi/migrations/36.sqm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/data/src/main/sqldelight/tachiyomi/migrations/36.sqm b/data/src/main/sqldelight/tachiyomi/migrations/36.sqm index cc58a5d90c..ed2a068cb3 100644 --- a/data/src/main/sqldelight/tachiyomi/migrations/36.sqm +++ b/data/src/main/sqldelight/tachiyomi/migrations/36.sqm @@ -97,7 +97,11 @@ SELECT chapters.date_fetch AS datefetch FROM mangas JOIN chapters ON mangas._id = chapters.manga_id +LEFT JOIN excluded_scanlators +ON mangas._id = excluded_scanlators.manga_id +AND chapters.scanlator = excluded_scanlators.scanlator WHERE favorite = 1 AND source <> 6969 +AND excluded_scanlators.scanlator IS NULL AND date_fetch > date_added UNION SELECT @@ -124,6 +128,10 @@ LEFT JOIN ( ON ME.merge_id = mangas._id JOIN chapters ON ME.manga_id = chapters.manga_id +LEFT JOIN excluded_scanlators +ON mangas._id = excluded_scanlators.manga_id +AND chapters.scanlator = excluded_scanlators.scanlator WHERE favorite = 1 AND source = 6969 +AND excluded_scanlators.scanlator IS NULL AND date_fetch > date_added ORDER BY datefetch DESC; \ No newline at end of file