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
This commit is contained in:
parent
a65b55a6bf
commit
1d814aabae
@ -1,6 +1,7 @@
|
|||||||
package eu.kanade.tachiyomi.data.track
|
package eu.kanade.tachiyomi.data.track
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
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.data.track.model.TrackSearch
|
||||||
import eu.kanade.tachiyomi.source.Source
|
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.
|
* match is similar to TrackService.search, but only return zero or one match.
|
||||||
*/
|
*/
|
||||||
suspend fun match(manga: Manga): TrackSearch?
|
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.NoLoginTrackService
|
||||||
import eu.kanade.tachiyomi.data.track.TrackService
|
import eu.kanade.tachiyomi.data.track.TrackService
|
||||||
import eu.kanade.tachiyomi.data.track.model.TrackSearch
|
import eu.kanade.tachiyomi.data.track.model.TrackSearch
|
||||||
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import okhttp3.Dns
|
import okhttp3.Dns
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
|
|
||||||
@ -103,4 +104,14 @@ class Komga(private val context: Context, id: Int) : TrackService(id), EnhancedT
|
|||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
null
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.MangaCategory
|
||||||
import eu.kanade.tachiyomi.data.database.models.toMangaInfo
|
import eu.kanade.tachiyomi.data.database.models.toMangaInfo
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
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.Source
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
import eu.kanade.tachiyomi.source.model.toSChapter
|
import eu.kanade.tachiyomi.source.model.toSChapter
|
||||||
@ -24,6 +26,7 @@ class MigrationMangaPresenter(
|
|||||||
private val sourceId: Long,
|
private val sourceId: Long,
|
||||||
private val db: DatabaseHelper = Injekt.get()
|
private val db: DatabaseHelper = Injekt.get()
|
||||||
) : BasePresenter<MigrationMangaController>() {
|
) : BasePresenter<MigrationMangaController>() {
|
||||||
|
private val enhancedServices by lazy { Injekt.get<TrackManager>().services.filterIsInstance<EnhancedTrackService>() }
|
||||||
|
|
||||||
override fun onCreate(savedState: Bundle?) {
|
override fun onCreate(savedState: Bundle?) {
|
||||||
super.onCreate(savedState)
|
super.onCreate(savedState)
|
||||||
@ -43,16 +46,18 @@ class MigrationMangaPresenter(
|
|||||||
|
|
||||||
// SY -->
|
// SY -->
|
||||||
fun migrateManga(prevManga: Manga, manga: Manga, replace: Boolean) {
|
fun migrateManga(prevManga: Manga, manga: Manga, replace: Boolean) {
|
||||||
|
val prevSource = sourceManager.get(prevManga.source)
|
||||||
val source = sourceManager.get(manga.source) ?: return
|
val source = sourceManager.get(manga.source) ?: return
|
||||||
|
|
||||||
Observable.defer { runAsObservable { source.getChapterList(manga.toMangaInfo()).map { it.toSChapter() } } }.onErrorReturn { emptyList() }
|
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())
|
.onErrorReturn { emptyList() }.subscribeOn(Schedulers.io())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe()
|
.subscribe()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateMangaInternal(
|
private fun migrateMangaInternal(
|
||||||
|
prevSource: Source?,
|
||||||
source: Source,
|
source: Source,
|
||||||
sourceChapters: List<SChapter>,
|
sourceChapters: List<SChapter>,
|
||||||
prevManga: Manga,
|
prevManga: Manga,
|
||||||
@ -95,12 +100,16 @@ class MigrationMangaPresenter(
|
|||||||
}
|
}
|
||||||
// Update track
|
// Update track
|
||||||
if (migrateTracks) {
|
if (migrateTracks) {
|
||||||
val tracks = db.getTracks(prevManga).executeAsBlocking()
|
val tracksToUpdate = db.getTracks(prevManga).executeAsBlocking().mapNotNull { track ->
|
||||||
for (track in tracks) {
|
|
||||||
track.id = null
|
track.id = null
|
||||||
track.manga_id = manga.id!!
|
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) {
|
if (migrateExtra) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user