mirror of
https://github.com/mihonapp/mihon.git
synced 2024-09-22 05:32:41 +02:00
a2cf210a52
Since multisource extensions are no longer a thing, we now simply rely on the flag at the extension level, i.e. the per-Source/SourceFactory `@Nsfw` annotation is no longer checked. We'll have to remove all of the annotation usages from the existing sources, which will also effectively break the setting for older versions of the app.
80 lines
2.4 KiB
Kotlin
80 lines
2.4 KiB
Kotlin
package eu.kanade.tachiyomi.source
|
|
|
|
import android.content.Context
|
|
import eu.kanade.tachiyomi.R
|
|
import eu.kanade.tachiyomi.source.model.Page
|
|
import eu.kanade.tachiyomi.source.model.SChapter
|
|
import eu.kanade.tachiyomi.source.model.SManga
|
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
|
import rx.Observable
|
|
|
|
open class SourceManager(private val context: Context) {
|
|
|
|
private val sourcesMap = mutableMapOf<Long, Source>()
|
|
private val stubSourcesMap = mutableMapOf<Long, StubSource>()
|
|
|
|
init {
|
|
createInternalSources().forEach { registerSource(it) }
|
|
}
|
|
|
|
open fun get(sourceKey: Long): Source? {
|
|
return sourcesMap[sourceKey]
|
|
}
|
|
|
|
fun getOrStub(sourceKey: Long): Source {
|
|
return sourcesMap[sourceKey] ?: stubSourcesMap.getOrPut(sourceKey) {
|
|
StubSource(sourceKey)
|
|
}
|
|
}
|
|
|
|
fun getOnlineSources() = sourcesMap.values.filterIsInstance<HttpSource>()
|
|
|
|
fun getCatalogueSources() = sourcesMap.values.filterIsInstance<CatalogueSource>()
|
|
|
|
internal fun registerSource(source: Source) {
|
|
if (!sourcesMap.containsKey(source.id)) {
|
|
sourcesMap[source.id] = source
|
|
}
|
|
if (!stubSourcesMap.containsKey(source.id)) {
|
|
stubSourcesMap[source.id] = StubSource(source.id)
|
|
}
|
|
}
|
|
|
|
internal fun unregisterSource(source: Source) {
|
|
sourcesMap.remove(source.id)
|
|
}
|
|
|
|
private fun createInternalSources(): List<Source> = listOf(
|
|
LocalSource(context)
|
|
)
|
|
|
|
inner class StubSource(override val id: Long) : Source {
|
|
|
|
override val name: String
|
|
get() = id.toString()
|
|
|
|
override fun fetchMangaDetails(manga: SManga): Observable<SManga> {
|
|
return Observable.error(getSourceNotInstalledException())
|
|
}
|
|
|
|
override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> {
|
|
return Observable.error(getSourceNotInstalledException())
|
|
}
|
|
|
|
override fun fetchPageList(chapter: SChapter): Observable<List<Page>> {
|
|
return Observable.error(getSourceNotInstalledException())
|
|
}
|
|
|
|
override fun toString(): String {
|
|
return name
|
|
}
|
|
|
|
private fun getSourceNotInstalledException(): SourceNotInstalledException {
|
|
return SourceNotInstalledException(id)
|
|
}
|
|
}
|
|
|
|
inner class SourceNotInstalledException(val id: Long) :
|
|
Exception(context.getString(R.string.source_not_installed, id.toString()))
|
|
}
|