android support! thanks to TachiWeb devs.
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
package xyz.nulldev.ts.config
|
||||
|
||||
import org.kodein.di.DI
|
||||
import org.kodein.di.bind
|
||||
import org.kodein.di.singleton
|
||||
|
||||
class ConfigKodeinModule {
|
||||
fun create() = DI.Module("ConfigManager") {
|
||||
//Config module
|
||||
bind<ConfigManager>() with singleton { GlobalConfigManager }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package xyz.nulldev.ts.config
|
||||
|
||||
import com.typesafe.config.Config
|
||||
import com.typesafe.config.ConfigFactory
|
||||
import com.typesafe.config.ConfigRenderOptions
|
||||
import mu.KotlinLogging
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
* Manages app config.
|
||||
*/
|
||||
open class ConfigManager {
|
||||
private val generatedModules
|
||||
= mutableMapOf<Class<out ConfigModule>, ConfigModule>()
|
||||
val config by lazy { loadConfigs() }
|
||||
|
||||
//Public read-only view of modules
|
||||
val loadedModules: Map<Class<out ConfigModule>, ConfigModule>
|
||||
get() = generatedModules
|
||||
|
||||
open val configFolder: String
|
||||
get() = System.getProperty("compat-configdirs") ?: "tachiserver-data/config"
|
||||
|
||||
val logger = KotlinLogging.logger {}
|
||||
|
||||
/**
|
||||
* Get a config module
|
||||
*/
|
||||
inline fun <reified T : ConfigModule> module(): T
|
||||
= loadedModules[T::class.java] as T
|
||||
|
||||
/**
|
||||
* Get a config module (Java API)
|
||||
*/
|
||||
fun <T : ConfigModule> module(type: Class<T>): T
|
||||
= loadedModules[type] as T
|
||||
|
||||
/**
|
||||
* Load configs
|
||||
*/
|
||||
fun loadConfigs(): Config {
|
||||
val configs = mutableListOf<Config>()
|
||||
|
||||
//Load reference config
|
||||
configs += ConfigFactory.parseResources("reference.conf")
|
||||
|
||||
//Load custom configs from dir
|
||||
File(configFolder).listFiles()?.map {
|
||||
ConfigFactory.parseFile(it)
|
||||
}?.filterNotNull()?.forEach {
|
||||
configs += it.withFallback(configs.last())
|
||||
}
|
||||
|
||||
val config = configs.last().resolve()
|
||||
|
||||
logger.debug {
|
||||
"Loaded config:\n" + config.root().render(ConfigRenderOptions.concise().setFormatted(true))
|
||||
}
|
||||
|
||||
return config
|
||||
}
|
||||
|
||||
fun registerModule(module: ConfigModule) {
|
||||
generatedModules.put(module.javaClass, module)
|
||||
}
|
||||
|
||||
fun registerModules(vararg modules: ConfigModule) {
|
||||
modules.forEach {
|
||||
registerModule(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object GlobalConfigManager : ConfigManager()
|
||||
@@ -0,0 +1,8 @@
|
||||
package xyz.nulldev.ts.config
|
||||
|
||||
import com.typesafe.config.Config
|
||||
|
||||
/**
|
||||
* Abstract config module.
|
||||
*/
|
||||
abstract class ConfigModule(config: Config)
|
||||
@@ -0,0 +1,35 @@
|
||||
package xyz.nulldev.ts.config
|
||||
|
||||
import com.typesafe.config.Config
|
||||
import java.io.File
|
||||
|
||||
class ServerConfig(config: Config) : ConfigModule(config) {
|
||||
val ip = config.getString("ip")
|
||||
val port = config.getInt("port")
|
||||
|
||||
val allowConfigChanges = config.getBoolean("allowConfigChanges")
|
||||
val enableWebUi = config.getBoolean("enableWebUi")
|
||||
val useOldWebUi = config.getBoolean("useOldWebUi")
|
||||
val prettyPrintApi = config.getBoolean("prettyPrintApi")
|
||||
// TODO Apply to operation IDs
|
||||
val disabledApiEndpoints = config.getStringList("disabledApiEndpoints").map(String::toLowerCase)
|
||||
val enabledApiEndpoints = config.getStringList("enabledApiEndpoints").map(String::toLowerCase)
|
||||
val httpInitializedPrintMessage = config.getString("httpInitializedPrintMessage")
|
||||
|
||||
val useExternalStaticFiles = config.getBoolean("useExternalStaticFiles")
|
||||
val externalStaticFilesFolder = config.getString("externalStaticFilesFolder")
|
||||
|
||||
val rootDir = registerFile(config.getString("rootDir"))
|
||||
val patchesDir = registerFile(config.getString("patchesDir"))
|
||||
|
||||
fun registerFile(file: String): File {
|
||||
return File(file).apply {
|
||||
mkdirs()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun register(config: Config)
|
||||
= ServerConfig(config.getConfig("ts.server"))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package xyz.nulldev.ts.config.util
|
||||
|
||||
import com.typesafe.config.Config
|
||||
|
||||
operator fun Config.get(key: String) = getString(key)
|
||||
?: throw IllegalStateException("Could not find value for config entry: $key!")
|
||||
+1
@@ -0,0 +1 @@
|
||||
xyz.nulldev.ts.api.v2.java.impl.ServerAPIImpl
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 6.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
File diff suppressed because one or more lines are too long
@@ -0,0 +1,22 @@
|
||||
[
|
||||
{
|
||||
"label": "Sync",
|
||||
"icon": "import_export",
|
||||
"type": "nested",
|
||||
"prefs": []
|
||||
},
|
||||
{
|
||||
"label": "Server",
|
||||
"icon": "dns",
|
||||
"type": "nested",
|
||||
"prefs": [
|
||||
{
|
||||
"label": "Password authentication",
|
||||
"type": "text-password",
|
||||
"default": "",
|
||||
"key": "pref_ts_server_password",
|
||||
"hint": "Enter a password"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,87 @@
|
||||
# Server ip and port bindings
|
||||
ts.server.ip = 0.0.0.0
|
||||
ts.server.port = 4567
|
||||
|
||||
# Allow/disallow preference changes (useful for demos)
|
||||
ts.server.allowConfigChanges = true
|
||||
|
||||
# Enable the WebUI? Note: The API and multi-user sync server ui will remain available even if the WebUI is disabled
|
||||
ts.server.enableWebUi = true
|
||||
|
||||
# 'true' to use the old, buggy/memory-leaking WebUI
|
||||
ts.server.useOldWebUi = false
|
||||
|
||||
# 'true' to pretty print all JSON API responses
|
||||
ts.server.prettyPrintApi = false
|
||||
|
||||
# List of blacklisted/whitelisted API endpoints/operation IDs
|
||||
ts.server.disabledApiEndpoints = []
|
||||
ts.server.enabledApiEndpoints = []
|
||||
|
||||
# Message to print in the console when the API has finished booting
|
||||
ts.server.httpInitializedPrintMessage = ""
|
||||
|
||||
# Use external folder for static files
|
||||
ts.server.useExternalStaticFiles = false
|
||||
ts.server.externalStaticFilesFolder = ""
|
||||
|
||||
# Root storage dir
|
||||
ts.server.rootDir = tachiserver-data
|
||||
# Dir to store JVM patches
|
||||
ts.server.patchesDir = ${ts.server.rootDir}/patches
|
||||
|
||||
# Storage dir for the emulated Android app
|
||||
android.files.rootDir = ${ts.server.rootDir}/android-compat/appdata
|
||||
# External storage dir for the emulated Android app's
|
||||
android.files.externalStorageDir = ${ts.server.rootDir}/android-compat/extappdata
|
||||
|
||||
# Internal Android directories
|
||||
android.files.dataDir = ${android.files.rootDir}/data
|
||||
android.files.filesDir = ${android.files.rootDir}/files
|
||||
android.files.cacheDir = ${android.files.rootDir}/cache
|
||||
android.files.codeCacheDir = ${android.files.rootDir}/code_cache
|
||||
android.files.noBackupFilesDir = ${android.files.rootDir}/no_backup
|
||||
android.files.databasesDir = ${android.files.rootDir}/databases
|
||||
android.files.prefsDir = ${android.files.rootDir}/shared_prefs
|
||||
|
||||
# External Android directories
|
||||
android.files.externalFilesDirs = [${android.files.externalStorageDir}/files]
|
||||
android.files.obbDirs = [${android.files.externalStorageDir}/obb]
|
||||
android.files.externalCacheDirs = [${android.files.externalStorageDir}/cache]
|
||||
android.files.externalMediaDirs = [${android.files.externalStorageDir}/media]
|
||||
android.files.downloadCacheDir = ${android.files.externalStorageDir}/downloadCache
|
||||
|
||||
android.files.packageDir = ${ts.server.rootDir}/android-compat/packages
|
||||
|
||||
# Emulated Android app package name
|
||||
android.app.packageName = eu.kanade.tachiyomi
|
||||
# Debug mode for the emulated Android app
|
||||
android.app.debug = true
|
||||
|
||||
# Whether or not the emulated Android system is debuggable
|
||||
android.system.isDebuggable = true
|
||||
|
||||
# Is the multi-user sync server enabled? Does not affect the single-user sync server included in the API.
|
||||
ts.syncd.enable = false
|
||||
|
||||
# The URL of this server (displayed in the sync server web ui)
|
||||
ts.syncd.baseUrl = "http://example.com"
|
||||
|
||||
# 'true' to disable the API and only enable the multi-user sync server
|
||||
ts.syncd.syncOnlyMode = false
|
||||
|
||||
# The root directory to store synchronized data
|
||||
ts.syncd.rootDir = ${ts.server.rootDir}/sync/accounts
|
||||
|
||||
# Location to store config files for the sandbox
|
||||
ts.syncd.sandboxedConfig = ${ts.server.rootDir}/sync/sandboxed_config.config
|
||||
|
||||
# Recaptcha stuff for signup/login
|
||||
ts.syncd.recaptcha.siteKey = ""
|
||||
ts.syncd.recaptcha.secret = ""
|
||||
|
||||
# Sync server display name
|
||||
ts.syncd.name = "Tachiyomi sync server"
|
||||
|
||||
# Header used to forward the IP to the multi-user sync server if the server is behind a reverse proxy
|
||||
ts.syncd.ipHeader = ""
|
||||
Reference in New Issue
Block a user