From 2a3d267721ccd439454f8d29a3f8d063933abde5 Mon Sep 17 00:00:00 2001 From: Joe Milazzo Date: Mon, 17 Apr 2023 08:54:09 -0500 Subject: [PATCH] Kavita API Change for v0.7.1.33+ (#16077) * Updated Kavita to pass apiKey for image apis as this is required in v0.7.1.33+. Non-breaking change for Stable branch users. * Updated Kavita to pass apiKey for image apis as this is required in v0.7.1.33+. Non-breaking change for Stable branch users. * Bumped version number * Updated the Changelog with changes and corrected a dupe version number --- src/all/kavita/CHANGELOG.md | 8 ++++++- src/all/kavita/build.gradle | 2 +- .../tachiyomi/extension/all/kavita/Kavita.kt | 23 ++++++++++++------- .../extension/all/kavita/KavitaHelper.kt | 4 ++-- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/all/kavita/CHANGELOG.md b/src/all/kavita/CHANGELOG.md index 1e2b2d04a..b35d70e64 100644 --- a/src/all/kavita/CHANGELOG.md +++ b/src/all/kavita/CHANGELOG.md @@ -1,4 +1,10 @@ -## 1.3.8 +## 1.3.10 + +### Features + +* API Change for Kavita v0.7.2 + +## 1.3.9 ### Features diff --git a/src/all/kavita/build.gradle b/src/all/kavita/build.gradle index 63872d745..813b399e7 100644 --- a/src/all/kavita/build.gradle +++ b/src/all/kavita/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'Kavita' pkgNameSuffix = 'all.kavita' extClass = '.KavitaFactory' - extVersionCode = 9 + extVersionCode = 10 } dependencies { diff --git a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Kavita.kt b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Kavita.kt index dc0e6361f..a06a1b9bc 100644 --- a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Kavita.kt +++ b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Kavita.kt @@ -106,9 +106,10 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou private val apiUrl by lazy { getPrefApiUrl() } override val baseUrl by lazy { getPrefBaseUrl() } private val address by lazy { getPrefAddress() } // Address for the Kavita OPDS url. Should be http(s)://host:(port)/api/opds/api-key + private val apiKey by lazy { getPrefApiKey() } private var jwtToken = "" // * JWT Token for authentication with the server. Stored in memory. private val LOG_TAG = """extension.all.kavita_${"[$suffix]_" + preferences.getString(KavitaConstants.customSourceNamePref,"[$suffix]")!!.replace(' ','_')}""" - private var isLoged = false // Used to know if login was correct and not send login requests anymore + private var isLogged = false // Used to know if login was correct and not send login requests anymore private val json: Json by injectLazy() private val helper = KavitaHelper() @@ -135,7 +136,7 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou private var series = emptyList() // Acts as a cache override fun popularMangaRequest(page: Int): Request { - if (!isLoged) { + if (!isLogged) { doLogin() } return POST( @@ -149,7 +150,7 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou try { val result = response.parseAs>() series = result - val mangaList = result.map { item -> helper.createSeriesDto(item, apiUrl) } + val mangaList = result.map { item -> helper.createSeriesDto(item, apiUrl, apiKey) } return MangasPage(mangaList, helper.hasNextPage(response)) } catch (e: Exception) { Log.e(LOG_TAG, "Possible outdated kavita", e) @@ -158,7 +159,7 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou } override fun latestUpdatesRequest(page: Int): Request { - if (!isLoged) { + if (!isLogged) { doLogin() } return POST( @@ -378,13 +379,13 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou val existingSeries = series.find { dto -> dto.id == result.seriesId } if (existingSeries != null) { - val manga = helper.createSeriesDto(existingSeries, apiUrl) + val manga = helper.createSeriesDto(existingSeries, apiUrl, apiKey) manga.url = "$apiUrl/Series/${result.seriesId}" manga.artist = result.coverArtists.joinToString { it.name } manga.description = result.summary manga.author = result.writers.joinToString { it.name } manga.genre = result.genres.joinToString { it.title } - manga.thumbnail_url = "$apiUrl/image/series-cover?seriesId=${result.seriesId}" + manga.thumbnail_url = "$apiUrl/image/series-cover?seriesId=${result.seriesId}&apiKey=$apiKey" return manga } @@ -504,7 +505,7 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou pages.add( Page( index = i, - imageUrl = "$apiUrl/Reader/image?chapterId=$chapterId&page=$i&extractPdf=true", + imageUrl = "$apiUrl/Reader/image?chapterId=$chapterId&page=$i&extractPdf=true&apiKey=$apiKey", ), ) } @@ -1045,6 +1046,12 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou return path } + private fun getPrefApiKey(): String { + // http(s)://host:(port)/api/opds/api-key + var existingKey = preferences.getString("APIKEY", "") + return existingKey!!.ifEmpty { preferences.getString(ADDRESS_TITLE, "")!!.split("/opds/")[1] } + } + companion object { private const val ADDRESS_TITLE = "Address" private val JSON_MEDIA_TYPE = "application/json; charset=utf-8".toMediaTypeOrNull() @@ -1119,7 +1126,7 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou if (it.code == 200) { try { jwtToken = it.parseAs().token - isLoged = true + isLogged = true } catch (e: Exception) { Log.e(LOG_TAG, "Possible outdated kavita", e) throw IOException("Please check your kavita version.\nv0.5+ is required for the extension to work properly") diff --git a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/KavitaHelper.kt b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/KavitaHelper.kt index afe2caee0..1e06e5760 100644 --- a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/KavitaHelper.kt +++ b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/KavitaHelper.kt @@ -38,11 +38,11 @@ class KavitaHelper { return url.split("/").last().toInt() } - fun createSeriesDto(obj: SeriesDto, baseUrl: String): SManga = + fun createSeriesDto(obj: SeriesDto, baseUrl: String, apiKey: String): SManga = SManga.create().apply { url = "$baseUrl/Series/${obj.id}" title = obj.name // Deprecated: description = obj.summary - thumbnail_url = "$baseUrl/image/series-cover?seriesId=${obj.id}" + thumbnail_url = "$baseUrl/image/series-cover?seriesId=${obj.id}&apiKey=$apiKey" } }