diff --git a/src/ru/comx/build.gradle b/src/ru/comx/build.gradle index 71f936347..28820ddd8 100644 --- a/src/ru/comx/build.gradle +++ b/src/ru/comx/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Com-X' extClass = '.ComX' - extVersionCode = 30 + extVersionCode = 31 } apply from: "$rootDir/common.gradle" diff --git a/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt b/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt index 11f356833..4cd522321 100644 --- a/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt +++ b/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt @@ -1,10 +1,14 @@ package eu.kanade.tachiyomi.extension.ru.comx +import android.content.SharedPreferences import android.webkit.CookieManager +import android.widget.Toast +import androidx.preference.EditTextPreference import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.asObservable import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage @@ -13,6 +17,7 @@ import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup +import keiyoushi.utils.getPreferencesLazy import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject @@ -27,7 +32,6 @@ import okhttp3.FormBody import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.Jsoup @@ -40,19 +44,24 @@ import java.text.SimpleDateFormat import java.util.Locale import java.util.concurrent.TimeUnit -class ComX : ParsedHttpSource() { - +class ComX : ParsedHttpSource(), ConfigurableSource { private val json: Json by injectLazy() + override val id = 1114173092141608635 + override val name = "Com-X" - override val baseUrl = "https://com-x.life" + private val preferences: SharedPreferences by getPreferencesLazy() + + override val baseUrl = preferences.getString(DOMAIN_PREF, DOMAIN_DEFAULT)!! override val lang = "ru" override val supportsLatest = true + private val cookieManager by lazy { CookieManager.getInstance() } - override val client: OkHttpClient = network.cloudflareClient.newBuilder() + + override val client = network.cloudflareClient.newBuilder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .rateLimit(3) @@ -337,16 +346,21 @@ class ComX : ParsedHttpSource() { throw Exception("Комикс 18+ (что-то сломалось)") } - val baseImgUrl = "https://img.com-x.life/comix/" + val imageUrl = preferences.getString(FORCE_IMG_DOMAIN_PREF, null)?.ifBlank { null } + ?: IMG_DOMAIN_REGEX.find(html)?.groupValues?.get(1)?.let { "https://$it" } + + if (imageUrl.isNullOrBlank()) { + throw Exception("Не удалось определить домен картинок. Попробуйте задать вручную в настройках") + } val beginTag = "\"images\":[" val beginIndex = html.indexOf(beginTag) val endIndex = html.indexOf("]", beginIndex) - val urls: List = html.substring(beginIndex + beginTag.length, endIndex) + val urls = html.substring(beginIndex + beginTag.length, endIndex) .split(',').map { val img = it.replace("\\", "").replace("\"", "") - baseImgUrl + img + "$imageUrl/comix/$img" } val pages = mutableListOf() @@ -399,18 +413,18 @@ class ComX : ParsedHttpSource() { override fun getFilterList() = FilterList( OrderBy(), - PubList(getPubList()), - GenreList(getGenreList()), - TypeList(getTypeList()), - AgeList(getAgeList()), + PubList(pubList), + GenreList(genreList), + TypeList(typeList), + AgeList(ageList), ) - private fun getAgeList() = listOf( + private val ageList = listOf( CheckFilter("Для всех", "1"), CheckFilter("18+", "2"), ) - private fun getTypeList() = listOf( + private val typeList = listOf( CheckFilter("События в комиксах", "1"), CheckFilter("Аннуалы", "3"), CheckFilter("Артбук", "4"), @@ -430,7 +444,7 @@ class ComX : ParsedHttpSource() { CheckFilter("Энциклопедия", "36"), ) - private fun getPubList() = listOf( + private val pubList = listOf( CheckFilter("Манга", "3"), CheckFilter("Маньхуа", "45"), CheckFilter("Манхва", "44"), @@ -453,7 +467,7 @@ class ComX : ParsedHttpSource() { CheckFilter("Zenescope", "51"), ) - private fun getGenreList() = listOf( + private val genreList = listOf( CheckFilter("Автобиографическая новелла", "9"), CheckFilter("Альтернативная история", "10"), CheckFilter("Антиутопия", "11"), @@ -557,7 +571,74 @@ class ComX : ParsedHttpSource() { CheckFilter("Ёнкома", "121"), ) + override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { + EditTextPreference(screen.context).apply { + key = DOMAIN_PREF + title = "Домен" + summary = baseUrl + setDefaultValue(DOMAIN_DEFAULT) + setOnPreferenceChangeListener { _, newValue -> + try { + val res = + preferences.edit().putString(DOMAIN_PREF, newValue as String).commit() + Toast.makeText( + screen.context, + "Для смены домена необходимо перезапустить приложение с полной остановкой.", + Toast.LENGTH_LONG, + ).show() + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + }.let(screen::addPreference) + + EditTextPreference(screen.context).apply { + key = FORCE_IMG_DOMAIN_PREF + title = "Домен картинок" + summary = "Переопределение домена картинок" + setDefaultValue("") + setOnPreferenceChangeListener { _, newValue -> + try { + val res = + preferences.edit().putString(FORCE_IMG_DOMAIN_PREF, newValue as String).commit() + Toast.makeText( + screen.context, + "Для смены домена необходимо перезапустить приложение с полной остановкой.", + Toast.LENGTH_LONG, + ).show() + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + }.let(screen::addPreference) + } + + init { + preferences.getString(DEFAULT_DOMAIN_PREF, null).let { prefDefaultDomain -> + if (prefDefaultDomain != DOMAIN_DEFAULT) { + preferences.edit() + .putString(DOMAIN_PREF, DOMAIN_DEFAULT) + .putString(DEFAULT_DOMAIN_PREF, DOMAIN_DEFAULT) + .apply() + } + } + } + companion object { private val simpleDateFormat by lazy { SimpleDateFormat("dd.MM.yyyy", Locale.US) } + + private const val DOMAIN_DEFAULT = "https://comxlife.com" + + private const val DEFAULT_DOMAIN_PREF = "DEFAULT_DOMAIN_PREF" + + private const val DOMAIN_PREF = "DOMAIN_PREF" + + private const val FORCE_IMG_DOMAIN_PREF = "FORCE_IMG_DOMAIN_PREF" + + private val IMG_DOMAIN_REGEX = "\"host\":\"(.+?)\"".toRegex() } }