Browse Source

fix: handle Komga tracks during manga migration (#6463)

* fix: handle Komga tracks during manga migration

closes #6354

* refactor: remove Komga direct reference
Gauthier 3 years ago
parent
commit
cd7cf3583e

+ 11 - 0
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?
 }

+ 11 - 0
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
+        }
 }

+ 16 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt

@@ -5,6 +5,8 @@ import com.jakewharton.rxrelay.BehaviorRelay
 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.track.EnhancedTrackService
+import eu.kanade.tachiyomi.data.track.TrackManager
 import eu.kanade.tachiyomi.source.CatalogueSource
 import eu.kanade.tachiyomi.source.Source
 import eu.kanade.tachiyomi.source.model.SChapter
@@ -19,6 +21,8 @@ import eu.kanade.tachiyomi.util.lang.launchIO
 import eu.kanade.tachiyomi.util.lang.launchUI
 import eu.kanade.tachiyomi.util.lang.withUIContext
 import eu.kanade.tachiyomi.util.system.toast
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
 import java.util.Date
 
 class SearchPresenter(
@@ -28,6 +32,8 @@ class SearchPresenter(
 
     private val replacingMangaRelay = BehaviorRelay.create<Pair<Boolean, Manga?>>()
 
+    private val enhancedServices by lazy { Injekt.get<TrackManager>().services.filterIsInstance<EnhancedTrackService>() }
+
     override fun onCreate(savedState: Bundle?) {
         super.onCreate(savedState)
 
@@ -57,6 +63,7 @@ class SearchPresenter(
     }
 
     fun migrateManga(prevManga: Manga, manga: Manga, replace: Boolean) {
+        val prevSource = sourceManager.get(prevManga.source) ?: return
         val source = sourceManager.get(manga.source) ?: return
 
         replacingMangaRelay.call(Pair(true, null))
@@ -66,7 +73,7 @@ class SearchPresenter(
                 val chapters = source.getChapterList(manga.toMangaInfo())
                     .map { it.toSChapter() }
 
-                migrateMangaInternal(source, chapters, prevManga, manga, replace)
+                migrateMangaInternal(prevSource, source, chapters, prevManga, manga, replace)
             } catch (e: Throwable) {
                 withUIContext { view?.applicationContext?.toast(e.message) }
             }
@@ -76,6 +83,7 @@ class SearchPresenter(
     }
 
     private fun migrateMangaInternal(
+        prevSource: Source,
         source: Source,
         sourceChapters: List<SChapter>,
         prevManga: Manga,
@@ -135,12 +143,16 @@ class SearchPresenter(
 
             // 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 { it.isTrackFrom(track, prevManga, prevSource) }
+                    if (service != null) service.migrateTrack(track, manga, source)
+                    else track
                 }
-                db.insertTracks(tracks).executeAsBlocking()
+                db.insertTracks(tracksToUpdate).executeAsBlocking()
             }
 
             // Update favorite status