From d9661d26170b9fee93b46e3f522b386439ed1e5d Mon Sep 17 00:00:00 2001 From: Eshlender <35057681+e-shl@users.noreply.github.com> Date: Tue, 24 Dec 2024 17:07:00 +0500 Subject: [PATCH] [RU]LibGroup add auto image servers (#6747) * [RU]LibGroup add auto image servers * summary auto * isServers != "auto" * setDefaultValue("compress") * change Timeouts * url(url).head() * val url(url).head() --- lib-multisrc/libgroup/build.gradle.kts | 2 +- .../tachiyomi/multisrc/libgroup/LibGroup.kt | 48 ++++++++++++++----- .../multisrc/libgroup/LibGroupDto.kt | 2 +- 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/lib-multisrc/libgroup/build.gradle.kts b/lib-multisrc/libgroup/build.gradle.kts index f551e41b8..0e573c8ab 100644 --- a/lib-multisrc/libgroup/build.gradle.kts +++ b/lib-multisrc/libgroup/build.gradle.kts @@ -2,4 +2,4 @@ plugins { id("lib-multisrc") } -baseVersionCode = 33 +baseVersionCode = 34 diff --git a/lib-multisrc/libgroup/src/eu/kanade/tachiyomi/multisrc/libgroup/LibGroup.kt b/lib-multisrc/libgroup/src/eu/kanade/tachiyomi/multisrc/libgroup/LibGroup.kt index 70fa85549..ed5072c08 100644 --- a/lib-multisrc/libgroup/src/eu/kanade/tachiyomi/multisrc/libgroup/LibGroup.kt +++ b/lib-multisrc/libgroup/src/eu/kanade/tachiyomi/multisrc/libgroup/LibGroup.kt @@ -77,9 +77,8 @@ abstract class LibGroup( .rateLimit(3) .rateLimitHost(apiDomain.toHttpUrl(), 1) .rateLimitHost(baseUrl.toHttpUrl(), 1) - .connectTimeout(5, TimeUnit.MINUTES) + .connectTimeout(1, TimeUnit.MINUTES) .readTimeout(30, TimeUnit.SECONDS) - .writeTimeout(15, TimeUnit.SECONDS) .addInterceptor(::checkForToken) .addInterceptor { chain -> val response = chain.proceed(chain.request()) @@ -100,6 +99,11 @@ abstract class LibGroup( add("Site-Id", siteId.toString()) } + private fun imageHeader() = Headers.Builder().apply { + add("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8") + add("Referer", baseUrl) + }.build() + private var _constants: Constants? = null private fun getConstants(): Constants? { if (_constants == null) { @@ -371,10 +375,25 @@ abstract class LibGroup( return chapter } + private fun checkImage(url: String): Boolean { + val getUrlHead = Request.Builder().url(url).head().headers(imageHeader()).build() + val response = client.newCall(getUrlHead).execute() + return response.isSuccessful && (response.header("content-length", "0")?.toInt()!! > 600) + } + override fun fetchImageUrl(page: Page): Observable { if (page.imageUrl != null) { return Observable.just(page.imageUrl) } + if (isServer() == "auto") { + for (serverApi in IMG_SERVERS.slice(1 until IMG_SERVERS.size)) { + val server = getConstants()?.getServer(serverApi, siteId)?.url + val imageUrl = "$server${page.url}" + if (checkImage(imageUrl)) { + return Observable.just(imageUrl) + } + } + } val server = getConstants()?.getServer(isServer(), siteId)?.url ?: throw Exception("Ошибка получения сервера изображений") return Observable.just("$server${page.url}") } @@ -382,11 +401,7 @@ abstract class LibGroup( override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() override fun imageRequest(page: Page): Request { - val imageHeader = Headers.Builder().apply { - add("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8") - add("Referer", baseUrl) - } - return GET(page.imageUrl!!, imageHeader.build()) + return GET(page.imageUrl!!, imageHeader()) } override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { @@ -561,6 +576,7 @@ abstract class LibGroup( companion object { const val PREFIX_SLUG_SEARCH = "slug:" private const val SERVER_PREF = "MangaLibImageServer" + private val IMG_SERVERS = arrayOf("auto", "main", "secondary", "compress") private const val SORTING_PREF = "MangaLibSorting" private const val SORTING_PREF_TITLE = "Способ выбора переводчиков" @@ -583,7 +599,7 @@ abstract class LibGroup( val simpleDateFormat by lazy { SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'", Locale.US) } } - private fun isServer(): String = preferences.getString(SERVER_PREF, "main")!! + private fun isServer(): String = preferences.getString(SERVER_PREF, "compress")!! private fun isEng(): String = preferences.getString(LANGUAGE_PREF, "eng")!! private fun groupTranslates(): String = preferences.getString(TRANSLATORS_TITLE, TRANSLATORS_DEFAULT)!! private fun isScanUser(): Boolean = preferences.getBoolean(IS_SCAN_USER, false) @@ -591,12 +607,18 @@ abstract class LibGroup( val serverPref = ListPreference(screen.context).apply { key = SERVER_PREF title = "Сервер изображений" - entries = arrayOf("Первый", "Второй", "Сжатия") - entryValues = arrayOf("main", "secondary", "compress") - summary = "%s \n\nВыбор приоритетного сервера изображений. \n" + - "По умолчанию «Первый». \n\n" + + entries = arrayOf("Автовыбор", "Первый", "Второй", "Сжатия") + entryValues = IMG_SERVERS + summary = "%s \n\n" + + "По умолчанию в приложении и на сайте «Сжатия» - самый стабильный и быстрый. \n\n" + + "«Автовыбор» - проходит по всем серверам и показывает только загруженную картинку. \nМожет происходить медленно. \n\n" + "ⓘВыбор другого сервера помогает при ошибках и медленной загрузки изображений глав." - setDefaultValue("main") + setDefaultValue("compress") + setOnPreferenceChangeListener { _, newValue -> + val warning = "Для смены сервера: Настройки -> Дополнительно -> Очистить кэш глав" + Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show() + true + } } val sortingPref = ListPreference(screen.context).apply { diff --git a/lib-multisrc/libgroup/src/eu/kanade/tachiyomi/multisrc/libgroup/LibGroupDto.kt b/lib-multisrc/libgroup/src/eu/kanade/tachiyomi/multisrc/libgroup/LibGroupDto.kt index 6a7de9905..bbbdee26f 100644 --- a/lib-multisrc/libgroup/src/eu/kanade/tachiyomi/multisrc/libgroup/LibGroupDto.kt +++ b/lib-multisrc/libgroup/src/eu/kanade/tachiyomi/multisrc/libgroup/LibGroupDto.kt @@ -45,7 +45,7 @@ class Constants( ) fun getServer(isServers: String?, siteId: Int): ImageServer = - if (!isServers.isNullOrBlank()) { + if (!isServers.isNullOrBlank() and (isServers != "auto")) { imageServers.first { it.id == isServers && it.siteIds.contains(siteId) } } else { imageServers.first { it.siteIds.contains(siteId) }