ReImplement Mangadex deeplink

This commit is contained in:
Jobobby04 2021-07-06 16:57:26 -04:00
parent 90654dc027
commit d788585d14
4 changed files with 23 additions and 71 deletions

View File

@ -312,7 +312,7 @@
android:scheme="https" /> android:scheme="https" />
<!-- MangaDex --> <!-- MangaDex -->
<!--<data <data
android:scheme="https" android:scheme="https"
android:host="www.mangadex.org" android:host="www.mangadex.org"
android:pathPrefix="/manga/" /> android:pathPrefix="/manga/" />
@ -320,14 +320,6 @@
android:scheme="https" android:scheme="https"
android:host="mangadex.org" android:host="mangadex.org"
android:pathPrefix="/manga/" /> android:pathPrefix="/manga/" />
<data
android:scheme="https"
android:host="www.mangadex.cc"
android:pathPrefix="/manga/" />
<data
android:scheme="https"
android:host="www.mangadex.cc"
android:pathPrefix="/manga/" />
<data <data
android:scheme="https" android:scheme="https"
@ -337,14 +329,6 @@
android:scheme="https" android:scheme="https"
android:host="mangadex.org" android:host="mangadex.org"
android:pathPrefix="/title/" /> android:pathPrefix="/title/" />
<data
android:scheme="https"
android:host="www.mangadex.cc"
android:pathPrefix="/title/" />
<data
android:scheme="https"
android:host="www.mangadex.cc"
android:pathPrefix="/title/" />
<data <data
android:scheme="https" android:scheme="https"
@ -354,14 +338,6 @@
android:scheme="https" android:scheme="https"
android:host="mangadex.org" android:host="mangadex.org"
android:pathPrefix="/chapter/" /> android:pathPrefix="/chapter/" />
<data
android:scheme="https"
android:host="www.mangadex.cc"
android:pathPrefix="/chapter/" />
<data
android:scheme="https"
android:host="www.mangadex.cc"
android:pathPrefix="/chapter/" />-->
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity

View File

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.source.online.all
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.net.Uri
import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
@ -19,6 +20,7 @@ import eu.kanade.tachiyomi.source.online.LoginSource
import eu.kanade.tachiyomi.source.online.MetadataSource import eu.kanade.tachiyomi.source.online.MetadataSource
import eu.kanade.tachiyomi.source.online.NamespaceSource import eu.kanade.tachiyomi.source.online.NamespaceSource
import eu.kanade.tachiyomi.source.online.RandomMangaSource import eu.kanade.tachiyomi.source.online.RandomMangaSource
import eu.kanade.tachiyomi.source.online.UrlImportableSource
import eu.kanade.tachiyomi.ui.base.controller.BaseController import eu.kanade.tachiyomi.ui.base.controller.BaseController
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.lang.runAsObservable import eu.kanade.tachiyomi.util.lang.runAsObservable
@ -37,7 +39,9 @@ import exh.md.service.MangaDexAuthService
import exh.md.service.MangaDexService import exh.md.service.MangaDexService
import exh.md.service.SimilarService import exh.md.service.SimilarService
import exh.md.utils.FollowStatus import exh.md.utils.FollowStatus
import exh.md.utils.MdApi
import exh.md.utils.MdLang import exh.md.utils.MdLang
import exh.md.utils.MdUtil
import exh.metadata.metadata.MangaDexSearchMetadata import exh.metadata.metadata.MangaDexSearchMetadata
import exh.source.DelegatedHttpSource import exh.source.DelegatedHttpSource
import exh.ui.metadata.adapters.MangaDexDescriptionAdapter import exh.ui.metadata.adapters.MangaDexDescriptionAdapter
@ -54,7 +58,7 @@ import kotlin.reflect.KClass
class MangaDex(delegate: HttpSource, val context: Context) : class MangaDex(delegate: HttpSource, val context: Context) :
DelegatedHttpSource(delegate), DelegatedHttpSource(delegate),
MetadataSource<MangaDexSearchMetadata, MangaDto>, MetadataSource<MangaDexSearchMetadata, MangaDto>,
// UrlImportableSource, UrlImportableSource,
FollowsSource, FollowsSource,
LoginSource, LoginSource,
BrowseSourceFilterHeader, BrowseSourceFilterHeader,
@ -66,7 +70,7 @@ class MangaDex(delegate: HttpSource, val context: Context) :
MdLang.fromExt(lang) ?: MdLang.ENGLISH MdLang.fromExt(lang) ?: MdLang.ENGLISH
} }
// override val matchingHosts: List<String> = listOf("mangadex.org", "www.mangadex.org") override val matchingHosts: List<String> = listOf("mangadex.org", "www.mangadex.org")
val preferences = Injekt.get<PreferencesHelper>() val preferences = Injekt.get<PreferencesHelper>()
val mdList: MdList = Injekt.get<TrackManager>().mdList val mdList: MdList = Injekt.get<TrackManager>().mdList
@ -114,18 +118,11 @@ class MangaDex(delegate: HttpSource, val context: Context) :
PageHandler(headers, mangadexService, mangaPlusHandler, preferences, mdList) PageHandler(headers, mangadexService, mangaPlusHandler, preferences, mdList)
} }
/*override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> = override suspend fun mapUrlToMangaUrl(uri: Uri): String? {
urlImportFetchSearchManga(context, query) { val lcFirstPathSegment = uri.pathSegments.firstOrNull()?.lowercase() ?: return null
importIdToMdId(query) {
super.fetchSearchManga(page, query, filters)
}
}*/
/*override suspend fun mapUrlToMangaUrl(uri: Uri): String? {
val lcFirstPathSegment = uri.pathSegments.firstOrNull()?.toLowerCase() ?: return null
return if (lcFirstPathSegment == "title" || lcFirstPathSegment == "manga") { return if (lcFirstPathSegment == "title" || lcFirstPathSegment == "manga") {
"/manga/" + uri.pathSegments[1] MdUtil.buildMangaUrl(uri.pathSegments[1])
} else { } else {
null null
} }
@ -133,15 +130,14 @@ class MangaDex(delegate: HttpSource, val context: Context) :
override fun mapUrlToChapterUrl(uri: Uri): String? { override fun mapUrlToChapterUrl(uri: Uri): String? {
if (!uri.pathSegments.firstOrNull().equals("chapter", true)) return null if (!uri.pathSegments.firstOrNull().equals("chapter", true)) return null
val id = uri.pathSegments.getOrNull(1)?.toIntOrNull() ?: return null val id = uri.pathSegments.getOrNull(1) ?: return null
return MdUtil.oldApiChapter + id return MdApi.chapter + '/' + id
} }
override suspend fun mapChapterUrlToMangaUrl(uri: Uri): String? { override suspend fun mapChapterUrlToMangaUrl(uri: Uri): String? {
val id = uri.pathSegments.getOrNull(2) ?: return null val id = uri.pathSegments.getOrNull(1) ?: return null
val mangaId = MangaHandler(baseHttpClient, headers, mdLang).getMangaIdFromChapterId(id) return mangaHandler.getMangaFromChapterId(id)?.let { MdUtil.buildMangaUrl(it) }
return MdUtil.mapMdIdToMangaUrl(mangaId) }
}*/
override fun fetchMangaDetails(manga: SManga): Observable<SManga> { override fun fetchMangaDetails(manga: SManga): Observable<SManga> {
return mangaHandler.fetchMangaDetailsObservable(manga, id, preferences.mangaDexForceLatestCovers().get()) return mangaHandler.fetchMangaDetailsObservable(manga, id, preferences.mangaDexForceLatestCovers().get())
@ -240,9 +236,6 @@ class MangaDex(delegate: HttpSource, val context: Context) :
}*/ }*/
override suspend fun fetchTrackingInfo(url: String): Track { override suspend fun fetchTrackingInfo(url: String): Track {
if (!isLogged()) {
throw Exception("Not Logged in")
}
return followsHandler.fetchTrackingInfo(url) return followsHandler.fetchTrackingInfo(url)
} }
@ -266,26 +259,6 @@ class MangaDex(delegate: HttpSource, val context: Context) :
return similarHandler.getSimilar(manga) return similarHandler.getSimilar(manga)
} }
/*private fun importIdToMdId(query: String, fail: () -> Observable<MangasPage>): Observable<MangasPage> =
when {
query.toIntOrNull() != null -> {
runAsObservable({
GalleryAdder().addGallery(context, MdUtil.baseUrl + MdUtil.mapMdIdToMangaUrl(query.toInt()), false, this@MangaDex)
})
.map { res ->
MangasPage(
if (res is GalleryAddEvent.Success) {
listOf(res.manga)
} else {
emptyList()
},
false
)
}
}
else -> fail()
}*/
companion object { companion object {
private const val dataSaverPref = "dataSaverV5" private const val dataSaverPref = "dataSaverV5"

View File

@ -1,7 +1,6 @@
package exh.md.handlers package exh.md.handlers
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import exh.log.xLogE import exh.log.xLogE
import exh.md.dto.ChapterDto import exh.md.dto.ChapterDto
@ -15,7 +14,6 @@ import exh.metadata.metadata.base.insertFlatMetadata
import exh.util.capitalize import exh.util.capitalize
import exh.util.floor import exh.util.floor
import exh.util.nullIfEmpty import exh.util.nullIfEmpty
import okhttp3.Response
import tachiyomi.source.model.ChapterInfo import tachiyomi.source.model.ChapterInfo
import tachiyomi.source.model.MangaInfo import tachiyomi.source.model.MangaInfo
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -200,9 +198,8 @@ class ApiMangaParser(
}.toList() }.toList()
} }
fun chapterParseForMangaId(response: Response): String { fun chapterParseForMangaId(chapterDto: ChapterDto): String? {
return response.parseAs<ChapterDto>(MdUtil.jsonParser) return chapterDto.relationships.find { it.type.equals("manga", true) }?.id
.relationships.firstOrNull { it.type.equals("manga", true) }?.id ?: throw Exception("Not found")
} }
fun StringBuilder.appends(string: String): StringBuilder = append("$string ") fun StringBuilder.appends(string: String): StringBuilder = append("$string ")

View File

@ -82,4 +82,10 @@ class MangaHandler(
remoteTrack.await() to null remoteTrack.await() to null
} }
} }
suspend fun getMangaFromChapterId(chapterId: String): String? {
return withIOContext {
apiMangaParser.chapterParseForMangaId(service.viewChapter(chapterId))
}
}
} }