diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 27bac9c7d..e7e011f65 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -285,6 +285,24 @@ android:host="www.hbrowse.com" android:pathPrefix="/" android:scheme="https" /> + + + + + + val sourceQName = source::class.qualifiedName - val delegate = DELEGATED_SOURCES[sourceQName] + val factories = DELEGATED_SOURCES.entries.filter { it.value.factory }.map { it.value.originalSourceQualifiedClassName } + val delegate = if (sourceQName != null) { + val matched = factories.find { sourceQName.startsWith(it) } + if (matched != null) { + DELEGATED_SOURCES[matched] + } else DELEGATED_SOURCES[sourceQName] + } else null val newSource = if (source is HttpSource && delegate != null) { XLog.d("[EXH] Delegating source: %s -> %s!", sourceQName, delegate.newSourceClass.qualifiedName) - EnhancedHttpSource( + val enhancedSource = EnhancedHttpSource( source, delegate.newSourceClass.constructors.find { it.parameters.size == 1 }!!.call(source) ) + val map = listOf(DelegatedSource(enhancedSource.originalSource.name, enhancedSource.originalSource.id, enhancedSource.originalSource::class.qualifiedName ?: delegate.originalSourceQualifiedClassName, (enhancedSource.enchancedSource as DelegatedHttpSource)::class, delegate.factory)).associateBy { it.originalSourceQualifiedClassName } + currentDelegatedSources.plusAssign(map) + enhancedSource } else source if (source.id in BlacklistedSources.BLACKLISTED_EXT_SOURCES) { @@ -161,6 +171,7 @@ open class SourceManager(private val context: Context) { // SY --> companion object { + private const val fillInSourceId = 9999L val DELEGATED_SOURCES = listOf( DelegatedSource( "Hentai Cafe", @@ -179,14 +190,24 @@ open class SourceManager(private val context: Context) { 6707338697138388238, "eu.kanade.tachiyomi.extension.en.tsumino.Tsumino", Tsumino::class + ), + DelegatedSource( + "MangaDex", + fillInSourceId, + "eu.kanade.tachiyomi.extension.all.mangadex", + MangaDex::class, + true ) ).associateBy { it.originalSourceQualifiedClassName } + var currentDelegatedSources = mutableMapOf() + data class DelegatedSource( val sourceName: String, val sourceId: Long, val originalSourceQualifiedClassName: String, - val newSourceClass: KClass + val newSourceClass: KClass, + val factory: Boolean = false ) } // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MangaDex.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MangaDex.kt new file mode 100644 index 000000000..4d5ac4d56 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MangaDex.kt @@ -0,0 +1,25 @@ +package eu.kanade.tachiyomi.source.online.all + +import android.net.Uri +import eu.kanade.tachiyomi.source.online.HttpSource +import eu.kanade.tachiyomi.source.online.UrlImportableSource +import exh.source.DelegatedHttpSource + +class MangaDex(delegate: HttpSource) : + DelegatedHttpSource(delegate), + UrlImportableSource { + + override val matchingHosts: List = listOf("mangadex.org") + + override fun mapUrlToMangaUrl(uri: Uri): String? { + val lcFirstPathSegment = uri.pathSegments.firstOrNull()?.toLowerCase() ?: return null + + return if (lcFirstPathSegment == "title" || lcFirstPathSegment == "manga") { + "/manga/${uri.pathSegments[1]}" + } else { + null + } + } + + override val lang: String = delegate.lang +} diff --git a/app/src/main/java/exh/EHSourceHelpers.kt b/app/src/main/java/exh/EHSourceHelpers.kt index d33545a76..f05a78ac7 100755 --- a/app/src/main/java/exh/EHSourceHelpers.kt +++ b/app/src/main/java/exh/EHSourceHelpers.kt @@ -41,15 +41,15 @@ val LIBRARY_UPDATE_EXCLUDED_SOURCES = listOf( PURURIN_SOURCE_ID ) -private inline fun delegatedSourceId(): Long { +private inline fun delegatedSourceId(): Long? { return SourceManager.DELEGATED_SOURCES.entries.find { it.value.newSourceClass == T::class - }!!.value.sourceId + }?.value?.sourceId } // Used to speed up isLewdSource -val lewdDelegatedSourceIds = SourceManager.DELEGATED_SOURCES.filter { - it.value.newSourceClass in DELEGATED_LEWD_SOURCES +val lewdDelegatedSourceIds = SourceManager.currentDelegatedSources.filter { + !it.value.factory && it.value.newSourceClass in DELEGATED_LEWD_SOURCES }.map { it.value.sourceId }.sorted() // This method MUST be fast! diff --git a/app/src/main/java/exh/EXHMigrations.kt b/app/src/main/java/exh/EXHMigrations.kt index 2ab32640f..e67d2739a 100644 --- a/app/src/main/java/exh/EXHMigrations.kt +++ b/app/src/main/java/exh/EXHMigrations.kt @@ -62,12 +62,12 @@ object EXHMigrations { fun migrateBackupEntry(manga: MangaImpl): MangaImpl { // Migrate HentaiCafe source IDs if (manga.source == 6908L) { - manga.source = HENTAI_CAFE_SOURCE_ID + manga.source = HENTAI_CAFE_SOURCE_ID!! } // Migrate Tsumino source IDs if (manga.source == 6909L) { - manga.source = TSUMINO_SOURCE_ID + manga.source = TSUMINO_SOURCE_ID!! } // Migrate nhentai URLs diff --git a/app/src/main/java/exh/debug/DebugFunctions.kt b/app/src/main/java/exh/debug/DebugFunctions.kt index 20717a721..79fd596b5 100644 --- a/app/src/main/java/exh/debug/DebugFunctions.kt +++ b/app/src/main/java/exh/debug/DebugFunctions.kt @@ -12,6 +12,7 @@ import eu.kanade.tachiyomi.data.database.tables.MangaTable import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.SourceManager +import eu.kanade.tachiyomi.source.SourceManager.Companion.currentDelegatedSources import exh.EH_SOURCE_ID import exh.EXHMigrations import exh.EXHSavedSearch @@ -67,6 +68,8 @@ object DebugFunctions { } private val throttleManager = EHentaiThrottleManager() + fun getDelegatedSourceList(): String = currentDelegatedSources.map { it.value.sourceName }.joinToString(separator = "\n") + fun ResetEHGalleriesForUpdater() { throttleManager.resetThrottle() runBlocking {