MangaDex - MD@Home token handling (#3721)
* MangaDex - MD@Home token handling * finalization
This commit is contained in:
@ -5,7 +5,7 @@ ext {
|
|||||||
extName = 'MangaDex'
|
extName = 'MangaDex'
|
||||||
pkgNameSuffix = 'all.mangadex'
|
pkgNameSuffix = 'all.mangadex'
|
||||||
extClass = '.MangaDexFactory'
|
extClass = '.MangaDexFactory'
|
||||||
extVersionCode = 94
|
extVersionCode = 95
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ abstract class MangaDex(
|
|||||||
|
|
||||||
override val baseUrl = "https://www.mangadex.org"
|
override val baseUrl = "https://www.mangadex.org"
|
||||||
|
|
||||||
private val cdnUrl = "https://www.mangadex.org" // "https://s0.mangadex.org"
|
private val cdnUrl = "https://mangadex.org" // "https://s0.mangadex.org"
|
||||||
|
|
||||||
override val supportsLatest = true
|
override val supportsLatest = true
|
||||||
|
|
||||||
@ -590,13 +590,46 @@ abstract class MangaDex(
|
|||||||
val server = json.get("server").string
|
val server = json.get("server").string
|
||||||
|
|
||||||
pageArray.forEach {
|
pageArray.forEach {
|
||||||
val url = "$server$hash/${it.asString}"
|
val url = "$hash/${it.asString}"
|
||||||
pages.add(Page(pages.size, "", getImageUrl(url)))
|
pages.add(Page(pages.size, "$server,${response.request().url()},${Date().time}", url))
|
||||||
}
|
}
|
||||||
|
|
||||||
return pages
|
return pages
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun imageRequest(page: Page): Request {
|
||||||
|
val url = when {
|
||||||
|
// Legacy
|
||||||
|
page.url.isEmpty() -> page.imageUrl!!
|
||||||
|
// Some images are hosted elsewhere
|
||||||
|
!page.url.startsWith("http") -> baseUrl + page.url.substringBefore(",") + page.imageUrl
|
||||||
|
// New chapters on MD servers
|
||||||
|
page.url.contains("https://mangadex.org/data") -> page.url.substringBefore(",") + page.imageUrl
|
||||||
|
// MD@Home token handling
|
||||||
|
else -> {
|
||||||
|
val tokenLifespan = 5 * 60 * 1000
|
||||||
|
val data = page.url.split(",")
|
||||||
|
var tokenedServer = data[0]
|
||||||
|
if (Date().time - data[2].toLong() > tokenLifespan) {
|
||||||
|
val tokenRequestUrl = data[1]
|
||||||
|
val cacheControl = if (Date().time - (tokenTracker[tokenRequestUrl] ?: 0) > tokenLifespan) {
|
||||||
|
tokenTracker[tokenRequestUrl] = Date().time
|
||||||
|
CacheControl.FORCE_NETWORK
|
||||||
|
} else {
|
||||||
|
CacheControl.FORCE_CACHE
|
||||||
|
}
|
||||||
|
val jsonData = client.newCall(GET(tokenRequestUrl, headers, cacheControl)).execute().body()!!.string()
|
||||||
|
tokenedServer = JsonParser().parse(jsonData).asJsonObject.get("server").string
|
||||||
|
}
|
||||||
|
tokenedServer + page.imageUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GET(url, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
// chapter url where we get the token, last request time
|
||||||
|
private val tokenTracker = hashMapOf<String, Long>()
|
||||||
|
|
||||||
override fun imageUrlParse(document: Document): String = ""
|
override fun imageUrlParse(document: Document): String = ""
|
||||||
|
|
||||||
private fun parseStatus(status: Int) = when (status) {
|
private fun parseStatus(status: Int) = when (status) {
|
||||||
@ -604,14 +637,6 @@ abstract class MangaDex(
|
|||||||
else -> SManga.UNKNOWN
|
else -> SManga.UNKNOWN
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getImageUrl(attr: String): String {
|
|
||||||
// Some images are hosted elsewhere
|
|
||||||
if (attr.startsWith("http")) {
|
|
||||||
return attr
|
|
||||||
}
|
|
||||||
return baseUrl + attr
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
|
override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
|
||||||
val r18Pref = androidx.preference.ListPreference(screen.context).apply {
|
val r18Pref = androidx.preference.ListPreference(screen.context).apply {
|
||||||
key = SHOW_R18_PREF_Title
|
key = SHOW_R18_PREF_Title
|
||||||
|
Reference in New Issue
Block a user