Delegate Mangadex
Features that are now usable because of this: - Batch add mangadex manga - Open mangadex manga into TachiyomiSY(skipping the extension)
This commit is contained in:
parent
a2f2e7658d
commit
ad82dc1c90
@ -285,6 +285,24 @@
|
|||||||
android:host="www.hbrowse.com"
|
android:host="www.hbrowse.com"
|
||||||
android:pathPrefix="/"
|
android:pathPrefix="/"
|
||||||
android:scheme="https" />
|
android:scheme="https" />
|
||||||
|
|
||||||
|
<!-- MangaDex -->
|
||||||
|
<data
|
||||||
|
android:host="mangadex.org"
|
||||||
|
android:pathPattern="\/(title|manga)\/"
|
||||||
|
android:scheme="http" />
|
||||||
|
<data
|
||||||
|
android:host="mangadex.org"
|
||||||
|
android:pathPattern="\/(title|manga)\/"
|
||||||
|
android:scheme="https" />
|
||||||
|
<data
|
||||||
|
android:host="www.mangadex.org"
|
||||||
|
android:pathPattern="\/(title|manga)\/"
|
||||||
|
android:scheme="http" />
|
||||||
|
<data
|
||||||
|
android:host="www.mangadex.org"
|
||||||
|
android:pathPattern="\/(title|manga)\/"
|
||||||
|
android:scheme="https" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
|
@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.source.model.SManga
|
|||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import eu.kanade.tachiyomi.source.online.all.EHentai
|
import eu.kanade.tachiyomi.source.online.all.EHentai
|
||||||
import eu.kanade.tachiyomi.source.online.all.Hitomi
|
import eu.kanade.tachiyomi.source.online.all.Hitomi
|
||||||
|
import eu.kanade.tachiyomi.source.online.all.MangaDex
|
||||||
import eu.kanade.tachiyomi.source.online.all.MergedSource
|
import eu.kanade.tachiyomi.source.online.all.MergedSource
|
||||||
import eu.kanade.tachiyomi.source.online.all.NHentai
|
import eu.kanade.tachiyomi.source.online.all.NHentai
|
||||||
import eu.kanade.tachiyomi.source.online.all.PervEden
|
import eu.kanade.tachiyomi.source.online.all.PervEden
|
||||||
@ -87,13 +88,22 @@ open class SourceManager(private val context: Context) {
|
|||||||
internal fun registerSource(source: Source, overwrite: Boolean = false) {
|
internal fun registerSource(source: Source, overwrite: Boolean = false) {
|
||||||
// EXH -->
|
// EXH -->
|
||||||
val sourceQName = source::class.qualifiedName
|
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) {
|
val newSource = if (source is HttpSource && delegate != null) {
|
||||||
XLog.d("[EXH] Delegating source: %s -> %s!", sourceQName, delegate.newSourceClass.qualifiedName)
|
XLog.d("[EXH] Delegating source: %s -> %s!", sourceQName, delegate.newSourceClass.qualifiedName)
|
||||||
EnhancedHttpSource(
|
val enhancedSource = EnhancedHttpSource(
|
||||||
source,
|
source,
|
||||||
delegate.newSourceClass.constructors.find { it.parameters.size == 1 }!!.call(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
|
} else source
|
||||||
|
|
||||||
if (source.id in BlacklistedSources.BLACKLISTED_EXT_SOURCES) {
|
if (source.id in BlacklistedSources.BLACKLISTED_EXT_SOURCES) {
|
||||||
@ -161,6 +171,7 @@ open class SourceManager(private val context: Context) {
|
|||||||
|
|
||||||
// SY -->
|
// SY -->
|
||||||
companion object {
|
companion object {
|
||||||
|
private const val fillInSourceId = 9999L
|
||||||
val DELEGATED_SOURCES = listOf(
|
val DELEGATED_SOURCES = listOf(
|
||||||
DelegatedSource(
|
DelegatedSource(
|
||||||
"Hentai Cafe",
|
"Hentai Cafe",
|
||||||
@ -179,14 +190,24 @@ open class SourceManager(private val context: Context) {
|
|||||||
6707338697138388238,
|
6707338697138388238,
|
||||||
"eu.kanade.tachiyomi.extension.en.tsumino.Tsumino",
|
"eu.kanade.tachiyomi.extension.en.tsumino.Tsumino",
|
||||||
Tsumino::class
|
Tsumino::class
|
||||||
|
),
|
||||||
|
DelegatedSource(
|
||||||
|
"MangaDex",
|
||||||
|
fillInSourceId,
|
||||||
|
"eu.kanade.tachiyomi.extension.all.mangadex",
|
||||||
|
MangaDex::class,
|
||||||
|
true
|
||||||
)
|
)
|
||||||
).associateBy { it.originalSourceQualifiedClassName }
|
).associateBy { it.originalSourceQualifiedClassName }
|
||||||
|
|
||||||
|
var currentDelegatedSources = mutableMapOf<String, DelegatedSource>()
|
||||||
|
|
||||||
data class DelegatedSource(
|
data class DelegatedSource(
|
||||||
val sourceName: String,
|
val sourceName: String,
|
||||||
val sourceId: Long,
|
val sourceId: Long,
|
||||||
val originalSourceQualifiedClassName: String,
|
val originalSourceQualifiedClassName: String,
|
||||||
val newSourceClass: KClass<out DelegatedHttpSource>
|
val newSourceClass: KClass<out DelegatedHttpSource>,
|
||||||
|
val factory: Boolean = false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
// SY <--
|
// SY <--
|
||||||
|
@ -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<String> = 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
|
||||||
|
}
|
@ -41,15 +41,15 @@ val LIBRARY_UPDATE_EXCLUDED_SOURCES = listOf(
|
|||||||
PURURIN_SOURCE_ID
|
PURURIN_SOURCE_ID
|
||||||
)
|
)
|
||||||
|
|
||||||
private inline fun <reified T> delegatedSourceId(): Long {
|
private inline fun <reified T> delegatedSourceId(): Long? {
|
||||||
return SourceManager.DELEGATED_SOURCES.entries.find {
|
return SourceManager.DELEGATED_SOURCES.entries.find {
|
||||||
it.value.newSourceClass == T::class
|
it.value.newSourceClass == T::class
|
||||||
}!!.value.sourceId
|
}?.value?.sourceId
|
||||||
}
|
}
|
||||||
|
|
||||||
// Used to speed up isLewdSource
|
// Used to speed up isLewdSource
|
||||||
val lewdDelegatedSourceIds = SourceManager.DELEGATED_SOURCES.filter {
|
val lewdDelegatedSourceIds = SourceManager.currentDelegatedSources.filter {
|
||||||
it.value.newSourceClass in DELEGATED_LEWD_SOURCES
|
!it.value.factory && it.value.newSourceClass in DELEGATED_LEWD_SOURCES
|
||||||
}.map { it.value.sourceId }.sorted()
|
}.map { it.value.sourceId }.sorted()
|
||||||
|
|
||||||
// This method MUST be fast!
|
// This method MUST be fast!
|
||||||
|
@ -62,12 +62,12 @@ object EXHMigrations {
|
|||||||
fun migrateBackupEntry(manga: MangaImpl): MangaImpl {
|
fun migrateBackupEntry(manga: MangaImpl): MangaImpl {
|
||||||
// Migrate HentaiCafe source IDs
|
// Migrate HentaiCafe source IDs
|
||||||
if (manga.source == 6908L) {
|
if (manga.source == 6908L) {
|
||||||
manga.source = HENTAI_CAFE_SOURCE_ID
|
manga.source = HENTAI_CAFE_SOURCE_ID!!
|
||||||
}
|
}
|
||||||
|
|
||||||
// Migrate Tsumino source IDs
|
// Migrate Tsumino source IDs
|
||||||
if (manga.source == 6909L) {
|
if (manga.source == 6909L) {
|
||||||
manga.source = TSUMINO_SOURCE_ID
|
manga.source = TSUMINO_SOURCE_ID!!
|
||||||
}
|
}
|
||||||
|
|
||||||
// Migrate nhentai URLs
|
// Migrate nhentai URLs
|
||||||
|
@ -12,6 +12,7 @@ import eu.kanade.tachiyomi.data.database.tables.MangaTable
|
|||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.source.CatalogueSource
|
import eu.kanade.tachiyomi.source.CatalogueSource
|
||||||
import eu.kanade.tachiyomi.source.SourceManager
|
import eu.kanade.tachiyomi.source.SourceManager
|
||||||
|
import eu.kanade.tachiyomi.source.SourceManager.Companion.currentDelegatedSources
|
||||||
import exh.EH_SOURCE_ID
|
import exh.EH_SOURCE_ID
|
||||||
import exh.EXHMigrations
|
import exh.EXHMigrations
|
||||||
import exh.EXHSavedSearch
|
import exh.EXHSavedSearch
|
||||||
@ -67,6 +68,8 @@ object DebugFunctions {
|
|||||||
}
|
}
|
||||||
private val throttleManager = EHentaiThrottleManager()
|
private val throttleManager = EHentaiThrottleManager()
|
||||||
|
|
||||||
|
fun getDelegatedSourceList(): String = currentDelegatedSources.map { it.value.sourceName }.joinToString(separator = "\n")
|
||||||
|
|
||||||
fun ResetEHGalleriesForUpdater() {
|
fun ResetEHGalleriesForUpdater() {
|
||||||
throttleManager.resetThrottle()
|
throttleManager.resetThrottle()
|
||||||
runBlocking {
|
runBlocking {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user