From d6b3b0baf70b3a6caccffd367b707f26c1e6010d Mon Sep 17 00:00:00 2001 From: Gauthier Date: Sun, 23 May 2021 00:07:58 +0800 Subject: [PATCH] Add Komga as an unattended track service (#5049) * fix: prevent crash if TrackService.getScoreList() is empty * disabled track score button if service doesn't support scoring * first implementation of the Komga tracking this doesn't work for read lists * auto track when adding to library * handle refresh * 2-way sync of chapters for unattended tracking services * Update app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSheet.kt Co-authored-by: Andreas * group strings together * support for read lists * sync read chapters on bind * only mark local chapters as read during 2-way sync (incoming) * local progress from read chapters will be sent to remote tracker on bind/refresh this enables syncing after reading offline * remove unused variable * refactor the 2-way sync in a util function * handle auto add to track for unattended services from the browse source screen when long clicking this will also sync chapters, as it is possible to have read or marked as read chapters from there * 2-way sync when library update for TRACKING * refactor * better handling of what has been read server side * refactor: extract function * fix: localLastRead could be -1 when all chapters are read * refactor to rethrow exception so it can be shown in toast * extract strings * replace komga logo Co-authored-by: Andreas --- .../data/library/LibraryUpdateService.kt | 6 ++ .../data/preference/PreferenceKeys.kt | 2 + .../data/preference/PreferencesHelper.kt | 2 + .../data/track/NoLoginTrackService.kt | 8 ++ .../tachiyomi/data/track/TrackManager.kt | 6 +- .../data/track/UnattendedTrackService.kt | 21 ++++ .../tachiyomi/data/track/komga/Komga.kt | 99 ++++++++++++++++++ .../tachiyomi/data/track/komga/KomgaApi.kt | 84 +++++++++++++++ .../tachiyomi/data/track/komga/KomgaModels.kt | 83 +++++++++++++++ .../source/browse/BrowseSourcePresenter.kt | 31 ++++++ .../tachiyomi/ui/manga/MangaController.kt | 21 ++++ .../tachiyomi/ui/manga/MangaPresenter.kt | 10 ++ .../tachiyomi/ui/manga/track/TrackHolder.kt | 7 ++ .../tachiyomi/ui/manga/track/TrackSheet.kt | 39 ++++++- .../ui/setting/SettingsTrackingController.kt | 21 +++- .../util/chapter/ChapterTrackSync.kt | 42 ++++++++ .../res/drawable-xhdpi/ic_tracker_komga.webp | Bin 0 -> 77834 bytes app/src/main/res/values/strings.xml | 6 ++ 18 files changed, 481 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/track/NoLoginTrackService.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/track/UnattendedTrackService.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaApi.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaModels.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterTrackSync.kt create mode 100644 app/src/main/res/drawable-xhdpi/ic_tracker_komga.webp 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 86a2b81a1..0da101b71 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -21,12 +21,14 @@ import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Companion.start import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.track.TrackManager +import eu.kanade.tachiyomi.data.track.UnattendedTrackService import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.toSChapter import eu.kanade.tachiyomi.source.model.toSManga import eu.kanade.tachiyomi.util.chapter.NoChaptersException import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource +import eu.kanade.tachiyomi.util.chapter.syncChaptersWithTrackServiceTwoWay import eu.kanade.tachiyomi.util.prepUpdateCover import eu.kanade.tachiyomi.util.shouldDownloadNewChapters import eu.kanade.tachiyomi.util.storage.getUriCompat @@ -416,6 +418,10 @@ class LibraryUpdateService( try { val updatedTrack = service.refresh(track) db.insertTrack(updatedTrack).executeAsBlocking() + + if (service is UnattendedTrackService) { + syncChaptersWithTrackServiceTwoWay(db, db.getChapters(manga).executeAsBlocking(), track, service) + } } catch (e: Throwable) { // Ignore errors and continue Timber.e(e) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index 7b24759fd..0caa65365 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -97,6 +97,8 @@ object PreferenceKeys { const val autoUpdateTrack = "pref_auto_update_manga_sync_key" + const val autoAddTrack = "pref_auto_add_track_key" + const val lastUsedSource = "last_catalogue_source" const val lastUsedCategory = "last_used_category" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index cdfc3516d..f685fd6c7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -171,6 +171,8 @@ class PreferencesHelper(val context: Context) { fun autoUpdateTrack() = prefs.getBoolean(Keys.autoUpdateTrack, true) + fun autoAddTrack() = prefs.getBoolean(Keys.autoAddTrack, true) + fun lastUsedSource() = flowPrefs.getLong(Keys.lastUsedSource, -1) fun lastUsedCategory() = flowPrefs.getInt(Keys.lastUsedCategory, 0) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/NoLoginTrackService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/NoLoginTrackService.kt new file mode 100644 index 000000000..7e5f02fc8 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/NoLoginTrackService.kt @@ -0,0 +1,8 @@ +package eu.kanade.tachiyomi.data.track + +/** + * A TrackService that doesn't need explicit login. + */ +interface NoLoginTrackService { + fun loginNoop() +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackManager.kt index 173a6ffd6..05065920c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackManager.kt @@ -4,6 +4,7 @@ import android.content.Context import eu.kanade.tachiyomi.data.track.anilist.Anilist import eu.kanade.tachiyomi.data.track.bangumi.Bangumi import eu.kanade.tachiyomi.data.track.kitsu.Kitsu +import eu.kanade.tachiyomi.data.track.komga.Komga import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeList import eu.kanade.tachiyomi.data.track.shikimori.Shikimori @@ -15,6 +16,7 @@ class TrackManager(context: Context) { const val KITSU = 3 const val SHIKIMORI = 4 const val BANGUMI = 5 + const val KOMGA = 6 } val myAnimeList = MyAnimeList(context, MYANIMELIST) @@ -27,7 +29,9 @@ class TrackManager(context: Context) { val bangumi = Bangumi(context, BANGUMI) - val services = listOf(myAnimeList, aniList, kitsu, shikimori, bangumi) + val komga = Komga(context, KOMGA) + + val services = listOf(myAnimeList, aniList, kitsu, shikimori, bangumi, komga) fun getService(id: Int) = services.find { it.id == id } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/UnattendedTrackService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/UnattendedTrackService.kt new file mode 100644 index 000000000..fbbed65ea --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/UnattendedTrackService.kt @@ -0,0 +1,21 @@ +package eu.kanade.tachiyomi.data.track + +import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.track.model.TrackSearch +import eu.kanade.tachiyomi.source.Source + +/** + * An Unattended Track Service will never prompt the user to match a manga with the remote. + * It is expected that such Track Sercice can only work with specific sources and unique IDs. + */ +interface UnattendedTrackService { + /** + * This TrackService will only work with the sources that are accepted by this filter function. + */ + fun accept(source: Source): Boolean + + /** + * match is similar to TrackService.search, but only return zero or one match. + */ + suspend fun match(manga: Manga): TrackSearch? +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt new file mode 100644 index 000000000..2c76c6998 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt @@ -0,0 +1,99 @@ +package eu.kanade.tachiyomi.data.track.komga + +import android.content.Context +import android.graphics.Color +import androidx.annotation.StringRes +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.database.models.Track +import eu.kanade.tachiyomi.data.track.NoLoginTrackService +import eu.kanade.tachiyomi.data.track.TrackService +import eu.kanade.tachiyomi.data.track.UnattendedTrackService +import eu.kanade.tachiyomi.data.track.model.TrackSearch +import eu.kanade.tachiyomi.source.Source +import okhttp3.Dns +import okhttp3.OkHttpClient + +class Komga(private val context: Context, id: Int) : TrackService(id), UnattendedTrackService, NoLoginTrackService { + + companion object { + const val UNREAD = 1 + const val READING = 2 + const val COMPLETED = 3 + + const val ACCEPTED_SOURCE = "eu.kanade.tachiyomi.extension.all.komga.Komga" + } + + override val client: OkHttpClient = + networkService.client.newBuilder() + .dns(Dns.SYSTEM) // don't use DNS over HTTPS as it breaks IP addressing + .build() + + val api by lazy { KomgaApi(client) } + + @StringRes + override fun nameRes() = R.string.tracker_komga + + override fun getLogo() = R.drawable.ic_tracker_komga + + override fun getLogoColor() = Color.rgb(51, 37, 50) + + override fun getStatusList() = listOf(UNREAD, READING, COMPLETED) + + override fun getStatus(status: Int): String = with(context) { + when (status) { + UNREAD -> getString(R.string.unread) + READING -> getString(R.string.currently_reading) + COMPLETED -> getString(R.string.completed) + else -> "" + } + } + + override fun getCompletionStatus(): Int = COMPLETED + + override fun getScoreList(): List = emptyList() + + override fun displayScore(track: Track): String = "" + + override suspend fun add(track: Track): Track { + TODO("Not yet implemented: add") + } + + override suspend fun update(track: Track): Track { + return api.updateProgress(track) + } + + override suspend fun bind(track: Track): Track { + return track + } + + override suspend fun search(query: String): List { + TODO("Not yet implemented: search") + } + + override suspend fun refresh(track: Track): Track { + val remoteTrack = api.getTrackSearch(track.tracking_url)!! + track.copyPersonalFrom(remoteTrack) + track.total_chapters = remoteTrack.total_chapters + return track + } + + override suspend fun login(username: String, password: String) { + saveCredentials("user", "pass") + } + + // TrackService.isLogged works by checking that credentials are saved. + // By saving dummy, unused credentials, we can activate the tracker simply by login/logout + override fun loginNoop() { + saveCredentials("user", "pass") + } + + override fun accept(source: Source): Boolean = source::class.qualifiedName == ACCEPTED_SOURCE + + override suspend fun match(manga: Manga): TrackSearch? = + try { + api.getTrackSearch(manga.url) + } catch (e: Exception) { + null + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaApi.kt new file mode 100644 index 000000000..c901580c3 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaApi.kt @@ -0,0 +1,84 @@ +package eu.kanade.tachiyomi.data.track.komga + +import eu.kanade.tachiyomi.data.database.models.Track +import eu.kanade.tachiyomi.data.track.TrackManager +import eu.kanade.tachiyomi.data.track.model.TrackSearch +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.await +import eu.kanade.tachiyomi.network.parseAs +import eu.kanade.tachiyomi.util.lang.withIOContext +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import timber.log.Timber +import uy.kohesive.injekt.injectLazy + +const val READLIST_API = "/api/v1/readlists" + +class KomgaApi(private val client: OkHttpClient) { + + private val json: Json by injectLazy() + + suspend fun getTrackSearch(url: String): TrackSearch = + withIOContext { + try { + val track = if (url.contains(READLIST_API)) { + client.newCall(GET(url)) + .await() + .parseAs() + .toTrack() + } else { + client.newCall(GET(url)) + .await() + .parseAs() + .toTrack() + } + + val progress = client + .newCall(GET("$url/read-progress/tachiyomi")) + .await() + .parseAs() + + track.apply { + cover_url = "$url/thumbnail" + tracking_url = url + total_chapters = progress.booksCount + status = when (progress.booksCount) { + progress.booksUnreadCount -> Komga.UNREAD + progress.booksReadCount -> Komga.COMPLETED + else -> Komga.READING + } + last_chapter_read = progress.lastReadContinuousIndex + } + } catch (e: Exception) { + Timber.w(e, "Could not get item: $url") + throw e + } + } + + suspend fun updateProgress(track: Track): Track { + val progress = ReadProgressUpdateDto(track.last_chapter_read) + val payload = json.encodeToString(progress) + client.newCall( + Request.Builder() + .url("${track.tracking_url}/read-progress/tachiyomi") + .put(payload.toRequestBody("application/json".toMediaType())) + .build() + ) + .await() + return getTrackSearch(track.tracking_url) + } + + private fun SeriesDto.toTrack(): TrackSearch = TrackSearch.create(TrackManager.KOMGA).also { + it.title = metadata.title + it.summary = metadata.summary + it.publishing_status = metadata.status + } + + private fun ReadListDto.toTrack(): TrackSearch = TrackSearch.create(TrackManager.KOMGA).also { + it.title = name + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaModels.kt new file mode 100644 index 000000000..d27af7f16 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaModels.kt @@ -0,0 +1,83 @@ +package eu.kanade.tachiyomi.data.track.komga + +import kotlinx.serialization.Serializable + +@Serializable +data class SeriesDto( + val id: String, + val libraryId: String, + val name: String, + val created: String?, + val lastModified: String?, + val fileLastModified: String, + val booksCount: Int, + val booksReadCount: Int, + val booksUnreadCount: Int, + val booksInProgressCount: Int, + val metadata: SeriesMetadataDto, + val booksMetadata: BookMetadataAggregationDto +) + +@Serializable +data class SeriesMetadataDto( + val status: String, + val created: String?, + val lastModified: String?, + val title: String, + val titleSort: String, + val summary: String, + val summaryLock: Boolean, + val readingDirection: String, + val readingDirectionLock: Boolean, + val publisher: String, + val publisherLock: Boolean, + val ageRating: Int?, + val ageRatingLock: Boolean, + val language: String, + val languageLock: Boolean, + val genres: Set, + val genresLock: Boolean, + val tags: Set, + val tagsLock: Boolean +) + +@Serializable +data class BookMetadataAggregationDto( + val authors: List = emptyList(), + val releaseDate: String?, + val summary: String, + val summaryNumber: String, + + val created: String, + val lastModified: String +) + +@Serializable +data class AuthorDto( + val name: String, + val role: String +) + +@Serializable +data class ReadProgressUpdateDto( + val lastBookRead: Int, +) + +@Serializable +data class ReadListDto( + val id: String, + val name: String, + val bookIds: List, + val createdDate: String, + val lastModifiedDate: String, + val filtered: Boolean +) + +@Serializable +data class ReadProgressDto( + val booksCount: Int, + val booksReadCount: Int, + val booksUnreadCount: Int, + val booksInProgressCount: Int, + val lastReadContinuousIndex: Int, +) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt index 4ae85e118..a4646b7eb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt @@ -9,6 +9,9 @@ import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.MangaCategory import eu.kanade.tachiyomi.data.database.models.toMangaInfo import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.data.track.TrackManager +import eu.kanade.tachiyomi.data.track.TrackService +import eu.kanade.tachiyomi.data.track.UnattendedTrackService import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.model.Filter @@ -30,6 +33,7 @@ import eu.kanade.tachiyomi.ui.browse.source.filter.TextSectionItem import eu.kanade.tachiyomi.ui.browse.source.filter.TriStateItem import eu.kanade.tachiyomi.ui.browse.source.filter.TriStateSectionItem import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper +import eu.kanade.tachiyomi.util.chapter.syncChaptersWithTrackServiceTwoWay import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.withUIContext import eu.kanade.tachiyomi.util.removeCovers @@ -102,6 +106,8 @@ open class BrowseSourcePresenter( */ private var pageSubscription: Subscription? = null + private val loggedServices by lazy { Injekt.get().services.filter { it.isLogged } } + init { query = searchQuery ?: "" } @@ -260,11 +266,36 @@ open class BrowseSourcePresenter( manga.removeCovers(coverCache) } else { ChapterSettingsHelper.applySettingDefaults(manga) + + if (prefs.autoAddTrack()) { + autoAddTrack(manga) + } } db.insertManga(manga).executeAsBlocking() } + private fun autoAddTrack(manga: Manga) { + loggedServices + .filterIsInstance() + .filter { it.accept(source) } + .forEach { service -> + launchIO { + try { + service.match(manga)?.let { track -> + track.manga_id = manga.id!! + (service as TrackService).bind(track) + db.insertTrack(track).executeAsBlocking() + + syncChaptersWithTrackServiceTwoWay(db, db.getChapters(manga).executeAsBlocking(), track, service as TrackService) + } + } catch (e: Exception) { + Timber.w(e, "Could not match manga: ${manga.title} with service $service") + } + } + } + } + /** * Set the filter states for the current source. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index 8be864f0a..c0209f352 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -37,6 +37,8 @@ import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.download.DownloadService import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.data.track.TrackService +import eu.kanade.tachiyomi.data.track.UnattendedTrackService import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.databinding.MangaControllerBinding import eu.kanade.tachiyomi.source.LocalSource @@ -72,6 +74,7 @@ import eu.kanade.tachiyomi.ui.recent.updates.UpdatesController import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.util.chapter.NoChaptersException import eu.kanade.tachiyomi.util.hasCustomCover +import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.toast @@ -507,6 +510,24 @@ class MangaController : .showDialog(router) } } + + if (source != null && preferences.autoAddTrack()) { + presenter.trackList + .map { it.service } + .filterIsInstance() + .filter { it.accept(source!!) } + .forEach { service -> + launchIO { + try { + service.match(manga)?.let { track -> + presenter.registerTracking(track, service as TrackService) + } + } catch (e: Exception) { + Timber.w(e, "Could not match manga: ${manga.title} with service $service") + } + } + } + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt index 8e1a6b8d3..87c6452d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt @@ -17,6 +17,7 @@ import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackService +import eu.kanade.tachiyomi.data.track.UnattendedTrackService import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.model.toSChapter @@ -26,6 +27,7 @@ import eu.kanade.tachiyomi.ui.manga.chapter.ChapterItem import eu.kanade.tachiyomi.ui.manga.track.TrackItem import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource +import eu.kanade.tachiyomi.util.chapter.syncChaptersWithTrackServiceTwoWay import eu.kanade.tachiyomi.util.isLocal import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.withUIContext @@ -709,6 +711,10 @@ class MangaPresenter( async { val track = it.service.refresh(it.track!!) db.insertTrack(track).executeAsBlocking() + + if (it.service is UnattendedTrackService) { + syncChaptersWithTrackServiceTwoWay(db, chapters, track, it.service) + } } } .awaitAll() @@ -740,6 +746,10 @@ class MangaPresenter( try { service.bind(item) db.insertTrack(item).executeAsBlocking() + + if (service is UnattendedTrackService) { + syncChaptersWithTrackServiceTwoWay(db, chapters, item, service) + } } catch (e: Throwable) { withUIContext { view?.applicationContext?.toast(e.message) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt index 012ab95e1..2afc1ba3f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.manga.track import android.annotation.SuppressLint import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView +import eu.kanade.tachiyomi.R.string import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.databinding.TrackItemBinding import uy.kohesive.injekt.injectLazy @@ -49,6 +50,12 @@ class TrackHolder(private val binding: TrackItemBinding, adapter: TrackAdapter) if (track.total_chapters > 0) track.total_chapters else "-" binding.trackStatus.text = item.service.getStatus(track.status) binding.trackScore.text = if (track.score == 0f) "-" else item.service.displayScore(track) + if (item.service.getScoreList().isEmpty()) { + with(binding.trackScore) { + text = context.getString(string.score_unsupported) + isEnabled = false + } + } if (item.service.supportsReadingDates) { binding.trackStartDate.text = diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSheet.kt index 2099ca572..5c2b117c8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSheet.kt @@ -5,16 +5,25 @@ import android.view.LayoutInflater import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.bottomsheet.BottomSheetBehavior +import eu.kanade.tachiyomi.R.string import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.track.UnattendedTrackService import eu.kanade.tachiyomi.databinding.TrackControllerBinding +import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.ui.base.controller.openInBrowser import eu.kanade.tachiyomi.ui.manga.MangaController +import eu.kanade.tachiyomi.util.lang.launchIO +import eu.kanade.tachiyomi.util.lang.withUIContext import eu.kanade.tachiyomi.util.system.copyToClipboard +import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.widget.sheet.BaseBottomSheetDialog +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get class TrackSheet( val controller: MangaController, - val manga: Manga + val manga: Manga, + private val sourceManager: SourceManager = Injekt.get() ) : BaseBottomSheetDialog(controller.activity!!), TrackAdapter.OnClickListener, SetTrackStatusDialog.Listener, @@ -69,7 +78,31 @@ class TrackSheet( override fun onSetClick(position: Int) { val item = adapter.getItem(position) ?: return - TrackSearchDialog(controller, item.service).showDialog(controller.router, TAG_SEARCH_CONTROLLER) + + if (item.service is UnattendedTrackService) { + if (item.track != null) { + controller.presenter.unregisterTracking(item.service) + return + } + + if (!item.service.accept(sourceManager.getOrStub(manga.source))) { + controller.presenter.view?.applicationContext?.toast(string.source_unsupported) + return + } + + launchIO { + try { + item.service.match(manga)?.let { track -> + controller.presenter.registerTracking(track, item.service) + } + ?: withUIContext { controller.presenter.view?.applicationContext?.toast(string.error_no_match) } + } catch (e: Exception) { + withUIContext { controller.presenter.view?.applicationContext?.toast(string.error_no_match) } + } + } + } else { + TrackSearchDialog(controller, item.service).showDialog(controller.router, TAG_SEARCH_CONTROLLER) + } } override fun onTitleLongClick(position: Int) { @@ -94,7 +127,7 @@ class TrackSheet( override fun onScoreClick(position: Int) { val item = adapter.getItem(position) ?: return - if (item.track == null) return + if (item.track == null || item.service.getScoreList().isEmpty()) return SetTrackScoreDialog(controller, this, item).showDialog(controller.router) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt index 950d2dc60..20263fe71 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.setting import android.app.Activity import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.track.NoLoginTrackService import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.anilist.AnilistApi @@ -38,6 +39,11 @@ class SettingsTrackingController : titleRes = R.string.pref_auto_update_manga_sync defaultValue = true } + switchPreference { + key = Keys.autoAddTrack + titleRes = R.string.pref_auto_add_track + defaultValue = true + } preferenceCategory { titleRes = R.string.services @@ -58,6 +64,10 @@ class SettingsTrackingController : trackPreference(trackManager.bangumi) { activity?.openInBrowser(BangumiApi.authUrl(), trackManager.bangumi.getLogoColor()) } + trackPreference(trackManager.komga) { + trackManager.komga.loginNoop() + updatePreference(trackManager.komga.id) + } } preferenceCategory { infoPreference(R.string.tracking_info) @@ -76,9 +86,14 @@ class SettingsTrackingController : { onClick { if (service.isLogged) { - val dialog = TrackLogoutDialog(service) - dialog.targetController = this@SettingsTrackingController - dialog.showDialog(router) + if (service is NoLoginTrackService) { + service.logout() + updatePreference(service.id) + } else { + val dialog = TrackLogoutDialog(service) + dialog.targetController = this@SettingsTrackingController + dialog.showDialog(router) + } } else { login() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterTrackSync.kt b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterTrackSync.kt new file mode 100644 index 000000000..4cd66d2b5 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterTrackSync.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.util.chapter + +import eu.kanade.tachiyomi.data.database.DatabaseHelper +import eu.kanade.tachiyomi.data.database.models.Chapter +import eu.kanade.tachiyomi.data.database.models.Track +import eu.kanade.tachiyomi.data.track.TrackService +import eu.kanade.tachiyomi.util.lang.launchIO +import timber.log.Timber + +/** + * Helper method for syncing a remote track with the local chapters, and back + * + * @param db the database. + * @param chapters a list of chapters from the source. + * @param remoteTrack the remote Track object. + * @param service the tracker service. + */ +fun syncChaptersWithTrackServiceTwoWay(db: DatabaseHelper, chapters: List, remoteTrack: Track, service: TrackService) { + val sortedChapters = chapters.sortedBy { it.chapter_number } + sortedChapters + .filterIndexed { index, chapter -> index < remoteTrack.last_chapter_read && !chapter.read } + .forEach { it.read = true } + db.updateChaptersProgress(sortedChapters).executeAsBlocking() + + val localLastRead = when { + sortedChapters.all { it.read } -> sortedChapters.size + sortedChapters.any { !it.read } -> sortedChapters.indexOfFirst { !it.read } + else -> 0 + } + + // update remote + remoteTrack.last_chapter_read = localLastRead + + launchIO { + try { + service.update(remoteTrack) + db.insertTrack(remoteTrack).executeAsBlocking() + } catch (e: Throwable) { + Timber.w(e) + } + } +} diff --git a/app/src/main/res/drawable-xhdpi/ic_tracker_komga.webp b/app/src/main/res/drawable-xhdpi/ic_tracker_komga.webp new file mode 100644 index 0000000000000000000000000000000000000000..90c4ea1175be8e4b74ca93dbca7bb4bd337e8487 GIT binary patch literal 77834 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%0A6ez;)bQPhz)-YCf(*E!v1OiO1SsaWnZj;M6 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 G^#K44?uozv literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 85b808f09..32ba77e70 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -376,6 +376,7 @@ Update chapter progress after reading + Track silently when adding manga to library Services One-way sync to update the chapter progress in tracking services. Set up tracking for individual manga entries from their tracking button. @@ -581,6 +582,7 @@ AniList MyAnimeList Kitsu + Komga Bangumi Shikimori Tracking @@ -589,6 +591,7 @@ %d trackers Add tracking + Unread Reading Currently reading Completed @@ -610,6 +613,9 @@ Invalid date supplied MAL login credentials not found Please login to MAL again + Not supported + Source is not supported + No match found A category with this name already exists!