package ani.dantotsu.parsers import ani.dantotsu.Lazier import ani.dantotsu.lazyList import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first object AnimeSources : WatchSources() { override var list: List> = emptyList() var pinnedAnimeSources: List = emptyList() var isInitialized = false suspend fun init(fromExtensions: StateFlow>) { pinnedAnimeSources = PrefManager.getNullableVal>(PrefName.AnimeSourcesOrder, null) ?: emptyList() // Initialize with the first value from StateFlow val initialExtensions = fromExtensions.first() list = createParsersFromExtensions(initialExtensions) + Lazier( { OfflineAnimeParser() }, "Downloaded" ) isInitialized = true fromExtensions.collect { extensions -> list = sortPinnedAnimeSources( createParsersFromExtensions(extensions), pinnedAnimeSources ) + Lazier( { OfflineAnimeParser() }, "Downloaded" ) } } fun performReorderAnimeSources() { // Remove the downloaded source from the list to avoid duplicates list = list.filter { it.name != "Downloaded" } list = sortPinnedAnimeSources(list, pinnedAnimeSources) + Lazier( { OfflineAnimeParser() }, "Downloaded" ) } private fun createParsersFromExtensions(extensions: List): List> { return extensions.map { extension -> val name = extension.name Lazier({ DynamicAnimeParser(extension) }, name) } } private fun sortPinnedAnimeSources( sources: List>, pinnedAnimeSources: List ): List> { val pinnedSourcesMap = sources.filter { pinnedAnimeSources.contains(it.name) } .associateBy { it.name } val orderedPinnedSources = pinnedAnimeSources.mapNotNull { name -> pinnedSourcesMap[name] } val unpinnedSources = sources.filterNot { pinnedAnimeSources.contains(it.name) } return orderedPinnedSources + unpinnedSources } } object HAnimeSources : WatchSources() { private val aList: List> = lazyList( ) override val list = listOf(aList, AnimeSources.list).flatten() }