From a9faf70d333ef394d7938623bea69ae054de2b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferm=C3=ADn=20Cirella?= Date: Fri, 12 Jan 2024 12:17:16 -0300 Subject: [PATCH] Anchira - Apply API changes (#180) --- src/en/anchira/build.gradle | 2 +- .../tachiyomi/extension/en/anchira/Anchira.kt | 24 +++++++++---------- .../extension/en/anchira/AnchiraDto.kt | 8 ++++++- .../extension/en/anchira/AnchiraHelper.kt | 6 ++--- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/en/anchira/build.gradle b/src/en/anchira/build.gradle index 8a2f94ffc..f51057a8e 100644 --- a/src/en/anchira/build.gradle +++ b/src/en/anchira/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'Anchira' pkgNameSuffix = 'en.anchira' extClass = '.Anchira' - extVersionCode = 1 + extVersionCode = 2 isNsfw = true } diff --git a/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/Anchira.kt b/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/Anchira.kt index 625c86e42..e7fa091b1 100644 --- a/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/Anchira.kt +++ b/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/Anchira.kt @@ -63,7 +63,7 @@ class Anchira : HttpSource(), ConfigurableSource { override fun latestUpdatesRequest(page: Int) = GET("$libraryUrl?page=$page", headers) override fun latestUpdatesParse(response: Response): MangasPage { - val data = decodeBytes(response.body) + val data = decodeBytes(response.body, anchiraData.key) return MangasPage( data.entries.map { @@ -154,7 +154,7 @@ class Anchira : HttpSource(), ConfigurableSource { GET("$libraryUrl/${getPathFromUrl(manga.url)}", headers) override fun mangaDetailsParse(response: Response): SManga { - val data = decodeBytes(response.body) + val data = decodeBytes(response.body, anchiraData.key) return SManga.create().apply { url = "/g/${data.id}/${data.key}" @@ -171,7 +171,7 @@ class Anchira : HttpSource(), ConfigurableSource { override fun getMangaUrl(manga: SManga) = if (preferences.openSource) { val id = manga.url.split("/").reversed()[1].toInt() - entryExtraData.find { it.id == id }?.url ?: "$baseUrl${manga.url}" + anchiraData.galleries.find { it.id == id }?.url ?: "$baseUrl${manga.url}" } else { "$baseUrl${manga.url}" } @@ -182,7 +182,7 @@ class Anchira : HttpSource(), ConfigurableSource { GET("$libraryUrl/${getPathFromUrl(manga.url)}", headers) override fun chapterListParse(response: Response): List { - val data = decodeBytes(response.body) + val data = decodeBytes(response.body, anchiraData.key) return listOf( SChapter.create().apply { @@ -202,7 +202,7 @@ class Anchira : HttpSource(), ConfigurableSource { GET("$libraryUrl/${getPathFromUrl(chapter.url)}", headers) override fun pageListParse(response: Response): List { - val data = decodeBytes(response.body) + val data = decodeBytes(response.body, anchiraData.key) val imageData = getImageData(data) return data.data.mapIndexed { i, img -> @@ -214,7 +214,7 @@ class Anchira : HttpSource(), ConfigurableSource { } private fun getImageData(entry: Entry): ImageData { - val keys = entryExtraData.find { it.id == entry.id } + val keys = anchiraData.galleries.find { it.id == entry.id } if (keys != null) { return ImageData(keys.id, keys.key, keys.hash) @@ -225,7 +225,7 @@ class Anchira : HttpSource(), ConfigurableSource { client.newCall(GET("$libraryUrl/${entry.id}/${entry.key}/data", headers)).execute() val body = response.body - return decodeBytes(body) + return decodeBytes(body, anchiraData.key) } catch (_: IOException) { throw IOException("Complete a Captcha in the site to continue") } @@ -323,15 +323,15 @@ class Anchira : HttpSource(), ConfigurableSource { it.name == "session" } - private val entryExtraData by lazy { - client.newCall(GET(KEYS_JSON, headers)).execute() - .use { json.decodeFromStream>(it.body.byteStream()) } + private val anchiraData by lazy { + client.newCall(GET(DATA_JSON, headers)).execute() + .use { json.decodeFromStream(it.body.byteStream()) } } companion object { private const val IMAGE_QUALITY_PREF = "image_quality" private const val OPEN_SOURCE_PREF = "use_manga_source" - private const val KEYS_JSON = - "https://gist.githubusercontent.com/LetrixZ/2b559cc5829d1c221c701e02ecd81411/raw/keys.json" + private const val DATA_JSON = + "https://gist.githubusercontent.com/LetrixZ/2b559cc5829d1c221c701e02ecd81411/raw/site_data.json" } } diff --git a/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/AnchiraDto.kt b/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/AnchiraDto.kt index 0055a8340..6ee120caa 100644 --- a/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/AnchiraDto.kt +++ b/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/AnchiraDto.kt @@ -51,9 +51,15 @@ data class ImageData( ) @Serializable -data class ExtraData( +data class EntryKey( val id: Int, val key: String, val hash: String, val url: String?, ) + +@Serializable +data class AnchiraData( + val key: String, + val galleries: List, +) diff --git a/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/AnchiraHelper.kt b/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/AnchiraHelper.kt index 1c809b2e3..13dc3bc92 100644 --- a/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/AnchiraHelper.kt +++ b/src/en/anchira/src/eu/kanade/tachiyomi/extension/en/anchira/AnchiraHelper.kt @@ -7,18 +7,18 @@ import okhttp3.ResponseBody import okio.ByteString.Companion.decodeBase64 object AnchiraHelper { - const val KEY = "ZnVjayBuaWdnZXJzIGFuZCBmYWdnb3RzLCBhbmQgZGVhdGggdG8gYWxsIGpld3M=" + const val KEY = "ZnVja19uaWdnZXJzX2FuZF9mYWdnb3RzLF9hbmRfZGVhdGhfdG9fYWxsX2pld3M=" val json = Json { ignoreUnknownKeys = true } fun getPathFromUrl(url: String) = "${url.split("/").reversed()[1]}/${url.split("/").last()}" - inline fun decodeBytes(body: ResponseBody): T { + inline fun decodeBytes(body: ResponseBody, key: String = KEY): T { val encryptedText = body.string().decodeBase64()!! return json.decodeFromString( XXTEA.decryptToString( encryptedText.toByteArray(), - key = Base64.decode(KEY, Base64.DEFAULT).decodeToString(), + key = Base64.decode(key, Base64.DEFAULT).decodeToString(), )!!, ) }