From 140cfa47947c37755efa0ffe22cc7b0ed5105fb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20Franti=C5=A1ek=20Straka?= Date: Sun, 28 Jul 2024 23:50:30 +0200 Subject: [PATCH 1/3] Added custom keys functionality with preferences --- .../animeextension/en/nineanime/Aniwave.kt | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt index 355ebe15..7b4165a9 100644 --- a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt +++ b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt @@ -312,6 +312,22 @@ class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } } + private fun getDecryptionKey(): String { + var prefKey = preferences.getString(PREF_VERIFY_KEY_DECRYPT_KEY, null) + if (prefKey.isNullOrBlank()) { + prefKey = PREF_VERIFY_KEY_DECRYPT_VALUE + } + return prefKey + } + + private fun getEncryptionKey(): String { + var prefKey = preferences.getString(PREF_VERIFY_KEY_ENCRYPT_KEY, null) + if (prefKey.isNullOrBlank()) { + prefKey = PREF_VERIFY_KEY_ENCRYPT_VALUE + } + return prefKey + } + companion object { private val SOFTSUB_REGEX by lazy { Regex("""\bsoftsub\b""", RegexOption.IGNORE_CASE) } private val RELEASE_REGEX by lazy { Regex("""Release: (\d+\/\d+\/\d+ \d+:\d+)""") } @@ -355,6 +371,13 @@ class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { private const val PREF_TYPE_TOGGLE_KEY = "type_selection" private val TYPES = arrayOf("Sub", "Softsub", "Dub") private val PREF_TYPES_TOGGLE_DEFAULT = TYPES.toSet() + + // https://rowdy-avocado.github.io/multi-keys/ + private const val PREF_VERIFY_KEY_DECRYPT_KEY = "verify_key_decrypt" + private const val PREF_VERIFY_KEY_DECRYPT_VALUE = "ctpAbOz5u7S6OMkx" + + private const val PREF_VERIFY_KEY_ENCRYPT_KEY = "verify_key_encrypt" + private const val PREF_VERIFY_KEY_ENCRYPT_VALUE = "p01EDKu734HJP1Tm" } // ============================== Settings ============================== @@ -460,5 +483,29 @@ class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { preferences.edit().putStringSet(key, newValue as Set).commit() } }.also(screen::addPreference) + + EditTextPreference(screen.context).apply { + key = PREF_VERIFY_KEY_DECRYPT_KEY + title = "Custom decryption key" + setDefaultValue("") + + setOnPreferenceChangeListener { _, newValue -> + @Suppress("UNCHECKED_CAST") + val newKey = newValue as String + preferences.edit().putString(key, newKey).commit() + } + }.also(screen::addPreference) + + EditTextPreference(screen.context).apply { + key = PREF_VERIFY_KEY_ENCRYPT_KEY + title = "Custom encryption key" + setDefaultValue("") + + setOnPreferenceChangeListener { _, newValue -> + @Suppress("UNCHECKED_CAST") + val newKey = newValue as String + preferences.edit().putString(key, newKey).commit() + } + }.also(screen::addPreference) } } -- 2.47.2 From 1d9344a26a5261972489b800d30ca08164b587ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20Franti=C5=A1ek=20Straka?= Date: Sun, 28 Jul 2024 23:52:14 +0200 Subject: [PATCH 2/3] changed encryption and decryption utils --- .../animeextension/en/nineanime/Aniwave.kt | 19 ++++---- .../en/nineanime/AniwaveUtils.kt | 43 +++---------------- 2 files changed, 17 insertions(+), 45 deletions(-) diff --git a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt index 7b4165a9..7d36e8fb 100644 --- a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt +++ b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.animeextension.en.nineanime import android.app.Application import android.content.SharedPreferences import android.widget.Toast +import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.MultiSelectListPreference import androidx.preference.PreferenceScreen @@ -89,7 +90,7 @@ class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { val filters = AniwaveFilters.getSearchParameters(filters) - val vrf = if (query.isNotBlank()) utils.vrfEncrypt(query) else "" + val vrf = if (query.isNotBlank()) utils.vrfEncrypt(getEncryptionKey(), query) else "" var url = "$baseUrl/filter?keyword=$query" if (filters.genre.isNotBlank()) url += filters.genre @@ -101,7 +102,7 @@ class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { if (filters.language.isNotBlank()) url += filters.language if (filters.rating.isNotBlank()) url += filters.rating - return GET("$url&sort=${filters.sort}&page=$page&$vrf", refererHeaders) + return GET("$url&sort=${filters.sort}&page=$page&vrf=$vrf", refererHeaders) } override fun searchAnimeSelector(): String = popularAnimeSelector() @@ -139,7 +140,7 @@ class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun episodeListRequest(anime: SAnime): Request { val id = client.newCall(GET(baseUrl + anime.url)).execute().asJsoup() .selectFirst("div[data-id]")!!.attr("data-id") - val vrf = utils.vrfEncrypt(id) + val vrf = utils.vrfEncrypt(getEncryptionKey(), id) val listHeaders = headers.newBuilder().apply { add("Accept", "application/json, text/javascript, */*; q=0.01") @@ -147,7 +148,7 @@ class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { add("X-Requested-With", "XMLHttpRequest") }.build() - return GET("$baseUrl/ajax/episode/list/$id?$vrf#${anime.url}", listHeaders) + return GET("$baseUrl/ajax/episode/list/$id?vrf=$vrf#${anime.url}", listHeaders) } override fun episodeListSelector() = "div.episodes ul > li > a" @@ -195,8 +196,8 @@ class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun videoListRequest(episode: SEpisode): Request { val ids = episode.url.substringBefore("&") - val vrf = utils.vrfEncrypt(ids) - val url = "/ajax/server/list/$ids?$vrf" + val vrf = utils.vrfEncrypt(getEncryptionKey(), ids) + val url = "/ajax/server/list/$ids?vrf=$vrf" val epurl = episode.url.substringAfter("epurl=") val listHeaders = headers.newBuilder().apply { @@ -248,7 +249,7 @@ class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { private val mp4uploadExtractor by lazy { Mp4uploadExtractor(client) } private fun extractVideo(server: VideoData, epUrl: String): List