From 2d2ee54c99bf24ce83245d4a8f44093868565d88 Mon Sep 17 00:00:00 2001 From: Alessandro Jean <14254807+alessandrojean@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:12:36 -0300 Subject: [PATCH] Add support to update strategy on global update (#7902) * Add support to update strategy. * Add JavaDoc and bump the LIB_VERSION_MAX constant. * Fix a word typo. * Store update strategy enum as integer in the DB. (cherry picked from commit ba533f30ce70bdcfbfaaae3e7758dbe38fe6fb1b) # Conflicts: # app/src/main/java/eu/kanade/data/DatabaseAdapter.kt # app/src/main/java/eu/kanade/data/manga/MangaMapper.kt # app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt # app/src/main/java/eu/kanade/tachiyomi/AppModule.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt # app/src/main/java/eu/kanade/tachiyomi/data/database/models/MangaImpl.kt # app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt # app/src/main/sqldelight/data/mangas.sq # app/src/main/sqldelight/migrations/20.sqm --- .../java/eu/kanade/data/DatabaseAdapter.kt | 10 +++++++++ .../java/eu/kanade/data/manga/LibraryQuery.kt | 8 ++++--- .../java/eu/kanade/data/manga/MangaMapper.kt | 16 +++++++++----- .../kanade/data/manga/MangaRepositoryImpl.kt | 8 +++++++ .../domain/manga/interactor/UpdateManga.kt | 1 + .../eu/kanade/domain/manga/model/Manga.kt | 5 +++++ .../kanade/domain/manga/model/MangaUpdate.kt | 3 +++ .../java/eu/kanade/tachiyomi/AppModule.kt | 2 ++ .../tachiyomi/data/backup/BackupManager.kt | 9 +++++++- .../data/backup/models/BackupManga.kt | 4 ++++ .../tachiyomi/data/database/models/Manga.kt | 1 + .../data/database/models/MangaImpl.kt | 3 +++ .../data/library/LibraryUpdateService.kt | 4 ++++ .../extension/util/ExtensionLoader.kt | 2 +- app/src/main/sqldelight/data/mangas.sq | 11 ++++++---- app/src/main/sqldelight/migrations/22.sqm | 1 + i18n/src/main/res/values/strings.xml | 1 + .../kanade/tachiyomi/source/model/SManga.kt | 5 +++++ .../tachiyomi/source/model/SMangaImpl.kt | 2 ++ .../tachiyomi/source/model/UpdateStrategy.kt | 22 +++++++++++++++++++ 20 files changed, 103 insertions(+), 15 deletions(-) create mode 100644 app/src/main/sqldelight/migrations/22.sqm create mode 100644 source-api/src/main/java/eu/kanade/tachiyomi/source/model/UpdateStrategy.kt diff --git a/app/src/main/java/eu/kanade/data/DatabaseAdapter.kt b/app/src/main/java/eu/kanade/data/DatabaseAdapter.kt index b40e89899..2b4f1c376 100644 --- a/app/src/main/java/eu/kanade/data/DatabaseAdapter.kt +++ b/app/src/main/java/eu/kanade/data/DatabaseAdapter.kt @@ -1,6 +1,7 @@ package eu.kanade.data import com.squareup.sqldelight.ColumnAdapter +import eu.kanade.tachiyomi.source.model.UpdateStrategy import java.util.Date val dateAdapter = object : ColumnAdapter { @@ -19,6 +20,15 @@ val listOfStringsAdapter = object : ColumnAdapter, String> { override fun encode(value: List) = value.joinToString(separator = listOfStringsSeparator) } +val updateStrategyAdapter = object : ColumnAdapter { + private val enumValues by lazy { UpdateStrategy.values() } + + override fun decode(databaseValue: Long): UpdateStrategy = + enumValues.getOrElse(databaseValue.toInt()) { UpdateStrategy.ALWAYS_UPDATE } + + override fun encode(value: UpdateStrategy): Long = value.ordinal.toLong() +} + // SY --> private const val listOfStringsAndSeparator = " & " val listOfStringsAndAdapter = object : ColumnAdapter, String> { diff --git a/app/src/main/java/eu/kanade/data/manga/LibraryQuery.kt b/app/src/main/java/eu/kanade/data/manga/LibraryQuery.kt index 540d75831..ca54dbc92 100644 --- a/app/src/main/java/eu/kanade/data/manga/LibraryQuery.kt +++ b/app/src/main/java/eu/kanade/data/manga/LibraryQuery.kt @@ -4,6 +4,7 @@ import com.squareup.sqldelight.Query import com.squareup.sqldelight.db.SqlCursor import com.squareup.sqldelight.db.SqlDriver import com.squareup.sqldelight.internal.copyOnWriteList +import eu.kanade.data.updateStrategyAdapter import eu.kanade.tachiyomi.data.database.models.LibraryManga import exh.source.MERGED_SOURCE_ID @@ -27,9 +28,10 @@ private val mapper = { cursor: SqlCursor -> cover_last_modified = cursor.getLong(16)!! date_added = cursor.getLong(17)!! filtered_scanlators = cursor.getString(18) - unreadCount = cursor.getLong(19)!!.toInt() - readCount = cursor.getLong(20)!!.toInt() - category = cursor.getLong(21)!!.toInt() + update_strategy = updateStrategyAdapter.decode(cursor.getLong(19)!!) + unreadCount = cursor.getLong(20)!!.toInt() + readCount = cursor.getLong(21)!!.toInt() + category = cursor.getLong(22)!!.toInt() } } diff --git a/app/src/main/java/eu/kanade/data/manga/MangaMapper.kt b/app/src/main/java/eu/kanade/data/manga/MangaMapper.kt index 3a2698dbc..37c209e00 100644 --- a/app/src/main/java/eu/kanade/data/manga/MangaMapper.kt +++ b/app/src/main/java/eu/kanade/data/manga/MangaMapper.kt @@ -4,9 +4,10 @@ import eu.kanade.data.listOfStringsAndAdapter import eu.kanade.domain.chapter.model.Chapter import eu.kanade.domain.manga.model.Manga import eu.kanade.tachiyomi.data.database.models.LibraryManga +import eu.kanade.tachiyomi.source.model.UpdateStrategy -val mangaMapper: (Long, Long, String, String?, String?, String?, List?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, List?) -> Manga = - { id, source, url, artist, author, description, genre, title, status, thumbnailUrl, favorite, lastUpdate, _, initialized, viewer, chapterFlags, coverLastModified, dateAdded, filteredScanlators -> +val mangaMapper: (Long, Long, String, String?, String?, String?, List?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, List?, UpdateStrategy) -> Manga = + { id, source, url, artist, author, description, genre, title, status, thumbnailUrl, favorite, lastUpdate, _, initialized, viewer, chapterFlags, coverLastModified, dateAdded, filteredScanlators, updateStrategy -> Manga( id = id, source = source, @@ -26,6 +27,7 @@ val mangaMapper: (Long, Long, String, String?, String?, String?, List?, ogStatus = status, // SY <-- thumbnailUrl = thumbnailUrl, + updateStrategy = updateStrategy, initialized = initialized, // SY --> filteredScanlators = filteredScanlators, @@ -33,8 +35,8 @@ val mangaMapper: (Long, Long, String, String?, String?, String?, List?, ) } -val mangaChapterMapper: (Long, Long, String, String?, String?, String?, List?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, List?, Long, Long, String, String, String?, Boolean, Boolean, Long, Float, Long, Long, Long) -> Pair = - { _id, source, url, artist, author, description, genre, title, status, thumbnailUrl, favorite, lastUpdate, next_update, initialized, viewerFlags, chapterFlags, coverLastModified, dateAdded, filteredScanlators, chapterId, mangaId, chapterUrl, name, scanlator, read, bookmark, lastPageRead, chapterNumber, sourceOrder, dateFetch, dateUpload -> +val mangaChapterMapper: (Long, Long, String, String?, String?, String?, List?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, UpdateStrategy, List?, Long, Long, String, String, String?, Boolean, Boolean, Long, Float, Long, Long, Long) -> Pair = + { _id, source, url, artist, author, description, genre, title, status, thumbnailUrl, favorite, lastUpdate, next_update, initialized, viewerFlags, chapterFlags, coverLastModified, dateAdded, updateStrategy, filteredScanlators, chapterId, mangaId, chapterUrl, name, scanlator, read, bookmark, lastPageRead, chapterNumber, sourceOrder, dateFetch, dateUpload -> Manga( id = _id, source = source, @@ -54,6 +56,7 @@ val mangaChapterMapper: (Long, Long, String, String?, String?, String?, List filteredScanlators = filteredScanlators, @@ -74,8 +77,8 @@ val mangaChapterMapper: (Long, Long, String, String?, String?, String?, List?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, List?, Long, Long, Long) -> LibraryManga = - { _id, source, url, artist, author, description, genre, title, status, thumbnail_url, favorite, last_update, next_update, initialized, viewer, chapter_flags, cover_last_modified, date_added, filtered_scanlators, unread_count, read_count, category -> +val libraryManga: (Long, Long, String, String?, String?, String?, List?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, UpdateStrategy, List?, Long, Long, Long) -> LibraryManga = + { _id, source, url, artist, author, description, genre, title, status, thumbnail_url, favorite, last_update, next_update, initialized, viewer, chapter_flags, cover_last_modified, date_added, update_strategy, filtered_scanlators, unread_count, read_count, category -> LibraryManga().apply { this.id = _id this.source = source @@ -89,6 +92,7 @@ val libraryManga: (Long, Long, String, String?, String?, String?, List?, this.thumbnail_url = thumbnail_url this.favorite = favorite this.last_update = last_update ?: 0 + this.update_strategy = update_strategy this.initialized = initialized this.viewer_flags = viewer.toInt() this.chapter_flags = chapter_flags.toInt() diff --git a/app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt b/app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt index 8671b0988..d6dae150d 100644 --- a/app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt +++ b/app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt @@ -4,6 +4,7 @@ import eu.kanade.data.AndroidDatabaseHandler import eu.kanade.data.DatabaseHandler import eu.kanade.data.listOfStringsAdapter import eu.kanade.data.listOfStringsAndAdapter +import eu.kanade.data.updateStrategyAdapter import eu.kanade.domain.manga.model.Manga import eu.kanade.domain.manga.model.MangaUpdate import eu.kanade.domain.manga.repository.MangaRepository @@ -96,6 +97,10 @@ class MangaRepositoryImpl( chapterFlags = manga.chapterFlags, coverLastModified = manga.coverLastModified, dateAdded = manga.dateAdded, + // SY --> + filteredScanlators = manga.filteredScanlators, + // SY <-- + updateStrategy = manga.updateStrategy, ) mangasQueries.selectLastInsertedRowId() } @@ -141,8 +146,11 @@ class MangaRepositoryImpl( chapterFlags = value.chapterFlags, coverLastModified = value.coverLastModified, dateAdded = value.dateAdded, + // SY --> filteredScanlators = value.filteredScanlators?.let(listOfStringsAndAdapter::encode), + // SY <-- mangaId = value.id, + updateStrategy = value.updateStrategy?.let(updateStrategyAdapter::encode), ) } } diff --git a/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt b/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt index ebc19b41a..802bbd467 100644 --- a/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt +++ b/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt @@ -78,6 +78,7 @@ class UpdateManga( genre = remoteManga.getGenres(), thumbnailUrl = thumbnailUrl, status = remoteManga.status.toLong(), + updateStrategy = remoteManga.update_strategy, initialized = true, ), ) diff --git a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt index 50a48dc84..c6b372b6d 100644 --- a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt +++ b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt @@ -8,6 +8,7 @@ import eu.kanade.tachiyomi.data.database.models.MangaImpl import eu.kanade.tachiyomi.data.library.CustomMangaManager import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.model.UpdateStrategy import eu.kanade.tachiyomi.widget.ExtendedNavigationView import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -34,6 +35,7 @@ data class Manga( val ogStatus: Long, // SY <-- val thumbnailUrl: String?, + val updateStrategy: UpdateStrategy, val initialized: Boolean, // SY --> val filteredScanlators: List?, @@ -183,6 +185,7 @@ data class Manga( ogStatus = 0L, // SY <-- thumbnailUrl = null, + updateStrategy = UpdateStrategy.ALWAYS_UPDATE, initialized = false, // SY --> filteredScanlators = null, @@ -229,6 +232,7 @@ fun Manga.toDbManga(): DbManga = MangaImpl().also { it.status = ogStatus.toInt() // SY <-- it.thumbnail_url = thumbnailUrl + it.update_strategy = updateStrategy it.initialized = initialized // SY --> it.filtered_scanlators = filteredScanlators?.let(listOfStringsAndAdapter::encode) @@ -255,6 +259,7 @@ fun Manga.toMangaUpdate(): MangaUpdate { status = ogStatus, // SY <-- thumbnailUrl = thumbnailUrl, + updateStrategy = updateStrategy, initialized = initialized, // SY --> filteredScanlators = filteredScanlators, diff --git a/app/src/main/java/eu/kanade/domain/manga/model/MangaUpdate.kt b/app/src/main/java/eu/kanade/domain/manga/model/MangaUpdate.kt index 6e343b056..142a9519f 100644 --- a/app/src/main/java/eu/kanade/domain/manga/model/MangaUpdate.kt +++ b/app/src/main/java/eu/kanade/domain/manga/model/MangaUpdate.kt @@ -1,5 +1,7 @@ package eu.kanade.domain.manga.model +import eu.kanade.tachiyomi.source.model.UpdateStrategy + data class MangaUpdate( val id: Long, val source: Long? = null, @@ -17,6 +19,7 @@ data class MangaUpdate( val genre: List? = null, val status: Long? = null, val thumbnailUrl: String? = null, + val updateStrategy: UpdateStrategy? = null, val initialized: Boolean? = null, // SY --> val filteredScanlators: List? = null, diff --git a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt index 923ddde12..400685008 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt @@ -16,6 +16,7 @@ import eu.kanade.data.dateAdapter import eu.kanade.data.listOfLongsAdapter import eu.kanade.data.listOfStringsAdapter import eu.kanade.data.listOfStringsAndAdapter +import eu.kanade.data.updateStrategyAdapter import eu.kanade.domain.UnsortedPreferences import eu.kanade.domain.backup.service.BackupPreferences import eu.kanade.domain.base.BasePreferences @@ -95,6 +96,7 @@ class AppModule(val app: Application) : InjektModule { ), mangasAdapter = Mangas.Adapter( genreAdapter = listOfStringsAdapter, + update_strategyAdapter = updateStrategyAdapter, // SY --> filtered_scanlatorsAdapter = listOfStringsAndAdapter, // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt index 4cd474b3a..a6fcf0ca5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt @@ -8,7 +8,9 @@ import data.Manga_sync import data.Mangas import eu.kanade.data.DatabaseHandler import eu.kanade.data.exh.mergedMangaReferenceMapper +import eu.kanade.data.listOfStringsAndAdapter import eu.kanade.data.manga.mangaMapper +import eu.kanade.data.updateStrategyAdapter import eu.kanade.domain.backup.service.BackupPreferences import eu.kanade.domain.category.interactor.GetCategories import eu.kanade.domain.category.model.Category @@ -564,6 +566,10 @@ class BackupManager( chapterFlags = manga.chapter_flags.toLong(), coverLastModified = manga.cover_last_modified, dateAdded = manga.date_added, + // SY --> + filteredScanlators = manga.filtered_scanlators?.nullIfBlank()?.let(listOfStringsAndAdapter::decode), + // SY <-- + updateStrategy = manga.update_strategy, ) mangasQueries.selectLastInsertedRowId() } @@ -588,10 +594,11 @@ class BackupManager( chapterFlags = manga.chapter_flags.toLong(), coverLastModified = manga.cover_last_modified, dateAdded = manga.date_added, - mangaId = manga.id!!, // SY --> filteredScanlators = manga.filtered_scanlators, // SY <-- + mangaId = manga.id!!, + updateStrategy = manga.update_strategy.let(updateStrategyAdapter::encode), ) } return manga.id!! diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt index 16134e716..e3521c178 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt @@ -6,6 +6,7 @@ import eu.kanade.tachiyomi.data.database.models.ChapterImpl import eu.kanade.tachiyomi.data.database.models.MangaImpl import eu.kanade.tachiyomi.data.database.models.TrackImpl import eu.kanade.tachiyomi.data.library.CustomMangaManager +import eu.kanade.tachiyomi.source.model.UpdateStrategy import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @@ -40,6 +41,7 @@ data class BackupManga( @ProtoNumber(102) var brokenHistory: List = emptyList(), @ProtoNumber(103) var viewer_flags: Int? = null, @ProtoNumber(104) var history: List = emptyList(), + @ProtoNumber(105) var updateStrategy: UpdateStrategy = UpdateStrategy.ALWAYS_UPDATE, // SY specific values @ProtoNumber(600) var mergedMangaReferences: List = emptyList(), @@ -72,6 +74,7 @@ data class BackupManga( date_added = this@BackupManga.dateAdded viewer_flags = this@BackupManga.viewer_flags ?: this@BackupManga.viewer chapter_flags = this@BackupManga.chapterFlags + update_strategy = this@BackupManga.updateStrategy filtered_scanlators = this@BackupManga.filtered_scanlators } } @@ -130,6 +133,7 @@ data class BackupManga( viewer = (manga.viewerFlags.toInt() and ReadingModeType.MASK), viewer_flags = manga.viewerFlags.toInt(), chapterFlags = manga.chapterFlags.toInt(), + updateStrategy = manga.updateStrategy, // SY --> filtered_scanlators = manga.filteredScanlators?.let(listOfStringsAndAdapter::encode), ).also { backupManga -> diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Manga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Manga.kt index 8954ba81c..0ecaea878 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Manga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Manga.kt @@ -105,6 +105,7 @@ fun Manga.toDomainManga(): DomainManga? { ogStatus = originalStatus.toLong(), // SY <-- thumbnailUrl = thumbnail_url, + updateStrategy = update_strategy, initialized = initialized, // SY --> filteredScanlators = filtered_scanlators?.let(listOfStringsAndAdapter::decode)?.nullIfEmpty(), diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/MangaImpl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/MangaImpl.kt index 589850d8d..0c89509aa 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/MangaImpl.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/MangaImpl.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.database.models import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.library.CustomMangaManager import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.model.UpdateStrategy import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy @@ -58,6 +59,8 @@ open class MangaImpl : Manga { override var date_added: Long = 0 + override var update_strategy: UpdateStrategy = UpdateStrategy.ALWAYS_UPDATE + override var initialized: Boolean = false override var viewer_flags: Int = 0 diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index e428d7c36..3d98687c0 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -52,6 +52,7 @@ import eu.kanade.tachiyomi.data.track.TrackStatus import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.UnmeteredSource import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.model.UpdateStrategy import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.ui.manga.track.TrackItem import eu.kanade.tachiyomi.util.lang.withIOContext @@ -435,6 +436,9 @@ class LibraryUpdateService( MANGA_NON_READ in restrictions && mangaWithNotif.totalChapters > 0 && !mangaWithNotif.hasStarted -> skippedUpdates.add(mangaWithNotif to getString(R.string.skipped_reason_not_started)) + mangaWithNotif.update_strategy != UpdateStrategy.ALWAYS_UPDATE -> + skippedUpdates.add(mangaWithNotif to getString(R.string.skipped_reason_not_always_update)) + else -> { // Convert to the manga that contains new chapters mangaWithNotif.toDomainManga()?.let { domainManga -> diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt index 5b9d79e0c..524134e45 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt @@ -38,7 +38,7 @@ internal object ExtensionLoader { private const val METADATA_HAS_README = "tachiyomi.extension.hasReadme" private const val METADATA_HAS_CHANGELOG = "tachiyomi.extension.hasChangelog" const val LIB_VERSION_MIN = 1.2 - const val LIB_VERSION_MAX = 1.3 + const val LIB_VERSION_MAX = 1.4 private const val PACKAGE_FLAGS = PackageManager.GET_CONFIGURATIONS or PackageManager.GET_SIGNATURES diff --git a/app/src/main/sqldelight/data/mangas.sq b/app/src/main/sqldelight/data/mangas.sq index 8f1b6f2c0..e101feecc 100644 --- a/app/src/main/sqldelight/data/mangas.sq +++ b/app/src/main/sqldelight/data/mangas.sq @@ -1,3 +1,4 @@ +import eu.kanade.tachiyomi.source.model.UpdateStrategy; import java.lang.String; import kotlin.collections.List; @@ -20,7 +21,8 @@ CREATE TABLE mangas( chapter_flags INTEGER NOT NULL, cover_last_modified INTEGER AS Long NOT NULL, date_added INTEGER AS Long NOT NULL, - filtered_scanlators TEXT AS List + filtered_scanlators TEXT AS List, + update_strategy INTEGER AS UpdateStrategy NOT NULL DEFAULT 0 ); CREATE INDEX library_favorite_index ON mangas(favorite) WHERE favorite = 1; @@ -151,8 +153,8 @@ WHERE favorite = 0 AND source IN :sourceIdsAND AND _id NOT IN ( ); insert: -INSERT INTO mangas(source,url,artist,author,description,genre,title,status,thumbnail_url,favorite,last_update,next_update,initialized,viewer,chapter_flags,cover_last_modified,date_added) -VALUES (:source,:url,:artist,:author,:description,:genre,:title,:status,:thumbnailUrl,:favorite,:lastUpdate,:nextUpdate,:initialized,:viewerFlags,:chapterFlags,:coverLastModified,:dateAdded); +INSERT INTO mangas(source,url,artist,author,description,genre,title,status,thumbnail_url,favorite,last_update,next_update,initialized,viewer,chapter_flags,cover_last_modified,date_added,filtered_scanlators,update_strategy) +VALUES (:source,:url,:artist,:author,:description,:genre,:title,:status,:thumbnailUrl,:favorite,:lastUpdate,:nextUpdate,:initialized,:viewerFlags,:chapterFlags,:coverLastModified,:dateAdded,:filteredScanlators,:updateStrategy); update: UPDATE mangas SET @@ -172,7 +174,8 @@ UPDATE mangas SET chapter_flags = coalesce(:chapterFlags, chapter_flags), cover_last_modified = coalesce(:coverLastModified, cover_last_modified), date_added = coalesce(:dateAdded, date_added), - filtered_scanlators = coalesce(:filteredScanlators, filtered_scanlators) + filtered_scanlators = coalesce(:filteredScanlators, filtered_scanlators), + update_strategy = coalesce(:updateStrategy, update_strategy) WHERE _id = :mangaId; selectLastInsertedRowId: diff --git a/app/src/main/sqldelight/migrations/22.sqm b/app/src/main/sqldelight/migrations/22.sqm new file mode 100644 index 000000000..6ca10ca4e --- /dev/null +++ b/app/src/main/sqldelight/migrations/22.sqm @@ -0,0 +1 @@ +ALTER TABLE mangas ADD COLUMN update_strategy INTEGER NOT NULL DEFAULT 0; \ No newline at end of file diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index 09263e7b4..883d54982 100755 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -801,6 +801,7 @@ Skipped because series is complete Skipped because there are unread chapters Skipped because no chapters are read + Skipped because series does not require updates Select cover image diff --git a/source-api/src/main/java/eu/kanade/tachiyomi/source/model/SManga.kt b/source-api/src/main/java/eu/kanade/tachiyomi/source/model/SManga.kt index 671f04afd..20c79dc66 100755 --- a/source-api/src/main/java/eu/kanade/tachiyomi/source/model/SManga.kt +++ b/source-api/src/main/java/eu/kanade/tachiyomi/source/model/SManga.kt @@ -20,6 +20,8 @@ interface SManga : Serializable { var thumbnail_url: String? + var update_strategy: UpdateStrategy + var initialized: Boolean fun getGenres(): List? { @@ -65,6 +67,8 @@ interface SManga : Serializable { status = other.status + update_strategy = other.update_strategy + if (!initialized) { initialized = other.initialized } @@ -81,6 +85,7 @@ interface SManga : Serializable { it.status = originalStatus // SY <-- it.thumbnail_url = thumbnail_url + it.update_strategy = update_strategy it.initialized = initialized } diff --git a/source-api/src/main/java/eu/kanade/tachiyomi/source/model/SMangaImpl.kt b/source-api/src/main/java/eu/kanade/tachiyomi/source/model/SMangaImpl.kt index 4791ef12f..0fb935ab8 100755 --- a/source-api/src/main/java/eu/kanade/tachiyomi/source/model/SMangaImpl.kt +++ b/source-api/src/main/java/eu/kanade/tachiyomi/source/model/SMangaImpl.kt @@ -20,6 +20,8 @@ class SMangaImpl : SManga { override var thumbnail_url: String? = null + override var update_strategy: UpdateStrategy = UpdateStrategy.ALWAYS_UPDATE + override var initialized: Boolean = false // SY --> diff --git a/source-api/src/main/java/eu/kanade/tachiyomi/source/model/UpdateStrategy.kt b/source-api/src/main/java/eu/kanade/tachiyomi/source/model/UpdateStrategy.kt new file mode 100644 index 000000000..95392e361 --- /dev/null +++ b/source-api/src/main/java/eu/kanade/tachiyomi/source/model/UpdateStrategy.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.source.model + +/** + * Define the update strategy for a single [SManga]. + * The strategy used will only take effect on the library update. + * + * @since extensions-lib 1.4 + */ +enum class UpdateStrategy { + /** + * Series marked as always update will be included in the library + * update if they aren't excluded by additional restrictions. + */ + ALWAYS_UPDATE, + + /** + * Series marked as only fetch once will be automatically skipped + * during library updates. Useful for cases where the series is previously + * known to be finished and have only a single chapter, for example. + */ + ONLY_FETCH_ONCE +}