More domain model usage

(cherry picked from commit 3791d8254034ffcab94ddd65ec290c28384e6526)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchCardItem.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt
This commit is contained in:
arkon 2022-07-03 16:25:51 -04:00 committed by Jobobby04
parent d48427152e
commit f1a31e4560
16 changed files with 36 additions and 47 deletions

View File

@ -1,5 +1,6 @@
package eu.kanade.domain.chapter.model package eu.kanade.domain.chapter.model
import eu.kanade.tachiyomi.data.database.models.ChapterImpl
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.data.database.models.Chapter as DbChapter import eu.kanade.tachiyomi.data.database.models.Chapter as DbChapter
@ -61,7 +62,7 @@ data class Chapter(
} }
// TODO: Remove when all deps are migrated // TODO: Remove when all deps are migrated
fun Chapter.toDbChapter(): DbChapter = DbChapter.create().also { fun Chapter.toDbChapter(): DbChapter = ChapterImpl().also {
it.id = id it.id = id
it.manga_id = mangaId it.manga_id = mangaId
it.url = url it.url = url

View File

@ -20,11 +20,7 @@ interface Chapter : SChapter, Serializable {
var source_order: Int var source_order: Int
val isRecognizedNumber: Boolean
get() = chapter_number >= 0f
companion object { companion object {
fun create(): Chapter = ChapterImpl().apply { fun create(): Chapter = ChapterImpl().apply {
chapter_number = -1f chapter_number = -1f
} }

View File

@ -18,10 +18,10 @@ import dev.chrisbanes.insetter.applyInsetter
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
import eu.kanade.domain.manga.interactor.GetManga import eu.kanade.domain.manga.interactor.GetManga
import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.domain.manga.interactor.UpdateManga
import eu.kanade.domain.manga.model.Manga
import eu.kanade.domain.manga.model.toDbManga import eu.kanade.domain.manga.model.toDbManga
import eu.kanade.domain.manga.model.toMangaInfo import eu.kanade.domain.manga.model.toMangaInfo
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.toDomainManga import eu.kanade.tachiyomi.data.database.models.toDomainManga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.MigrationListControllerBinding import eu.kanade.tachiyomi.databinding.MigrationListControllerBinding
@ -333,7 +333,7 @@ class MigrationListController(bundle: Bundle? = null) :
} else { } else {
sources.filter { it.id != manga.source } sources.filter { it.id != manga.source }
} }
val searchController = SearchController(manga.toDbManga(), validSources) val searchController = SearchController(manga, validSources)
searchController.targetController = this@MigrationListController searchController.targetController = this@MigrationListController
router.pushController(searchController) router.pushController(searchController)
} }
@ -357,7 +357,7 @@ class MigrationListController(bundle: Bundle? = null) :
adapter?.notifyItemChanged(firstIndex) adapter?.notifyItemChanged(firstIndex)
launchUI { launchUI {
val result = CoroutineScope(migratingManga.manga.migrationJob).async { val result = CoroutineScope(migratingManga.manga.migrationJob).async {
val localManga = smartSearchEngine.networkToLocalManga(manga, source.id).toDomainManga()!! val localManga = smartSearchEngine.networkToLocalManga(manga.toDbManga(), source.id).toDomainManga()!!
try { try {
val chapters = source.getChapterList(localManga.toMangaInfo()) val chapters = source.getChapterList(localManga.toMangaInfo())
.map { it.toSChapter() } .map { it.toSChapter() }

View File

@ -6,9 +6,8 @@ import android.view.MenuInflater
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import eu.kanade.domain.manga.interactor.GetManga import eu.kanade.domain.manga.interactor.GetManga
import eu.kanade.domain.manga.model.toDbManga import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.controller.pushController import eu.kanade.tachiyomi.ui.base.controller.pushController
@ -28,7 +27,7 @@ class SearchController(
private var manga: Manga? = null, private var manga: Manga? = null,
private var sources: List<CatalogueSource>? = null, private var sources: List<CatalogueSource>? = null,
) : GlobalSearchController( ) : GlobalSearchController(
manga?.originalTitle, manga?.ogTitle,
bundle = bundleOf( bundle = bundleOf(
OLD_MANGA to manga?.id, OLD_MANGA to manga?.id,
SOURCES to sources?.map { it.id }?.toLongArray(), SOURCES to sources?.map { it.id }?.toLongArray(),
@ -39,7 +38,6 @@ class SearchController(
runBlocking { runBlocking {
Injekt.get<GetManga>() Injekt.get<GetManga>()
.await(mangaId) .await(mangaId)
?.toDbManga()
}, },
sources.map { Injekt.get<SourceManager>().getOrStub(it) }.filterIsInstance<CatalogueSource>(), sources.map { Injekt.get<SourceManager>().getOrStub(it) }.filterIsInstance<CatalogueSource>(),
) { ) {

View File

@ -1,6 +1,5 @@
package eu.kanade.tachiyomi.ui.browse.migration.search package eu.kanade.tachiyomi.ui.browse.migration.search
import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchCardItem import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchCardItem
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchItem import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchItem

View File

@ -3,8 +3,7 @@ package eu.kanade.tachiyomi.ui.browse.migration.search
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import eu.kanade.domain.manga.model.toDbManga import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController
@ -32,7 +31,7 @@ class SourceSearchController(
val migrationListController = targetController as? MigrationListController ?: return false val migrationListController = targetController as? MigrationListController ?: return false
val sourceManager = Injekt.get<SourceManager>() val sourceManager = Injekt.get<SourceManager>()
val source = sourceManager.get(manga.source) ?: return false val source = sourceManager.get(manga.source) ?: return false
migrationListController.useMangaForMigration(manga.toDbManga(), source) migrationListController.useMangaForMigration(manga, source)
router.popCurrentController() router.popCurrentController()
router.popCurrentController() router.popCurrentController()
return true return true

View File

@ -1,7 +1,7 @@
package eu.kanade.tachiyomi.ui.browse.source.globalsearch package eu.kanade.tachiyomi.ui.browse.source.globalsearch
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.domain.manga.model.Manga
/** /**
* Adapter that holds the manga items from search results. * Adapter that holds the manga items from search results.

View File

@ -4,8 +4,8 @@ import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import coil.dispose import coil.dispose
import eu.davidea.viewholders.FlexibleViewHolder import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.data.coil.MangaCoverFetcher import eu.kanade.tachiyomi.data.coil.MangaCoverFetcher
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.databinding.GlobalSearchControllerCardItemBinding import eu.kanade.tachiyomi.databinding.GlobalSearchControllerCardItemBinding
import eu.kanade.tachiyomi.util.view.loadAutoPause import eu.kanade.tachiyomi.util.view.loadAutoPause

View File

@ -5,9 +5,8 @@ import androidx.recyclerview.widget.RecyclerView
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import eu.davidea.flexibleadapter.items.IFlexible import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
import uy.kohesive.injekt.api.get
class GlobalSearchCardItem(val manga: Manga) : AbstractFlexibleItem<GlobalSearchCardHolder>() { class GlobalSearchCardItem(val manga: Manga) : AbstractFlexibleItem<GlobalSearchCardHolder>() {
@ -36,6 +35,6 @@ class GlobalSearchCardItem(val manga: Manga) : AbstractFlexibleItem<GlobalSearch
} }
override fun hashCode(): Int { override fun hashCode(): Int {
return manga.id?.toInt() ?: 0 return manga.id.hashCode()
} }
} }

View File

@ -10,8 +10,8 @@ import androidx.appcompat.widget.SearchView
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import dev.chrisbanes.insetter.applyInsetter import dev.chrisbanes.insetter.applyInsetter
import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.GlobalSearchControllerBinding import eu.kanade.tachiyomi.databinding.GlobalSearchControllerBinding
import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.CatalogueSource
@ -71,7 +71,7 @@ open class GlobalSearchController(
* @param manga clicked item containing manga information. * @param manga clicked item containing manga information.
*/ */
override fun onMangaClick(manga: Manga) { override fun onMangaClick(manga: Manga) {
router.pushController(MangaController(manga.id!!, true)) router.pushController(MangaController(manga.id, true))
} }
/** /**

View File

@ -4,7 +4,7 @@ import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import eu.davidea.viewholders.FlexibleViewHolder import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.databinding.GlobalSearchControllerCardBinding import eu.kanade.tachiyomi.databinding.GlobalSearchControllerCardBinding
import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.LocaleHelper
@ -92,7 +92,7 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) :
private fun getHolder(manga: Manga): GlobalSearchCardHolder? { private fun getHolder(manga: Manga): GlobalSearchCardHolder? {
mangaAdapter.allBoundViewHolders.forEach { holder -> mangaAdapter.allBoundViewHolders.forEach { holder ->
val item = mangaAdapter.getItem(holder.bindingAdapterPosition) val item = mangaAdapter.getItem(holder.bindingAdapterPosition)
if (item != null && item.manga.id!! == manga.id!!) { if (item != null && item.manga.id == manga.id) {
return holder as GlobalSearchCardHolder return holder as GlobalSearchCardHolder
} }
} }

View File

@ -180,7 +180,7 @@ open class GlobalSearchPresenter(
.map { it.mangas } .map { it.mangas }
.map { list -> list.map { networkToLocalManga(it, source.id) } } // Convert to local manga .map { list -> list.map { networkToLocalManga(it, source.id) } } // Convert to local manga
.doOnNext { fetchImage(it, source) } // Load manga covers .doOnNext { fetchImage(it, source) } // Load manga covers
.map { list -> createCatalogueSearchItem(source, list.map { GlobalSearchCardItem(it) }) } .map { list -> createCatalogueSearchItem(source, list.map { GlobalSearchCardItem(it.toDomainManga()!!) }) }
}, },
5, 5,
) )
@ -240,7 +240,7 @@ open class GlobalSearchPresenter(
.subscribe( .subscribe(
{ (source, manga) -> { (source, manga) ->
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
view?.onMangaInitialized(source, manga) view?.onMangaInitialized(source, manga.toDomainManga()!!)
}, },
{ error -> { error ->
logcat(LogPriority.ERROR, error) logcat(LogPriority.ERROR, error)

View File

@ -873,7 +873,7 @@ class LibraryController(
} }
val activity = activity ?: return val activity = activity ?: return
val chapter = presenter.getFirstUnread(manga) ?: return val chapter = presenter.getFirstUnread(manga) ?: return
val intent = ReaderActivity.newIntent(activity, manga.id, chapter.id!!) val intent = ReaderActivity.newIntent(activity, manga.id, chapter.id)
destroyActionModeIfNeeded() destroyActionModeIfNeeded()
startActivity(intent) startActivity(intent)
} }

View File

@ -10,6 +10,7 @@ import eu.kanade.domain.category.model.Category
import eu.kanade.domain.chapter.interactor.GetChapterByMangaId import eu.kanade.domain.chapter.interactor.GetChapterByMangaId
import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId
import eu.kanade.domain.chapter.interactor.UpdateChapter import eu.kanade.domain.chapter.interactor.UpdateChapter
import eu.kanade.domain.chapter.model.Chapter
import eu.kanade.domain.chapter.model.ChapterUpdate import eu.kanade.domain.chapter.model.ChapterUpdate
import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.domain.chapter.model.toDbChapter
import eu.kanade.domain.manga.interactor.GetLibraryManga import eu.kanade.domain.manga.interactor.GetLibraryManga
@ -22,7 +23,6 @@ import eu.kanade.domain.manga.model.toDbManga
import eu.kanade.domain.track.interactor.GetTracks import eu.kanade.domain.track.interactor.GetTracks
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.cache.CoverCache
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.toDomainManga import eu.kanade.tachiyomi.data.database.models.toDomainManga
import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.library.CustomMangaManager import eu.kanade.tachiyomi.data.library.CustomMangaManager
@ -767,7 +767,7 @@ class LibraryPresenter(
updateChapter.awaitAll(toUpdate) updateChapter.awaitAll(toUpdate)
if (read && preferences.removeAfterMarkedAsRead()) { if (read && preferences.removeAfterMarkedAsRead()) {
deleteChapters(manga, chapters.map { it.toDbChapter() }) deleteChapters(manga, chapters)
} }
} }
} }
@ -779,12 +779,12 @@ class LibraryPresenter(
if (source is MergedSource) { if (source is MergedSource) {
val mergedMangas = runBlocking { getMergedMangaById.await(manga.id) } val mergedMangas = runBlocking { getMergedMangaById.await(manga.id) }
val sources = mergedMangas.distinctBy { it.source }.map { sourceManager.getOrStub(it.source) } val sources = mergedMangas.distinctBy { it.source }.map { sourceManager.getOrStub(it.source) }
chapters.groupBy { it.manga_id }.forEach { (mangaId, chapters) -> chapters.groupBy { it.mangaId }.forEach { (mangaId, chapters) ->
val mergedManga = mergedMangas.firstOrNull { it.id == mangaId } ?: return@forEach val mergedManga = mergedMangas.firstOrNull { it.id == mangaId } ?: return@forEach
val mergedMangaSource = sources.firstOrNull { it.id == mergedManga.source } ?: return@forEach val mergedMangaSource = sources.firstOrNull { it.id == mergedManga.source } ?: return@forEach
downloadManager.deleteChapters(chapters, mergedManga.toDbManga(), mergedMangaSource) downloadManager.deleteChapters(chapters.map { it.toDbChapter() }, mergedManga.toDbManga(), mergedMangaSource)
} }
} else /* SY <-- */ downloadManager.deleteChapters(chapters, manga.toDbManga(), source) } else /* SY <-- */ downloadManager.deleteChapters(chapters.map { it.toDbChapter() }, manga.toDbManga(), source)
} }
} }
@ -851,13 +851,13 @@ class LibraryPresenter(
/** Returns first unread chapter of a manga */ /** Returns first unread chapter of a manga */
fun getFirstUnread(manga: Manga): Chapter? { fun getFirstUnread(manga: Manga): Chapter? {
val chapters = if (manga.source == MERGED_SOURCE_ID) { val chapters = if (manga.source == MERGED_SOURCE_ID) {
(sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlockingAsDbChapter(manga.id) (sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlocking(manga.id)
} else runBlocking { getChapterByMangaId.await(manga.id) }.map { it.toDbChapter() } } else runBlocking { getChapterByMangaId.await(manga.id) }
return if (manga.isEhBasedManga()) { return if (manga.isEhBasedManga()) {
val chapter = chapters.sortedBy { it.source_order }.getOrNull(0) val chapter = chapters.sortedBy { it.sourceOrder }.getOrNull(0)
if (chapter?.read == false) chapter else null if (chapter?.read == false) chapter else null
} else { } else {
chapters.sortedByDescending { it.source_order }.find { !it.read } chapters.sortedByDescending { it.sourceOrder }.find { !it.read }
} }
} }

View File

@ -38,9 +38,7 @@ import eu.kanade.domain.track.interactor.InsertTrack
import eu.kanade.domain.track.model.toDbTrack import eu.kanade.domain.track.model.toDbTrack
import eu.kanade.domain.track.model.toDomainTrack import eu.kanade.domain.track.model.toDomainTrack
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.database.models.toDomainChapter
import eu.kanade.tachiyomi.data.database.models.toDomainManga import eu.kanade.tachiyomi.data.database.models.toDomainManga
import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.download.model.Download
@ -755,7 +753,7 @@ class MangaPresenter(
getTracks.subscribe(manga.id) getTracks.subscribe(manga.id)
.catch { logcat(LogPriority.ERROR, it) } .catch { logcat(LogPriority.ERROR, it) }
.map { tracks -> .map { tracks ->
val loggedServicesId = loggedServices.map { it.id.toLong() } val loggedServicesId = loggedServices.map { it.id }
tracks tracks
.filter { it.syncId in loggedServicesId } .filter { it.syncId in loggedServicesId }
// SY --> // SY -->
@ -867,8 +865,7 @@ class MangaPresenter(
) )
if (manualFetch) { if (manualFetch) {
val dbChapters = newChapters.map { it.toDbChapter() } downloadNewChapters(newChapters)
downloadNewChapters(dbChapters)
} }
} else { } else {
successState.source.fetchChaptersForMergedManga(successState.manga, manualFetch, true, dedupe) successState.source.fetchChaptersForMergedManga(successState.manga, manualFetch, true, dedupe)
@ -1012,12 +1009,12 @@ class MangaPresenter(
} }
} }
private fun downloadNewChapters(chapters: List<Chapter>) { private fun downloadNewChapters(chapters: List<DomainChapter>) {
presenterScope.launchIO { presenterScope.launchIO {
val manga = successState?.manga ?: return@launchIO val manga = successState?.manga ?: return@launchIO
val categories = getCategories.await(manga.id).map { it.id } val categories = getCategories.await(manga.id).map { it.id }
if (chapters.isEmpty() || !manga.shouldDownloadNewChapters(categories, preferences) || manga.isEhBasedManga()) return@launchIO if (chapters.isEmpty() || !manga.shouldDownloadNewChapters(categories, preferences) || manga.isEhBasedManga()) return@launchIO
downloadChapters(chapters.map { it.toDomainChapter()!! }) downloadChapters(chapters)
} }
} }
@ -1246,7 +1243,7 @@ class MangaPresenter(
val manga = successState?.manga ?: return val manga = successState?.manga ?: return
presenterScope.launchIO { presenterScope.launchIO {
deleteTrack.await(manga.id, service.id.toLong()) deleteTrack.await(manga.id, service.id)
} }
} }

View File

@ -166,7 +166,7 @@ class ReaderPresenter(
val chapters = runBlocking { val chapters = runBlocking {
/* SY --> */ if (manga.source == MERGED_SOURCE_ID) { /* SY --> */ if (manga.source == MERGED_SOURCE_ID) {
(sourceManager.get(MERGED_SOURCE_ID) as MergedSource) (sourceManager.get(MERGED_SOURCE_ID) as MergedSource)
.getChaptersAsBlocking(manga.id!!) .getChapters(manga.id!!)
} else /* SY <-- */ getChapterByMangaId.await(manga.id!!) } else /* SY <-- */ getChapterByMangaId.await(manga.id!!)
} }