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 index bf0081ea2..839604b32 100644 --- 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 @@ -160,7 +160,7 @@ class MangaDex(delegate: HttpSource, val context: Context) : } override fun fetchPageList(chapter: SChapter): Observable> { - return runAsObservable({ pageHandler.fetchPageList(chapter, isLogged(), usePort443Only(), dataSaver()) }) + return runAsObservable({ pageHandler.fetchPageList(chapter, isLogged(), usePort443Only(), dataSaver(), delegate) }) } override fun fetchImage(page: Page): Observable { diff --git a/app/src/main/java/exh/md/handlers/MangaPlusHandler.kt b/app/src/main/java/exh/md/handlers/MangaPlusHandler.kt index f7778c5ec..fbef3f8b9 100644 --- a/app/src/main/java/exh/md/handlers/MangaPlusHandler.kt +++ b/app/src/main/java/exh/md/handlers/MangaPlusHandler.kt @@ -1,6 +1,7 @@ package exh.md.handlers import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.await import eu.kanade.tachiyomi.source.model.Page import exh.md.dto.MangaPlusSerializer import kotlinx.serialization.protobuf.ProtoBuf @@ -25,8 +26,8 @@ class MangaPlusHandler(currentClient: OkHttpClient) { .addInterceptor { imageIntercept(it) } .build() - fun fetchPageList(chapterId: String): List { - val response = client.newCall(pageListRequest(chapterId)).execute() + suspend fun fetchPageList(chapterId: String): List { + val response = client.newCall(pageListRequest(chapterId)).await() return pageListParse(response) } diff --git a/app/src/main/java/exh/md/handlers/PageHandler.kt b/app/src/main/java/exh/md/handlers/PageHandler.kt index 328dc973c..3cf75cc30 100644 --- a/app/src/main/java/exh/md/handlers/PageHandler.kt +++ b/app/src/main/java/exh/md/handlers/PageHandler.kt @@ -8,8 +8,12 @@ import eu.kanade.tachiyomi.util.lang.withIOContext import exh.md.dto.AtHomeDto import exh.md.dto.ChapterDto import exh.md.service.MangaDexService +import exh.md.utils.MdApi import exh.md.utils.MdUtil import okhttp3.Headers +import tachiyomi.source.Source +import kotlin.reflect.full.superclasses +import kotlin.reflect.jvm.isAccessible class PageHandler( private val headers: Headers, @@ -19,7 +23,7 @@ class PageHandler( private val mdList: MdList, ) { - suspend fun fetchPageList(chapter: SChapter, isLogged: Boolean, usePort443Only: Boolean, dataSaver: Boolean): List { + suspend fun fetchPageList(chapter: SChapter, isLogged: Boolean, usePort443Only: Boolean, dataSaver: Boolean, mangadex: Source): List { return withIOContext { val chapterResponse = service.viewChapter(MdUtil.getChapterId(chapter.url)) @@ -36,13 +40,35 @@ class PageHandler( headers } - val (atHomeRequestUrl, atHomeResponse) = service.getAtHomeServer(headers, MdUtil.getChapterId(chapter.url), usePort443Only) + val atHomeRequestUrl = if (usePort443Only) { + "${MdApi.atHomeServer}/${MdUtil.getChapterId(chapter.url)}?forcePort443=true" + } else { + "${MdApi.atHomeServer}/${MdUtil.getChapterId(chapter.url)}" + } + + updateExtensionVariable(mangadex, atHomeRequestUrl) + + val atHomeResponse = service.getAtHomeServer(atHomeRequestUrl, headers) pageListParse(chapterResponse, atHomeRequestUrl, atHomeResponse, dataSaver) } } } + @Suppress("UNCHECKED_CAST") + fun updateExtensionVariable(mangadex: Source, atHomeRequestUrl: String) { + val mangadexSuperclass = mangadex::class.superclasses.first() + + val helperCallable = mangadexSuperclass.members.find { it.name == "helper" } ?: return + helperCallable.isAccessible = true + val helper = helperCallable.call(mangadex) ?: return + + val tokenTrackerCallable = helper::class.members.find { it.name == "tokenTracker" } ?: return + tokenTrackerCallable.isAccessible = true + val tokenTracker = tokenTrackerCallable.call(helper) as? HashMap ?: return + tokenTracker[atHomeRequestUrl] = System.currentTimeMillis() + } + fun pageListParse( chapterDto: ChapterDto, atHomeRequestUrl: String, @@ -57,10 +83,8 @@ class PageHandler( } val now = System.currentTimeMillis() - val pages = pageArray.mapIndexed { pos, imgUrl -> - Page(pos + 1, "${atHomeDto.baseUrl},$atHomeRequestUrl,$now", imgUrl) + return pageArray.mapIndexed { pos, imgUrl -> + Page(pos, "${atHomeDto.baseUrl},$atHomeRequestUrl,$now", imgUrl) } - - return pages } } diff --git a/app/src/main/java/exh/md/service/MangaDexService.kt b/app/src/main/java/exh/md/service/MangaDexService.kt index d72e33df8..b503ab7e2 100644 --- a/app/src/main/java/exh/md/service/MangaDexService.kt +++ b/app/src/main/java/exh/md/service/MangaDexService.kt @@ -95,13 +95,11 @@ class MangaDexService( } suspend fun getAtHomeServer( - headers: Headers, - chapterId: String, - forcePort443: Boolean, - ): Pair { - val url = "${MdApi.atHomeServer}/$chapterId?forcePort443=$forcePort443" - return client.newCall(GET(url, headers, CacheControl.FORCE_NETWORK)) + atHomeRequestUrl: String, + headers: Headers + ): AtHomeDto { + return client.newCall(GET(atHomeRequestUrl, headers, CacheControl.FORCE_NETWORK)) .await() - .let { it.request.url.toUrl().toString() to it.parseAs(MdUtil.jsonParser) } + .parseAs() } }