[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()
This commit is contained in:
Eshlender 2024-12-24 17:07:00 +05:00 committed by Draff
parent 7813eb9117
commit d9661d2617
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
3 changed files with 37 additions and 15 deletions

View File

@ -2,4 +2,4 @@ plugins {
id("lib-multisrc")
}
baseVersionCode = 33
baseVersionCode = 34

View File

@ -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<String> {
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<MangasPage> {
@ -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 {

View File

@ -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) }