Add Namicomi support for external chapters on MD (#1188)

This commit is contained in:
Tim Schneeberger 2024-06-02 00:26:05 +02:00 committed by GitHub
parent 7d6e746257
commit 31f967235f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 62 additions and 0 deletions

View File

@ -31,6 +31,7 @@ import exh.md.handlers.FollowsHandler
import exh.md.handlers.MangaHandler
import exh.md.handlers.MangaHotHandler
import exh.md.handlers.MangaPlusHandler
import exh.md.handlers.NamicomiHandler
import exh.md.handlers.PageHandler
import exh.md.handlers.SimilarHandler
import exh.md.network.MangaDexLoginHelper
@ -123,6 +124,9 @@ class MangaDex(delegate: HttpSource, val context: Context) :
private val mangaHotHandler by lazy {
MangaHotHandler(network.client, network.defaultUserAgentProvider())
}
private val namicomiHandler by lazy {
NamicomiHandler(network.client, network.defaultUserAgentProvider())
}
private val pageHandler by lazy {
PageHandler(
headers,
@ -132,6 +136,7 @@ class MangaDex(delegate: HttpSource, val context: Context) :
bilibiliHandler,
azukHandler,
mangaHotHandler,
namicomiHandler,
trackPreferences,
mdList,
)

View File

@ -0,0 +1,49 @@
package exh.md.handlers
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.source.model.Page
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers
import okhttp3.OkHttpClient
import okhttp3.Response
class NamicomiHandler(currentClient: OkHttpClient, userAgent: String) {
private val apiUrl = "https://api.namicomi.com"
private val headers = Headers.Builder()
.add("User-Agent", userAgent)
.build()
val client: OkHttpClient = currentClient
suspend fun fetchPageList(externalUrl: String, dataSaver: Boolean): List<Page> {
val chapterId = externalUrl.substringBefore("?").substringAfterLast("/")
val request =
GET(
"$apiUrl/images/chapter/$chapterId?newQualities=true",
headers,
)
return pageListParse(client.newCall(request).awaitSuccess(), chapterId, dataSaver)
}
private fun pageListParse(response: Response, chapterId: String, dataSaver: Boolean): List<Page> {
val data = Json.parseToJsonElement(response.body.string()).jsonObject["data"]!!
val baseUrl = data.jsonObject["baseUrl"]!!.jsonPrimitive.content
val hash = data.jsonObject["hash"]!!.jsonPrimitive.content
/* Available quality levels: source, high, medium, low */
val quality = if(dataSaver) "low" else "high"
return data
.jsonObject[quality]!!
.jsonArray.mapIndexed { index, element ->
val fileName = element.jsonObject["filename"]!!.jsonPrimitive.content
val url = "$baseUrl/chapter/$chapterId/$hash/$quality/$fileName"
Page(index, url, url)
}
}
}

View File

@ -27,6 +27,7 @@ class PageHandler(
private val bilibiliHandler: BilibiliHandler,
private val azukiHandler: AzukiHandler,
private val mangaHotHandler: MangaHotHandler,
private val namicomiHandler: NamicomiHandler,
private val preferences: TrackPreferences,
private val mdList: MdList,
) {
@ -54,6 +55,10 @@ class PageHandler(
chapter.scanlator.equals("mangahot", true) -> mangaHotHandler.fetchPageList(
chapterResponse.data.attributes.externalUrl,
)
chapter.scanlator.equals("namicomi", true) -> namicomiHandler.fetchPageList(
chapterResponse.data.attributes.externalUrl,
dataSaver = dataSaver,
)
else -> throw Exception("${chapter.scanlator} not supported")
}
} else {
@ -122,6 +127,9 @@ class PageHandler(
page.imageUrl?.contains("mangahot", true) == true -> {
mangaHotHandler.client.newCachelessCallWithProgress(GET(page.imageUrl!!, mangaHotHandler.headers), page)
}
page.imageUrl?.contains("namicomi", true) == true -> {
mangaHotHandler.client.newCachelessCallWithProgress(GET(page.imageUrl!!, mangaHotHandler.headers), page)
}
else -> null
}
}