From 722b6d1e59159d1ce63095d3e9ac9598ce6a6a6b Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 16 Jan 2022 19:19:40 +0200 Subject: [PATCH] Cleanup MangaSource fields --- app/build.gradle | 1 + .../kotatsu/base/domain/MangaUtils.kt | 3 +- .../kotatsu/core/model/MangaSource.kt | 61 ++++++++----------- .../kotatsu/core/network/NetworkModule.kt | 2 + .../kotatsu/core/parser/MangaRepository.kt | 2 + .../kotatsu/core/parser/ParserModule.kt | 3 - .../core/parser/RemoteMangaRepository.kt | 5 +- .../kotatsu/details/ui/DetailsViewModel.kt | 2 +- .../local/domain/LocalMangaRepository.kt | 1 + .../kotatsu/reader/domain/PageLoader.kt | 2 +- .../kotatsu/reader/ui/ReaderViewModel.kt | 5 +- .../search/domain/MangaSearchRepository.kt | 3 +- .../core/parser/RemoteMangaRepositoryTest.kt | 2 +- .../core/parser/RepositoryTestModule.kt | 9 --- 14 files changed, 41 insertions(+), 60 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c342da9ae..f2c4622f9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,6 +59,7 @@ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { jvmTarget = JavaVersion.VERSION_1_8.toString() freeCompilerArgs += [ '-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi', + '-Xopt-in=kotlinx.coroutines.FlowPreview', '-Xopt-in=kotlin.contracts.ExperimentalContracts', ] } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaUtils.kt b/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaUtils.kt index 83bd5dc25..d9f845c65 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaUtils.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaUtils.kt @@ -11,6 +11,7 @@ import org.koin.core.component.get import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.model.MangaPage import org.koitharu.kotatsu.core.network.CommonHeaders +import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.utils.CacheUtils import org.koitharu.kotatsu.utils.ext.await import org.koitharu.kotatsu.utils.ext.medianOrNull @@ -28,7 +29,7 @@ object MangaUtils : KoinComponent { suspend fun determineMangaIsWebtoon(pages: List): Boolean? { try { val page = pages.medianOrNull() ?: return null - val url = page.source.repository.getPageUrl(page) + val url = MangaRepository(page.source).getPageUrl(page) val uri = Uri.parse(url) val size = if (uri.scheme == "cbz") { val zip = ZipFile(uri.schemeSpecificPart) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/MangaSource.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/MangaSource.kt index 4ef49374c..a9fc84da5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/model/MangaSource.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/MangaSource.kt @@ -2,51 +2,38 @@ package org.koitharu.kotatsu.core.model import android.os.Parcelable import kotlinx.parcelize.Parcelize -import org.koin.core.context.GlobalContext -import org.koin.core.error.NoBeanDefFoundException -import org.koin.core.qualifier.named -import org.koitharu.kotatsu.core.parser.MangaRepository -import org.koitharu.kotatsu.core.parser.site.* -import org.koitharu.kotatsu.local.domain.LocalMangaRepository @Suppress("SpellCheckingInspection") @Parcelize enum class MangaSource( val title: String, val locale: String?, - val cls: Class, ) : Parcelable { - LOCAL("Local", null, LocalMangaRepository::class.java), - READMANGA_RU("ReadManga", "ru", ReadmangaRepository::class.java), - MINTMANGA("MintManga", "ru", MintMangaRepository::class.java), - SELFMANGA("SelfManga", "ru", SelfMangaRepository::class.java), - MANGACHAN("Манга-тян", "ru", MangaChanRepository::class.java), - DESUME("Desu.me", "ru", DesuMeRepository::class.java), - HENCHAN("Хентай-тян", "ru", HenChanRepository::class.java), - YAOICHAN("Яой-тян", "ru", YaoiChanRepository::class.java), - MANGATOWN("MangaTown", "en", MangaTownRepository::class.java), - MANGALIB("MangaLib", "ru", MangaLibRepository::class.java), + LOCAL("Local", null), + READMANGA_RU("ReadManga", "ru"), + MINTMANGA("MintManga", "ru"), + SELFMANGA("SelfManga", "ru"), + MANGACHAN("Манга-тян", "ru"), + DESUME("Desu.me", "ru"), + HENCHAN("Хентай-тян", "ru"), + YAOICHAN("Яой-тян", "ru"), + MANGATOWN("MangaTown", "en"), + MANGALIB("MangaLib", "ru"), // NUDEMOON("Nude-Moon", "ru", NudeMoonRepository::class.java), - MANGAREAD("MangaRead", "en", MangareadRepository::class.java), - REMANGA("Remanga", "ru", RemangaRepository::class.java), - HENTAILIB("HentaiLib", "ru", HentaiLibRepository::class.java), - ANIBEL("Anibel", "be", AnibelRepository::class.java), - NINEMANGA_EN("NineManga English", "en", NineMangaRepository.English::class.java), - NINEMANGA_ES("NineManga Español", "es", NineMangaRepository.Spanish::class.java), - NINEMANGA_RU("NineManga Русский", "ru", NineMangaRepository.Russian::class.java), - NINEMANGA_DE("NineManga Deutsch", "de", NineMangaRepository.Deutsch::class.java), - NINEMANGA_IT("NineManga Italiano", "it", NineMangaRepository.Italiano::class.java), - NINEMANGA_BR("NineManga Brasil", "pt", NineMangaRepository.Brazil::class.java), - NINEMANGA_FR("NineManga Français", "fr", NineMangaRepository.Francais::class.java), - EXHENTAI("ExHentai", null, ExHentaiRepository::class.java), - MANGAOWL("MangaOwl", "en", MangaOwlRepository::class.java), - MANGADEX("MangaDex", null, MangaDexRepository::class.java), + MANGAREAD("MangaRead", "en"), + REMANGA("Remanga", "ru"), + HENTAILIB("HentaiLib", "ru"), + ANIBEL("Anibel", "be"), + NINEMANGA_EN("NineManga English", "en"), + NINEMANGA_ES("NineManga Español", "es"), + NINEMANGA_RU("NineManga Русский", "ru"), + NINEMANGA_DE("NineManga Deutsch", "de"), + NINEMANGA_IT("NineManga Italiano", "it"), + NINEMANGA_BR("NineManga Brasil", "pt"), + NINEMANGA_FR("NineManga Français", "fr"), + EXHENTAI("ExHentai", null), + MANGAOWL("MangaOwl", "en"), + MANGADEX("MangaDex", null), ; - - @get:Throws(NoBeanDefFoundException::class) - @Deprecated("", ReplaceWith("MangaRepository(this)", - "org.koitharu.kotatsu.core.parser.MangaRepository")) - val repository: MangaRepository - get() = GlobalContext.get().get(named(this)) } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt index 6c41a5291..5627e8637 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt @@ -7,6 +7,7 @@ import org.koin.core.qualifier.named import org.koin.dsl.bind import org.koin.dsl.module import org.koitharu.kotatsu.BuildConfig +import org.koitharu.kotatsu.base.domain.MangaLoaderContext import org.koitharu.kotatsu.utils.CacheUtils import org.koitharu.kotatsu.utils.DownloadManagerHelper import java.util.concurrent.TimeUnit @@ -30,4 +31,5 @@ val networkModule }.build() } factory { DownloadManagerHelper(get(), get()) } + single { MangaLoaderContext(get(), get()) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaRepository.kt index c8904b2a8..45103954f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaRepository.kt @@ -7,6 +7,8 @@ import org.koitharu.kotatsu.core.model.* interface MangaRepository { + val source: MangaSource + val sortOrders: Set suspend fun getList2( diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt index c97f7a4eb..944bd1ac6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt @@ -2,15 +2,12 @@ package org.koitharu.kotatsu.core.parser import org.koin.core.qualifier.named import org.koin.dsl.module -import org.koitharu.kotatsu.base.domain.MangaLoaderContext import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.parser.site.* val parserModule get() = module { - single { MangaLoaderContext(get(), get()) } - factory(named(MangaSource.READMANGA_RU)) { ReadmangaRepository(get()) } factory(named(MangaSource.MINTMANGA)) { MintMangaRepository(get()) } factory(named(MangaSource.SELFMANGA)) { SelfMangaRepository(get()) } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt index ef4c55817..12572a5d4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.core.parser import org.koitharu.kotatsu.base.domain.MangaLoaderContext import org.koitharu.kotatsu.core.exceptions.ParseException import org.koitharu.kotatsu.core.model.MangaPage -import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.model.MangaTag import org.koitharu.kotatsu.core.model.SortOrder import org.koitharu.kotatsu.core.prefs.SourceSettings @@ -12,8 +11,6 @@ abstract class RemoteMangaRepository( protected val loaderContext: MangaLoaderContext ) : MangaRepository { - protected abstract val source: MangaSource - protected abstract val defaultDomain: String private val conf by lazy { @@ -29,6 +26,8 @@ abstract class RemoteMangaRepository( override suspend fun getTags(): Set = emptySet() + fun getFaviconUrl() = "https://${getDomain()}/favicon.ico" + open fun onCreatePreferences(map: MutableMap) { map[SourceSettings.KEY_DOMAIN] = defaultDomain } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index 8b7b241e6..3f8ee5a8f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -123,7 +123,7 @@ class DetailsViewModel( var manga = mangaDataRepository.resolveIntent(intent) ?: throw MangaNotFoundException("Cannot find manga") mangaData.value = manga - manga = manga.source.repository.getDetails(manga) + manga = MangaRepository(manga.source).getDetails(manga) // find default branch val hist = historyRepository.getOne(manga) selectedBranch.value = if (hist != null) { diff --git a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt index 3742f007e..cedfe10a9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt @@ -23,6 +23,7 @@ import java.util.zip.ZipFile class LocalMangaRepository(private val context: Context) : MangaRepository { + override val source = MangaSource.LOCAL private val filenameFilter = CbzFilter() override suspend fun getList2( diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt index 38cfe450e..8e4e8316d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt @@ -50,7 +50,7 @@ class PageLoader( private fun loadAsync(page: MangaPage): Deferred { var repo = repository - if (repo?.javaClass != page.source.cls) { + if (repo?.source != page.source) { repo = mangaRepositoryOf(page.source) repository = repo } diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index cb4a0e38e..fa6203f55 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -1,6 +1,5 @@ package org.koitharu.kotatsu.reader.ui -import android.content.ContentResolver import android.net.Uri import android.util.LongSparseArray import androidx.lifecycle.MutableLiveData @@ -77,7 +76,7 @@ class ReaderViewModel( var manga = dataRepository.resolveIntent(intent) ?: throw MangaNotFoundException("Cannot find manga") mangaData.value = manga - val repo = manga.source.repository + val repo = MangaRepository(manga.source) manga = repo.getDetails(manga) manga.chapters?.forEach { chapters.put(it.id, it) @@ -206,7 +205,7 @@ class ReaderViewModel( private suspend fun loadChapter(chapterId: Long): List { val manga = checkNotNull(mangaData.value) { "Manga is null" } val chapter = checkNotNull(chapters[chapterId]) { "Requested chapter not found" } - val repo = manga.source.repository + val repo = MangaRepository(manga.source) return repo.getPages(chapter).mapIndexed { index, page -> ReaderPage.from(page, index, chapterId) } diff --git a/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt b/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt index d099f54c5..efb736d7b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt @@ -14,6 +14,7 @@ import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.model.SortOrder +import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.search.ui.MangaSuggestionsProvider import org.koitharu.kotatsu.utils.ext.levenshteinDistance @@ -29,7 +30,7 @@ class MangaSearchRepository( MangaProviderFactory.getSources(settings, includeHidden = false).asFlow() .flatMapMerge(concurrency) { source -> runCatching { - source.repository.getList2( + MangaRepository(source).getList2( offset = 0, query = query, sortOrder = SortOrder.POPULARITY diff --git a/app/src/test/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepositoryTest.kt b/app/src/test/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepositoryTest.kt index bdfa3f735..6cf57a268 100644 --- a/app/src/test/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepositoryTest.kt +++ b/app/src/test/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepositoryTest.kt @@ -31,7 +31,7 @@ class RemoteMangaRepositoryTest(private val source: MangaSource) : KoinTest { @get:Rule val koinTestRule = KoinTestRule.create { printLogger(Level.ERROR) - modules(repositoryTestModule) + modules(repositoryTestModule, parserModule) } @get:Rule diff --git a/app/src/test/java/org/koitharu/kotatsu/core/parser/RepositoryTestModule.kt b/app/src/test/java/org/koitharu/kotatsu/core/parser/RepositoryTestModule.kt index c28ccdec8..81d536fea 100644 --- a/app/src/test/java/org/koitharu/kotatsu/core/parser/RepositoryTestModule.kt +++ b/app/src/test/java/org/koitharu/kotatsu/core/parser/RepositoryTestModule.kt @@ -7,7 +7,6 @@ import org.koitharu.kotatsu.base.domain.MangaLoaderContext import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.network.TestCookieJar import org.koitharu.kotatsu.core.network.UserAgentInterceptor -import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.core.parser.SourceSettingsStub import org.koitharu.kotatsu.core.prefs.SourceSettings import java.util.concurrent.TimeUnit @@ -31,12 +30,4 @@ val repositoryTestModule } } } - factory { (source: MangaSource) -> - runCatching { - source.cls.getDeclaredConstructor(MangaLoaderContext::class.java) - .newInstance(get()) - }.recoverCatching { - source.cls.newInstance() - }.getOrThrow() as RemoteMangaRepository - } } \ No newline at end of file