From 1d814aabaef79a6f147cb5a3b884a136ee1f81c6 Mon Sep 17 00:00:00 2001 From: Gauthier Date: Sun, 23 Jan 2022 03:25:05 +0800 Subject: [PATCH] fix: handle Komga tracks during manga migration (#6463) * fix: handle Komga tracks during manga migration closes #6354 * refactor: remove Komga direct reference (cherry picked from commit cd7cf3583e7c3b5379dcc7507675de90dff44467) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt --- .../data/track/EnhancedTrackService.kt | 11 +++++++++++ .../kanade/tachiyomi/data/track/komga/Komga.kt | 11 +++++++++++ .../migration/manga/MigrationMangaPresenter.kt | 17 +++++++++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/EnhancedTrackService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/EnhancedTrackService.kt index 4fefaf2b5..21ee0e7e4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/EnhancedTrackService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/EnhancedTrackService.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.data.track import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.source.Source @@ -25,4 +26,14 @@ interface EnhancedTrackService { * match is similar to TrackService.search, but only return zero or one match. */ suspend fun match(manga: Manga): TrackSearch? + + /** + * Checks whether the provided source/track/manga triplet is from this TrackService + */ + fun isTrackFrom(track: Track, manga: Manga, source: Source): Boolean + + /** + * Migrates the given track for the manga to the newSource, if possible + */ + fun migrateTrack(track: Track, manga: Manga, newSource: Source): Track? } 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 index 19029ef9b..03afcb213 100644 --- 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 @@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.data.track.EnhancedTrackService import eu.kanade.tachiyomi.data.track.NoLoginTrackService import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.model.TrackSearch +import eu.kanade.tachiyomi.source.Source import okhttp3.Dns import okhttp3.OkHttpClient @@ -103,4 +104,14 @@ class Komga(private val context: Context, id: Int) : TrackService(id), EnhancedT } catch (e: Exception) { null } + + override fun isTrackFrom(track: Track, manga: Manga, source: Source): Boolean = + accept(source) && track.tracking_url == manga.url + + override fun migrateTrack(track: Track, manga: Manga, newSource: Source): Track? = + if (accept(newSource)) { + track.also { track.tracking_url = manga.url } + } else { + null + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt index b0f6a2ee4..6e15d17b2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt @@ -6,6 +6,8 @@ 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.EnhancedTrackService +import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.toSChapter @@ -24,6 +26,7 @@ class MigrationMangaPresenter( private val sourceId: Long, private val db: DatabaseHelper = Injekt.get() ) : BasePresenter() { + private val enhancedServices by lazy { Injekt.get().services.filterIsInstance() } override fun onCreate(savedState: Bundle?) { super.onCreate(savedState) @@ -43,16 +46,18 @@ class MigrationMangaPresenter( // SY --> fun migrateManga(prevManga: Manga, manga: Manga, replace: Boolean) { + val prevSource = sourceManager.get(prevManga.source) val source = sourceManager.get(manga.source) ?: return Observable.defer { runAsObservable { source.getChapterList(manga.toMangaInfo()).map { it.toSChapter() } } }.onErrorReturn { emptyList() } - .doOnNext { migrateMangaInternal(source, it, prevManga, manga, replace) } + .doOnNext { migrateMangaInternal(prevSource, source, it, prevManga, manga, replace) } .onErrorReturn { emptyList() }.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe() } private fun migrateMangaInternal( + prevSource: Source?, source: Source, sourceChapters: List, prevManga: Manga, @@ -95,12 +100,16 @@ class MigrationMangaPresenter( } // Update track if (migrateTracks) { - val tracks = db.getTracks(prevManga).executeAsBlocking() - for (track in tracks) { + val tracksToUpdate = db.getTracks(prevManga).executeAsBlocking().mapNotNull { track -> track.id = null track.manga_id = manga.id!! + + val service = enhancedServices + .firstOrNull { prevSource != null && it.isTrackFrom(track, prevManga, prevSource) } + if (service != null) service.migrateTrack(track, manga, source) + else track } - db.insertTracks(tracks).executeAsBlocking() + db.insertTracks(tracksToUpdate).executeAsBlocking() } if (migrateExtra) {