mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	fix: handle Komga tracks during manga migration (#6463)
* fix: handle Komga tracks during manga migration closes #6354 * refactor: remove Komga direct reference
This commit is contained in:
		| @@ -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? | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|         } | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user