package eu.kanade.tachiyomi.source import android.graphics.drawable.Drawable import eu.kanade.domain.source.model.SourceData import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.extension.ExtensionManager 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.util.lang.awaitSingle import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * A basic interface for creating a source. It could be an online source, a local source, etc... */ interface Source { /** * Id for the source. Must be unique. */ val id: Long /** * Name of the source. */ val name: String val lang: String get() = "" /** * Returns an observable with the updated details for a manga. * * @param manga the manga to update. */ @Deprecated( "Use the 1.x API instead", ReplaceWith("getMangaDetails"), ) fun fetchMangaDetails(manga: SManga): Observable = throw IllegalStateException("Not used") /** * Returns an observable with all the available chapters for a manga. * * @param manga the manga to update. */ @Deprecated( "Use the 1.x API instead", ReplaceWith("getChapterList"), ) fun fetchChapterList(manga: SManga): Observable> = throw IllegalStateException("Not used") // TODO: remove direct usages on this method /** * Returns an observable with the list of pages a chapter has. * * @param chapter the chapter. */ @Deprecated( "Use the 1.x API instead", ReplaceWith("getPageList"), ) fun fetchPageList(chapter: SChapter): Observable> = Observable.empty() /** * [1.x API] Get the updated details for a manga. */ @Suppress("DEPRECATION") suspend fun getMangaDetails(manga: SManga): SManga { return fetchMangaDetails(manga).awaitSingle() } /** * [1.x API] Get all the available chapters for a manga. */ @Suppress("DEPRECATION") suspend fun getChapterList(manga: SManga): List { return fetchChapterList(manga).awaitSingle() } /** * [1.x API] Get the list of pages a chapter has. */ @Suppress("DEPRECATION") suspend fun getPageList(chapter: SChapter): List { return fetchPageList(chapter).awaitSingle() } } fun Source.icon(): Drawable? = Injekt.get().getAppIconForSource(this) fun Source.getPreferenceKey(): String = "source_$id" fun Source.toSourceData(): SourceData = SourceData(id = id, lang = lang, name = name) fun Source.getNameForMangaInfo(mergeSources: List?): String { val preferences = Injekt.get() val enabledLanguages = preferences.enabledLanguages().get() .filterNot { it in listOf("all", "other") } val hasOneActiveLanguages = enabledLanguages.size == 1 val isInEnabledLanguages = lang in enabledLanguages return when { // SY --> !mergeSources.isNullOrEmpty() -> getMergedSourcesString( mergeSources, enabledLanguages, hasOneActiveLanguages, ) // SY <-- // For edge cases where user disables a source they got manga of in their library. hasOneActiveLanguages && !isInEnabledLanguages -> toString() // Hide the language tag when only one language is used. hasOneActiveLanguages && isInEnabledLanguages -> name else -> toString() } } // SY --> private fun getMergedSourcesString( mergeSources: List, enabledLangs: List, onlyName: Boolean, ): String { return if (onlyName) { mergeSources.joinToString { source -> if (source.lang !in enabledLangs) { source.toString() } else { source.name } } } else { mergeSources.joinToString() } } // SY <-- fun Source.isLocalOrStub(): Boolean = id == LocalSource.ID || this is SourceManager.StubSource