From 38e7e2347a897469bd7ac3b89a4b4ba046a5e04c Mon Sep 17 00:00:00 2001 From: Eshlender <35057681+e-shl@users.noreply.github.com> Date: Mon, 13 Mar 2023 19:35:07 +0500 Subject: [PATCH] [RU]LibGroup no empty series filter and custom domain switcher 18+ (#15623) * [RU]LibGroup no empty series filter * domain * custom domain switcher 18+ --- .../libgroup/hentailib/AndroidManifest.xml | 2 +- .../libgroup/hentailib/src/HentaiLib.kt | 39 ++++++++++++++++++- .../overrides/libgroup/yaoilib/src/YaoiLib.kt | 37 ++++++++++++++++++ .../multisrc/libgroup/LibGenerator.kt | 4 +- .../tachiyomi/multisrc/libgroup/LibGroup.kt | 18 +++++++-- 5 files changed, 93 insertions(+), 7 deletions(-) diff --git a/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml b/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml index 1ed798a66..543d49e63 100644 --- a/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml +++ b/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml @@ -16,7 +16,7 @@ diff --git a/multisrc/overrides/libgroup/hentailib/src/HentaiLib.kt b/multisrc/overrides/libgroup/hentailib/src/HentaiLib.kt index 43a826d30..f3aea1844 100644 --- a/multisrc/overrides/libgroup/hentailib/src/HentaiLib.kt +++ b/multisrc/overrides/libgroup/hentailib/src/HentaiLib.kt @@ -1,5 +1,9 @@ package eu.kanade.tachiyomi.extension.ru.hentailib +import android.app.Application +import android.content.SharedPreferences +import android.widget.Toast +import androidx.preference.EditTextPreference import eu.kanade.tachiyomi.multisrc.libgroup.LibGroup import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.source.model.Filter @@ -7,11 +11,20 @@ import eu.kanade.tachiyomi.source.model.FilterList import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get -class HentaiLib : LibGroup("HentaiLib", "https://hentailib.me", "ru") { +class HentaiLib : LibGroup("HentaiLib", "https://v1.hentailib.org", "ru") { override val id: Long = 6425650164840473547 + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + private var domain: String = preferences.getString(DOMAIN_TITLE, DOMAIN_DEFAULT)!! + override val baseUrl: String = domain + override val client: OkHttpClient = super.client.newBuilder() .addInterceptor(::imageContentTypeIntercept) .build() @@ -229,7 +242,31 @@ class HentaiLib : LibGroup("HentaiLib", "https://hentailib.me", "ru") { SearchFilter("Яндэрэ", "146"), ) + override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { + super.setupPreferenceScreen(screen) + EditTextPreference(screen.context).apply { + key = DOMAIN_TITLE + this.title = DOMAIN_TITLE + summary = domain + this.setDefaultValue(DOMAIN_DEFAULT) + dialogTitle = DOMAIN_TITLE + setOnPreferenceChangeListener { _, newValue -> + try { + val res = preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit() + Toast.makeText(screen.context, "Для смены домена необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show() + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + }.let(screen::addPreference) + } + companion object { const val PREFIX_SLUG_SEARCH = "slug:" + + private const val DOMAIN_TITLE = "Домен" + private const val DOMAIN_DEFAULT = "https://v1.hentailib.org" } } diff --git a/multisrc/overrides/libgroup/yaoilib/src/YaoiLib.kt b/multisrc/overrides/libgroup/yaoilib/src/YaoiLib.kt index 920e83199..96d05e9d4 100644 --- a/multisrc/overrides/libgroup/yaoilib/src/YaoiLib.kt +++ b/multisrc/overrides/libgroup/yaoilib/src/YaoiLib.kt @@ -1,5 +1,9 @@ package eu.kanade.tachiyomi.extension.ru.yaoilib +import android.app.Application +import android.content.SharedPreferences +import android.widget.Toast +import androidx.preference.EditTextPreference import eu.kanade.tachiyomi.multisrc.libgroup.LibGroup import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.source.model.Filter @@ -7,9 +11,18 @@ import eu.kanade.tachiyomi.source.model.FilterList import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get class YaoiLib : LibGroup("YaoiLib", "https://v1.slashlib.me", "ru") { + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + private var domain: String = preferences.getString(DOMAIN_TITLE, DOMAIN_DEFAULT)!! + override val baseUrl: String = domain + override val client: OkHttpClient = super.client.newBuilder() .addInterceptor(::imageContentTypeIntercept) .build() @@ -175,7 +188,31 @@ class YaoiLib : LibGroup("YaoiLib", "https://v1.slashlib.me", "ru") { SearchFilter("18+", "2"), ) + override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { + super.setupPreferenceScreen(screen) + EditTextPreference(screen.context).apply { + key = DOMAIN_TITLE + this.title = DOMAIN_TITLE + summary = domain + this.setDefaultValue(DOMAIN_DEFAULT) + dialogTitle = DOMAIN_TITLE + setOnPreferenceChangeListener { _, newValue -> + try { + val res = preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit() + Toast.makeText(screen.context, "Для смены домена необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show() + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + }.let(screen::addPreference) + } + companion object { const val PREFIX_SLUG_SEARCH = "slug:" + + private const val DOMAIN_TITLE = "Домен" + private const val DOMAIN_DEFAULT = "https://v1.slashlib.me" } } diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/libgroup/LibGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/libgroup/LibGenerator.kt index 6402bf621..6b531530b 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/libgroup/LibGenerator.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/libgroup/LibGenerator.kt @@ -9,11 +9,11 @@ class LibGenerator : ThemeSourceGenerator { override val themeClass = "LibGroup" - override val baseVersionCode: Int = 16 + override val baseVersionCode: Int = 17 override val sources = listOf( SingleLang("MangaLib", "https://mangalib.me", "ru", overrideVersionCode = 74), - SingleLang("HentaiLib", "https://hentailib.me", "ru", isNsfw = true, overrideVersionCode = 19), + SingleLang("HentaiLib", "https://v1.hentailib.org", "ru", isNsfw = true, overrideVersionCode = 19), SingleLang("YaoiLib", "https://v1.slashlib.me", "ru", isNsfw = true, overrideVersionCode = 2), ) diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/libgroup/LibGroup.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/libgroup/LibGroup.kt index 057e6e922..b26b1174c 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/libgroup/LibGroup.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/libgroup/LibGroup.kt @@ -129,7 +129,7 @@ abstract class LibGroup( } private fun fetchLatestMangaFromApi(page: Int): Observable { - return client.newCall(POST("$baseUrl/filterlist?dir=desc&sort=last_chapter_at&page=$page", catalogHeaders())) + return client.newCall(POST("$baseUrl/filterlist?dir=desc&sort=last_chapter_at&page=$page&chapters[min]=1", catalogHeaders())) .asObservableSuccess() .map { response -> latestUpdatesParse(response) @@ -156,7 +156,7 @@ abstract class LibGroup( } private fun fetchPopularMangaFromApi(page: Int): Observable { - return client.newCall(POST("$baseUrl/filterlist?dir=desc&sort=views&page=$page", catalogHeaders())) + return client.newCall(POST("$baseUrl/filterlist?dir=desc&sort=views&page=$page&chapters[min]=1", catalogHeaders())) .asObservableSuccess() .map { response -> popularMangaParse(response) @@ -539,7 +539,7 @@ abstract class LibGroup( val resBody = tokenResponse.body.string() csrfToken = "_token\" content=\"(.*)\"".toRegex().find(resBody)!!.groups[1]!!.value } - val url = "$baseUrl/filterlist?page=$page".toHttpUrlOrNull()!!.newBuilder() + val url = "$baseUrl/filterlist?page=$page&chapters[min]=1".toHttpUrlOrNull()!!.newBuilder() if (query.isNotEmpty()) { url.addQueryParameter("name", query) } @@ -579,6 +579,11 @@ abstract class LibGroup( url.addQueryParameter(if (favorite.isIncluded()) "bookmarks[include][]" else "bookmarks[exclude][]", favorite.id) } } + is RequireChapters -> { + if (filter.state == 1) { + url.setQueryParameter("chapters[min]", "0") + } + } else -> {} } } @@ -606,6 +611,7 @@ abstract class LibGroup( StatusList(getStatusList()), StatusTitleList(getStatusTitleList()), MyList(getMyList()), + RequireChapters(), ) private class OrderBy : Filter.Sort( @@ -701,6 +707,12 @@ abstract class LibGroup( SearchFilter("Прочитано", "4"), SearchFilter("Любимые", "5"), ) + + private class RequireChapters : Filter.Select( + "Только проекты с главами", + arrayOf("Да", "Все"), + ) + companion object { const val PREFIX_SLUG_SEARCH = "slug:" private const val SERVER_PREF = "MangaLibImageServer"