package eu.kanade.tachiyomi.animesource import android.content.Context import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import rx.Observable open class AnimeSourceManager(private val context: Context) { private val sourcesMap = mutableMapOf() private val stubSourcesMap = mutableMapOf() init { createInternalSources().forEach { registerSource(it) } } open fun get(sourceKey: Long): AnimeSource? { return sourcesMap[sourceKey] } fun getOrStub(sourceKey: Long): AnimeSource { return sourcesMap[sourceKey] ?: stubSourcesMap.getOrPut(sourceKey) { StubSource(sourceKey) } } fun getOnlineSources() = sourcesMap.values.filterIsInstance() fun getCatalogueSources() = sourcesMap.values.filterIsInstance() internal fun registerSource(source: AnimeSource) { if (!sourcesMap.containsKey(source.id)) { sourcesMap[source.id] = source } if (!stubSourcesMap.containsKey(source.id)) { stubSourcesMap[source.id] = StubSource(source.id) } } internal fun unregisterSource(source: AnimeSource) { sourcesMap.remove(source.id) } private fun createInternalSources(): List = listOf( // LocalAnimeSource(context) ) inner class StubSource(override val id: Long) : AnimeSource { override val name: String get() = id.toString() override fun fetchAnimeDetails(anime: SAnime): Observable { return Observable.error(getSourceNotInstalledException()) } override fun fetchEpisodeList(anime: SAnime): Observable> { return Observable.error(getSourceNotInstalledException()) } override fun fetchEpisodeLink(episode: SEpisode): Observable { return Observable.error(getSourceNotInstalledException()) } override fun toString(): String { return name } private fun getSourceNotInstalledException(): Exception { // return Exception(context.getString(R.string.source_not_installed, id.toString())) return Exception("source not found") } } }