From f2b1f92502b044c6937b237854b90594be3bdc35 Mon Sep 17 00:00:00 2001 From: dngonz Date: Sun, 5 Oct 2025 21:48:26 +0200 Subject: [PATCH] Kagane: FIx search and added data saver (#10904) * fix search * fix open in webview * add data saver feature * bump * fix popular and latest filter --- src/en/kagane/build.gradle | 2 +- .../tachiyomi/extension/en/kagane/Kagane.kt | 38 +++++++++++++++---- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/en/kagane/build.gradle b/src/en/kagane/build.gradle index 10b67a424..f87f84378 100644 --- a/src/en/kagane/build.gradle +++ b/src/en/kagane/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Kagane' extClass = '.Kagane' - extVersionCode = 2 + extVersionCode = 3 isNsfw = true } diff --git a/src/en/kagane/src/eu/kanade/tachiyomi/extension/en/kagane/Kagane.kt b/src/en/kagane/src/eu/kanade/tachiyomi/extension/en/kagane/Kagane.kt index 7f0ff44a5..ffa45fe56 100644 --- a/src/en/kagane/src/eu/kanade/tachiyomi/extension/en/kagane/Kagane.kt +++ b/src/en/kagane/src/eu/kanade/tachiyomi/extension/en/kagane/Kagane.kt @@ -138,13 +138,13 @@ class Kagane : HttpSource(), ConfigurableSource { // ============================== Popular =============================== - override fun popularMangaRequest(page: Int) = searchMangaRequest(page, "", FilterList()) + override fun popularMangaRequest(page: Int) = searchMangaRequest(page, "", FilterList(SortFilter(0))) override fun popularMangaParse(response: Response) = searchMangaParse(response) // =============================== Latest =============================== override fun latestUpdatesRequest(page: Int) = - searchMangaRequest(page, "", FilterList(SortFilter(0))) + searchMangaRequest(page, "", FilterList(SortFilter(1))) override fun latestUpdatesParse(response: Response) = searchMangaParse(response) @@ -165,7 +165,9 @@ class Kagane : HttpSource(), ConfigurableSource { filters.forEach { filter -> when (filter) { is SortFilter -> { - addQueryParameter("sort", filter.toUriPart()) + filter.selected?.let { + addQueryParameter("sort", filter.toUriPart()) + } } else -> {} @@ -193,6 +195,10 @@ class Kagane : HttpSource(), ConfigurableSource { return GET("$apiUrl/api/v1/series/${manga.url}", apiHeaders) } + override fun getMangaUrl(manga: SManga): String { + return "$baseUrl/series/${manga.url}" + } + // ============================== Chapters ============================== override fun chapterListParse(response: Response): List { @@ -218,11 +224,14 @@ class Kagane : HttpSource(), ConfigurableSource { } override fun fetchPageList(chapter: SChapter): Observable> { - val (seriesId, chapterId) = chapter.url.split(";") + var (seriesId, chapterId) = chapter.url.split(";") val challengeResp = getChallengeResponse(seriesId, chapterId) accessToken = challengeResp.accessToken val pageCount = getPageCountResponse(seriesId, chapterId) + if (preferences.dataSaver) { + chapterId = chapterId + "_ds" + } val pages = (0 until pageCount).map { page -> val pageUrl = "$apiUrl/api/v1/books".toHttpUrl().newBuilder().apply { addPathSegment(seriesId) @@ -341,12 +350,16 @@ class Kagane : HttpSource(), ConfigurableSource { throw Exception("Failed to get drm challenge") } - val challengeUrl = "$apiUrl/api/v1/books/$seriesId/file/$chapterId" + val challengeUrl = "$apiUrl/api/v1/books/$seriesId/file/$chapterId".toHttpUrl().newBuilder().apply { + if (preferences.dataSaver) { + addQueryParameter("datasaver", true.toString()) + } + }.build() val challengeBody = buildJsonObject { put("challenge", jsInterface.challenge) }.toJsonString().toRequestBody("application/json".toMediaType()) - return client.newCall(POST(challengeUrl, apiHeaders, challengeBody)).execute() + return client.newCall(POST(challengeUrl.toString(), apiHeaders, challengeBody)).execute() .parseAs() } @@ -370,7 +383,8 @@ class Kagane : HttpSource(), ConfigurableSource { val s = ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putInt(i.size).array() val innerBox = concat(zeroes, e, s, i) - val outerSize = ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putInt(innerBox.size + 8).array() + val outerSize = + ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putInt(innerBox.size + 8).array() val psshHeader = "pssh".toByteArray(StandardCharsets.UTF_8) return concat(outerSize, psshHeader, innerBox) @@ -403,6 +417,8 @@ class Kagane : HttpSource(), ConfigurableSource { private val SharedPreferences.showNsfw get() = this.getBoolean(SHOW_NSFW_KEY, true) + private val SharedPreferences.dataSaver + get() = this.getBoolean(DATA_SAVER, true) override fun setupPreferenceScreen(screen: PreferenceScreen) { SwitchPreferenceCompat(screen.context).apply { @@ -410,12 +426,18 @@ class Kagane : HttpSource(), ConfigurableSource { title = "Show nsfw entries" setDefaultValue(true) }.let(screen::addPreference) + SwitchPreferenceCompat(screen.context).apply { + key = DATA_SAVER + title = "Data saver" + setDefaultValue(true) + }.let(screen::addPreference) } // ============================= Utilities ============================== companion object { private const val SHOW_NSFW_KEY = "pref_show_nsfw" + private const val DATA_SAVER = "data_saver" } // ============================= Filters ============================== @@ -427,6 +449,7 @@ class Kagane : HttpSource(), ConfigurableSource { class SortFilter(state: Int = 0) : UriPartFilter( "Sort By", arrayOf( + Pair("Relevance", ""), Pair("Latest", "updated_at"), Pair("Latest Descending", "updated_at,desc"), Pair("By Name", "series_name"), @@ -445,5 +468,6 @@ class Kagane : HttpSource(), ConfigurableSource { state: Int = 0, ) : Filter.Select(displayName, vals.map { it.first }.toTypedArray(), state) { fun toUriPart() = vals[state].second + val selected get() = vals[state].second.takeUnless { it.isEmpty() } } }