Add basic auth support for Tachidesk (#11477)
* add basic auth support * update version * refactored settings load * wrong var in pair * Update src/all/tachidesk/src/eu/kanade/tachiyomi/extension/all/tachidesk/Tachidesk.kt Co-authored-by: Alessandro Jean <14254807+alessandrojean@users.noreply.github.com> * use kotlin forEach * refactor headersBuilder to use credentials * removed credentials() Co-authored-by: Alessandro Jean <14254807+alessandrojean@users.noreply.github.com>
This commit is contained in:
parent
e0c8110894
commit
caa4b81c64
|
@ -6,7 +6,7 @@ ext {
|
||||||
extName = 'Tachidesk'
|
extName = 'Tachidesk'
|
||||||
pkgNameSuffix = 'all.tachidesk'
|
pkgNameSuffix = 'all.tachidesk'
|
||||||
extClass = '.Tachidesk'
|
extClass = '.Tachidesk'
|
||||||
extVersionCode = 3
|
extVersionCode = 4
|
||||||
isNsfw = true
|
isNsfw = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@ import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import kotlinx.serialization.decodeFromString
|
import kotlinx.serialization.decodeFromString
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
|
import okhttp3.Credentials
|
||||||
|
import okhttp3.Headers
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
|
@ -28,20 +30,29 @@ import rx.schedulers.Schedulers
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
import java.lang.RuntimeException
|
|
||||||
|
|
||||||
class Tachidesk : ConfigurableSource, HttpSource() {
|
class Tachidesk : ConfigurableSource, HttpSource() {
|
||||||
override val name = "Tachidesk"
|
override val name = "Tachidesk"
|
||||||
override val baseUrl by lazy { getPrefBaseUrl() }
|
override val baseUrl by lazy { getPrefBaseUrl() }
|
||||||
|
private val baseLogin by lazy { getPrefBaseLogin() }
|
||||||
|
private val basePassword by lazy { getPrefBasePassword() }
|
||||||
|
|
||||||
override val lang = "en"
|
override val lang = "en"
|
||||||
override val supportsLatest = false
|
override val supportsLatest = false
|
||||||
|
|
||||||
private val json: Json by injectLazy()
|
private val json: Json by injectLazy()
|
||||||
|
|
||||||
|
override fun headersBuilder(): Headers.Builder = Headers.Builder().apply {
|
||||||
|
if (basePassword.isNotEmpty() && baseLogin.isNotEmpty()) {
|
||||||
|
val credentials = Credentials.basic(baseLogin, basePassword)
|
||||||
|
add("Authorization", credentials)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ------------- Popular Manga -------------
|
// ------------- Popular Manga -------------
|
||||||
|
|
||||||
override fun popularMangaRequest(page: Int): Request =
|
override fun popularMangaRequest(page: Int): Request =
|
||||||
GET("$checkedBaseUrl/api/v1/category/$defaultCategoryId")
|
GET("$checkedBaseUrl/api/v1/category/$defaultCategoryId", headers)
|
||||||
|
|
||||||
override fun popularMangaParse(response: Response): MangasPage =
|
override fun popularMangaParse(response: Response): MangasPage =
|
||||||
MangasPage(
|
MangasPage(
|
||||||
|
@ -53,7 +64,7 @@ class Tachidesk : ConfigurableSource, HttpSource() {
|
||||||
// ------------- Manga Details -------------
|
// ------------- Manga Details -------------
|
||||||
|
|
||||||
override fun mangaDetailsRequest(manga: SManga) =
|
override fun mangaDetailsRequest(manga: SManga) =
|
||||||
GET("$checkedBaseUrl/api/v1/manga/${manga.url}/?onlineFetch=true")
|
GET("$checkedBaseUrl/api/v1/manga/${manga.url}/?onlineFetch=true", headers)
|
||||||
|
|
||||||
override fun mangaDetailsParse(response: Response): SManga =
|
override fun mangaDetailsParse(response: Response): SManga =
|
||||||
json.decodeFromString<MangaDataClass>(response.body!!.string()).let { it.toSManga() }
|
json.decodeFromString<MangaDataClass>(response.body!!.string()).let { it.toSManga() }
|
||||||
|
@ -124,11 +135,28 @@ class Tachidesk : ConfigurableSource, HttpSource() {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
// ------------- Images -------------
|
||||||
val initBaseUrl = Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000).getString(ADDRESS_TITLE, ADDRESS_DEFAULT)!!
|
override fun imageRequest(page: Page) = GET(page.imageUrl!!, headers)
|
||||||
|
|
||||||
if (initBaseUrl.isNotBlank()) {
|
// ------------- Settings -------------
|
||||||
refreshCategoryList(initBaseUrl)
|
|
||||||
|
private val preferences: SharedPreferences by lazy {
|
||||||
|
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
val preferencesMap = mapOf(
|
||||||
|
ADDRESS_TITLE to ADDRESS_DEFAULT,
|
||||||
|
LOGIN_TITLE to LOGIN_DEFAULT,
|
||||||
|
PASSWORD_TITLE to PASSWORD_DEFAULT
|
||||||
|
)
|
||||||
|
|
||||||
|
preferencesMap.forEach { (key, defaultValue) ->
|
||||||
|
val initBase = preferences.getString(key, defaultValue)!!
|
||||||
|
|
||||||
|
if (initBase.isNotBlank()) {
|
||||||
|
refreshCategoryList(initBase)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,7 +182,7 @@ class Tachidesk : ConfigurableSource, HttpSource() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return GET("$checkedBaseUrl/api/v1/category/$selectedFilter")
|
return GET("$checkedBaseUrl/api/v1/category/$selectedFilter", headers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,15 +190,17 @@ class Tachidesk : ConfigurableSource, HttpSource() {
|
||||||
|
|
||||||
// ------------- Preferences -------------
|
// ------------- Preferences -------------
|
||||||
override fun setupPreferenceScreen(screen: PreferenceScreen) {
|
override fun setupPreferenceScreen(screen: PreferenceScreen) {
|
||||||
screen.addPreference(screen.editTextPreference(ADDRESS_TITLE, ADDRESS_DEFAULT, baseUrl))
|
screen.addPreference(screen.editTextPreference(ADDRESS_TITLE, ADDRESS_DEFAULT, baseUrl, false, "i.e. http://192.168.1.115:4567"))
|
||||||
|
screen.addPreference(screen.editTextPreference(LOGIN_TITLE, LOGIN_DEFAULT, baseLogin, false, ""))
|
||||||
|
screen.addPreference(screen.editTextPreference(PASSWORD_TITLE, PASSWORD_DEFAULT, basePassword, true, ""))
|
||||||
}
|
}
|
||||||
|
|
||||||
/** boilerplate for [EditTextPreference] */
|
/** boilerplate for [EditTextPreference] */
|
||||||
private fun PreferenceScreen.editTextPreference(title: String, default: String, value: String, isPassword: Boolean = false): EditTextPreference {
|
private fun PreferenceScreen.editTextPreference(title: String, default: String, value: String, isPassword: Boolean = false, placeholder: String): EditTextPreference {
|
||||||
return EditTextPreference(context).apply {
|
return EditTextPreference(context).apply {
|
||||||
key = title
|
key = title
|
||||||
this.title = title
|
this.title = title
|
||||||
summary = if (value.isEmpty()) "i.e. http://192.168.1.115:4567" else value
|
summary = value.ifEmpty { placeholder }
|
||||||
this.setDefaultValue(default)
|
this.setDefaultValue(default)
|
||||||
dialogTitle = title
|
dialogTitle = title
|
||||||
|
|
||||||
|
@ -193,15 +223,17 @@ class Tachidesk : ConfigurableSource, HttpSource() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val preferences: SharedPreferences by lazy {
|
|
||||||
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getPrefBaseUrl(): String = preferences.getString(ADDRESS_TITLE, ADDRESS_DEFAULT)!!
|
private fun getPrefBaseUrl(): String = preferences.getString(ADDRESS_TITLE, ADDRESS_DEFAULT)!!
|
||||||
|
private fun getPrefBaseLogin(): String = preferences.getString(LOGIN_TITLE, LOGIN_DEFAULT)!!
|
||||||
|
private fun getPrefBasePassword(): String = preferences.getString(PASSWORD_TITLE, PASSWORD_DEFAULT)!!
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val ADDRESS_TITLE = "Server URL Address"
|
private const val ADDRESS_TITLE = "Server URL Address"
|
||||||
private const val ADDRESS_DEFAULT = ""
|
private const val ADDRESS_DEFAULT = ""
|
||||||
|
private const val LOGIN_TITLE = "Login (Basic Auth)"
|
||||||
|
private const val LOGIN_DEFAULT = ""
|
||||||
|
private const val PASSWORD_TITLE = "Password (Basic Auth)"
|
||||||
|
private const val PASSWORD_DEFAULT = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------- Not Used -------------
|
// ------------- Not Used -------------
|
||||||
|
@ -240,6 +272,5 @@ class Tachidesk : ConfigurableSource, HttpSource() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private val checkedBaseUrl: String
|
private val checkedBaseUrl: String
|
||||||
get(): String = if (baseUrl.isNotEmpty()) baseUrl
|
get(): String = baseUrl.ifEmpty { throw RuntimeException("Set Tachidesk server url in extension settings") }
|
||||||
else throw RuntimeException("Set Tachidesk server url in extension settings")
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue