|
|
|
@ -15,19 +15,14 @@ import androidx.work.WorkQuery
|
|
|
|
|
import androidx.work.WorkerParameters
|
|
|
|
|
import androidx.work.workDataOf
|
|
|
|
|
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
|
|
|
|
|
import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay
|
|
|
|
|
import eu.kanade.domain.manga.interactor.UpdateManga
|
|
|
|
|
import eu.kanade.domain.manga.model.copyFrom
|
|
|
|
|
import eu.kanade.domain.manga.model.toSManga
|
|
|
|
|
import eu.kanade.domain.track.model.toDbTrack
|
|
|
|
|
import eu.kanade.domain.track.model.toDomainTrack
|
|
|
|
|
import eu.kanade.domain.track.interactor.RefreshTracks
|
|
|
|
|
import eu.kanade.tachiyomi.R
|
|
|
|
|
import eu.kanade.tachiyomi.data.cache.CoverCache
|
|
|
|
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
|
|
|
|
import eu.kanade.tachiyomi.data.notification.Notifications
|
|
|
|
|
import eu.kanade.tachiyomi.data.track.EnhancedTrackService
|
|
|
|
|
import eu.kanade.tachiyomi.data.track.TrackManager
|
|
|
|
|
import eu.kanade.tachiyomi.data.track.TrackService
|
|
|
|
|
import eu.kanade.tachiyomi.source.UnmeteredSource
|
|
|
|
|
import eu.kanade.tachiyomi.source.model.SManga
|
|
|
|
|
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
|
|
|
@ -44,7 +39,6 @@ import kotlinx.coroutines.awaitAll
|
|
|
|
|
import kotlinx.coroutines.coroutineScope
|
|
|
|
|
import kotlinx.coroutines.ensureActive
|
|
|
|
|
import kotlinx.coroutines.runBlocking
|
|
|
|
|
import kotlinx.coroutines.supervisorScope
|
|
|
|
|
import kotlinx.coroutines.sync.Semaphore
|
|
|
|
|
import kotlinx.coroutines.sync.withPermit
|
|
|
|
|
import logcat.LogPriority
|
|
|
|
@ -53,7 +47,6 @@ import tachiyomi.core.util.lang.withIOContext
|
|
|
|
|
import tachiyomi.core.util.system.logcat
|
|
|
|
|
import tachiyomi.domain.category.interactor.GetCategories
|
|
|
|
|
import tachiyomi.domain.category.model.Category
|
|
|
|
|
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId
|
|
|
|
|
import tachiyomi.domain.chapter.model.Chapter
|
|
|
|
|
import tachiyomi.domain.chapter.model.NoChaptersException
|
|
|
|
|
import tachiyomi.domain.download.service.DownloadPreferences
|
|
|
|
@ -73,8 +66,6 @@ import tachiyomi.domain.manga.model.Manga
|
|
|
|
|
import tachiyomi.domain.manga.model.toMangaUpdate
|
|
|
|
|
import tachiyomi.domain.source.model.SourceNotInstalledException
|
|
|
|
|
import tachiyomi.domain.source.service.SourceManager
|
|
|
|
|
import tachiyomi.domain.track.interactor.GetTracks
|
|
|
|
|
import tachiyomi.domain.track.interactor.InsertTrack
|
|
|
|
|
import uy.kohesive.injekt.Injekt
|
|
|
|
|
import uy.kohesive.injekt.api.get
|
|
|
|
|
import java.io.File
|
|
|
|
@ -92,17 +83,13 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
|
|
|
|
|
private val downloadPreferences: DownloadPreferences = Injekt.get()
|
|
|
|
|
private val libraryPreferences: LibraryPreferences = Injekt.get()
|
|
|
|
|
private val downloadManager: DownloadManager = Injekt.get()
|
|
|
|
|
private val trackManager: TrackManager = Injekt.get()
|
|
|
|
|
private val coverCache: CoverCache = Injekt.get()
|
|
|
|
|
private val getLibraryManga: GetLibraryManga = Injekt.get()
|
|
|
|
|
private val getManga: GetManga = Injekt.get()
|
|
|
|
|
private val updateManga: UpdateManga = Injekt.get()
|
|
|
|
|
private val getChapterByMangaId: GetChapterByMangaId = Injekt.get()
|
|
|
|
|
private val getCategories: GetCategories = Injekt.get()
|
|
|
|
|
private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get()
|
|
|
|
|
private val getTracks: GetTracks = Injekt.get()
|
|
|
|
|
private val insertTrack: InsertTrack = Injekt.get()
|
|
|
|
|
private val syncChaptersWithTrackServiceTwoWay: SyncChaptersWithTrackServiceTwoWay = Injekt.get()
|
|
|
|
|
private val refreshTracks: RefreshTracks = Injekt.get()
|
|
|
|
|
private val setFetchInterval: SetFetchInterval = Injekt.get()
|
|
|
|
|
|
|
|
|
|
private val notifier = LibraryUpdateNotifier(context)
|
|
|
|
@ -296,8 +283,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (libraryPreferences.autoUpdateTrackers().get()) {
|
|
|
|
|
val loggedServices = trackManager.services.filter { it.isLogged }
|
|
|
|
|
updateTrackings(manga, loggedServices)
|
|
|
|
|
refreshTracks.await(manga.id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -417,49 +403,19 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
|
|
|
|
|
private suspend fun updateTrackings() {
|
|
|
|
|
coroutineScope {
|
|
|
|
|
var progressCount = 0
|
|
|
|
|
val loggedServices = trackManager.services.filter { it.isLogged }
|
|
|
|
|
|
|
|
|
|
mangaToUpdate.forEach { libraryManga ->
|
|
|
|
|
val manga = libraryManga.manga
|
|
|
|
|
|
|
|
|
|
ensureActive()
|
|
|
|
|
|
|
|
|
|
val manga = libraryManga.manga
|
|
|
|
|
notifier.showProgressNotification(listOf(manga), progressCount++, mangaToUpdate.size)
|
|
|
|
|
|
|
|
|
|
// Update the tracking details.
|
|
|
|
|
updateTrackings(manga, loggedServices)
|
|
|
|
|
refreshTracks.await(manga.id)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
notifier.cancelProgressNotification()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private suspend fun updateTrackings(manga: Manga, loggedServices: List<TrackService>) {
|
|
|
|
|
getTracks.await(manga.id)
|
|
|
|
|
.map { track ->
|
|
|
|
|
supervisorScope {
|
|
|
|
|
async {
|
|
|
|
|
val service = trackManager.getService(track.syncId)
|
|
|
|
|
if (service != null && service in loggedServices) {
|
|
|
|
|
try {
|
|
|
|
|
val updatedTrack = service.refresh(track.toDbTrack())
|
|
|
|
|
insertTrack.await(updatedTrack.toDomainTrack()!!)
|
|
|
|
|
|
|
|
|
|
if (service is EnhancedTrackService) {
|
|
|
|
|
val chapters = getChapterByMangaId.await(manga.id)
|
|
|
|
|
syncChaptersWithTrackServiceTwoWay.await(chapters, track, service)
|
|
|
|
|
}
|
|
|
|
|
} catch (e: Throwable) {
|
|
|
|
|
// Ignore errors and continue
|
|
|
|
|
logcat(LogPriority.ERROR, e)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.awaitAll()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private suspend fun withUpdateNotification(
|
|
|
|
|
updatingManga: CopyOnWriteArrayList<Manga>,
|
|
|
|
|
completed: AtomicInteger,
|
|
|
|
|