Initial commit

This commit is contained in:
FourTOne5
2024-01-09 04:12:39 +06:00
commit 600c345dfe
8593 changed files with 150590 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity
android:name="eu.kanade.tachiyomi.multisrc.libgroup.LibUrlActivity"
android:excludeFromRecents="true"
android:exported="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- LibUrlActivity sites can be added here. -->
<data
android:host="v1.hentailib.org"
android:pathPattern="/..*/v..*"
android:scheme="https" />
</intent-filter>
</activity>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,251 @@
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
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.Request
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class HentaiLib : LibGroup("HentaiLib", "https://hentailib.me", "ru") {
override val id: Long = 6425650164840473547
private val preferences: SharedPreferences by lazy {
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
}
private var domain: String = preferences.getString(DOMAIN_TITLE, DOMAIN_DEFAULT)!!
override val baseUrl: String = domain
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (csrfToken.isEmpty()) {
val tokenResponse = client.newCall(popularMangaRequest(page)).execute()
val resBody = tokenResponse.body.string()
csrfToken = "_token\" content=\"(.*)\"".toRegex().find(resBody)!!.groups[1]!!.value
}
val url = super.searchMangaRequest(page, query, filters).url.newBuilder()
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
is TagList -> filter.state.forEach { tag ->
if (tag.state != Filter.TriState.STATE_IGNORE) {
url.addQueryParameter(
if (tag.isIncluded()) "tags[include][]" else "tags[exclude][]",
tag.id,
)
}
}
else -> {}
}
}
return POST(url.toString(), catalogHeaders())
}
// Filters
private class SearchFilter(name: String, val id: String) : Filter.TriState(name)
private class TagList(tags: List<SearchFilter>) : Filter.Group<SearchFilter>("Теги", tags)
override fun getFilterList(): FilterList {
val filters = super.getFilterList().toMutableList()
filters.add(4, TagList(getTagList()))
return FilterList(filters)
}
private fun getTagList() = listOf(
SearchFilter("3D", "1"),
SearchFilter("Defloration", "287"),
SearchFilter("FPP(Вид от первого лица)", "289"),
SearchFilter("Footfuck", "5"),
SearchFilter("Handjob", "6"),
SearchFilter("Lactation", "7"),
SearchFilter("Living clothes", "284"),
SearchFilter("Mind break", "9"),
SearchFilter("Scat", "13"),
SearchFilter("Selfcest", "286"),
SearchFilter("Shemale", "220"),
SearchFilter("Tomboy", "14"),
SearchFilter("Unbirth", "283"),
SearchFilter("X-Ray", "15"),
SearchFilter("Алкоголь", "16"),
SearchFilter("Анал", "17"),
SearchFilter("Андроид", "18"),
SearchFilter("Анилингус", "19"),
SearchFilter("Анимация (GIF)", "350"),
SearchFilter("Арт", "20"),
SearchFilter("Ахэгао", "2"),
SearchFilter("БДСМ", "22"),
SearchFilter("Бакуню", "21"),
SearchFilter("Бара", "293"),
SearchFilter("Без проникновения", "336"),
SearchFilter("Без текста", "23"),
SearchFilter("Без трусиков", "24"),
SearchFilter("Без цензуры", "25"),
SearchFilter("Беременность", "26"),
SearchFilter("Бикини", "27"),
SearchFilter("Близнецы", "28"),
SearchFilter("Боди-арт", "29"),
SearchFilter("Больница", "30"),
SearchFilter("Большая грудь", "31"),
SearchFilter("Большая попка", "32"),
SearchFilter("Борьба", "33"),
SearchFilter("Буккакэ", "34"),
SearchFilter("В бассейне", "35"),
SearchFilter("В ванной", "36"),
SearchFilter("В государственном учреждении", "37"),
SearchFilter("В общественном месте", "38"),
SearchFilter("В очках", "8"),
SearchFilter("В первый раз", "39"),
SearchFilter("В транспорте", "40"),
SearchFilter("Вампиры", "41"),
SearchFilter("Вибратор", "42"),
SearchFilter("Втроём", "43"),
SearchFilter("Гипноз", "44"),
SearchFilter("Глубокий минет", "45"),
SearchFilter("Горячий источник", "46"),
SearchFilter("Групповой секс", "47"),
SearchFilter("Гуро", "307"),
SearchFilter("Гяру и Гангуро", "48"),
SearchFilter("Двойное проникновение", "49"),
SearchFilter("Девочки-волшебницы", "50"),
SearchFilter("Девушка-туалет", "51"),
SearchFilter("Демон", "52"),
SearchFilter("Дилдо", "53"),
SearchFilter("Домохозяйка", "54"),
SearchFilter("Дыра в стене", "55"),
SearchFilter("Жестокость", "56"),
SearchFilter("Золотой дождь", "57"),
SearchFilter("Зомби", "58"),
SearchFilter("Зоофилия", "351"),
SearchFilter("Зрелые женщины", "59"),
SearchFilter("Избиение", "223"),
SearchFilter("Измена", "60"),
SearchFilter("Изнасилование", "61"),
SearchFilter("Инопланетяне", "62"),
SearchFilter("Инцест", "63"),
SearchFilter("Исполнение желаний", "64"),
SearchFilter("Историческое", "65"),
SearchFilter("Камера", "66"),
SearchFilter("Кляп", "288"),
SearchFilter("Колготки", "67"),
SearchFilter("Косплей", "68"),
SearchFilter("Кримпай", "3"),
SearchFilter("Куннилингус", "69"),
SearchFilter("Купальники", "70"),
SearchFilter("ЛГБТ", "343"),
SearchFilter("Латекс и кожа", "71"),
SearchFilter("Магия", "72"),
SearchFilter("Маленькая грудь", "73"),
SearchFilter("Мастурбация", "74"),
SearchFilter("Медсестра", "221"),
SearchFilter("Мейдочка", "75"),
SearchFilter("Мерзкий дядька", "76"),
SearchFilter("Милф", "77"),
SearchFilter("Много девушек", "78"),
SearchFilter("Много спермы", "79"),
SearchFilter("Молоко", "80"),
SearchFilter("Монашка", "353"),
SearchFilter("Монстродевушки", "81"),
SearchFilter("Монстры", "82"),
SearchFilter("Мочеиспускание", "83"),
SearchFilter("На природе", "84"),
SearchFilter("Наблюдение", "85"),
SearchFilter("Насекомые", "285"),
SearchFilter("Небритая киска", "86"),
SearchFilter("Небритые подмышки", "87"),
SearchFilter("Нетораре", "88"),
SearchFilter("Нэтори", "11"),
SearchFilter("Обмен телами", "89"),
SearchFilter("Обычный секс", "90"),
SearchFilter("Огромная грудь", "91"),
SearchFilter("Огромный член", "92"),
SearchFilter("Омораси", "93"),
SearchFilter("Оральный секс", "94"),
SearchFilter("Орки", "95"),
SearchFilter("Остановка времени", "296"),
SearchFilter("Пайзури", "96"),
SearchFilter("Парень пассив", "97"),
SearchFilter("Переодевание", "98"),
SearchFilter("Пирсинг", "308"),
SearchFilter("Пляж", "99"),
SearchFilter("Повседневность", "100"),
SearchFilter("Подвязки", "282"),
SearchFilter("Подглядывание", "101"),
SearchFilter("Подчинение", "102"),
SearchFilter("Похищение", "103"),
SearchFilter("Превозмогание", "104"),
SearchFilter("Принуждение", "105"),
SearchFilter("Прозрачная одежда", "106"),
SearchFilter("Проституция", "107"),
SearchFilter("Психические отклонения", "108"),
SearchFilter("Публично", "109"),
SearchFilter("Пытки", "224"),
SearchFilter("Пьяные", "110"),
SearchFilter("Рабы", "356"),
SearchFilter("Рабыни", "111"),
SearchFilter("С Сюжетом", "337"),
SearchFilter("Сuminside", "4"),
SearchFilter("Секс-игрушки", "112"),
SearchFilter("Сексуально возбуждённая", "113"),
SearchFilter("Сибари", "114"),
SearchFilter("Спортивная форма", "117"),
SearchFilter("Спортивное тело", "335"),
SearchFilter("Спящие", "118"),
SearchFilter("Страпон", "119"),
SearchFilter("Суккуб", "120"),
SearchFilter("Темнокожие", "121"),
SearchFilter("Тентакли", "122"),
SearchFilter("Толстушки", "123"),
SearchFilter("Трагедия", "124"),
SearchFilter("Трап", "125"),
SearchFilter("Ужасы", "126"),
SearchFilter("Униформа", "127"),
SearchFilter("Учитель и ученик", "352"),
SearchFilter("Ушастые", "128"),
SearchFilter("Фантазии", "129"),
SearchFilter("Фемдом", "130"),
SearchFilter("Фестиваль", "131"),
SearchFilter("Фетиш", "132"),
SearchFilter("Фистинг", "133"),
SearchFilter("Фурри", "134"),
SearchFilter("Футанари", "136"),
SearchFilter("Футанари имеет парня", "137"),
SearchFilter("Цельный купальник", "138"),
SearchFilter("Цундэрэ", "139"),
SearchFilter("Чикан", "140"),
SearchFilter("Чулки", "141"),
SearchFilter("Шлюха", "142"),
SearchFilter("Эксгибиционизм", "143"),
SearchFilter("Эльф", "144"),
SearchFilter("Юные", "145"),
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 ->
val warning = "Для смены домена необходимо перезапустить приложение с полной остановкой."
Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show()
true
}
}.let(screen::addPreference)
}
companion object {
const val PREFIX_SLUG_SEARCH = "slug:"
private const val DOMAIN_TITLE = "Домен"
private const val DOMAIN_DEFAULT = "https://hentailib.me"
}
}

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity
android:name="eu.kanade.tachiyomi.multisrc.libgroup.LibUrlActivity"
android:excludeFromRecents="true"
android:exported="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- LibUrlActivity sites can be added here. -->
<data
android:host="mangalib.me"
android:pathPattern="/..*/v..*"
android:scheme="https" />
<data
android:host="mangalib.org"
android:pathPattern="/..*/v..*"
android:scheme="https" />
</intent-filter>
</activity>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

View File

@@ -0,0 +1,208 @@
package eu.kanade.tachiyomi.extension.ru.mangalib
import android.app.Application
import android.content.SharedPreferences
import android.widget.Toast
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.multisrc.libgroup.LibGroup
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.Request
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class MangaLib : LibGroup("MangaLib", "https://mangalib.me", "ru") {
override val id: Long = 6111047689498497237
private val preferences: SharedPreferences by lazy {
Injekt.get<Application>().getSharedPreferences("source_${id}_2", 0x0000)
}
private val baseOrig: String = "https://mangalib.me"
private val baseMirr: String = "https://mangalib.org"
private var domain: String? = preferences.getString(DOMAIN_PREF, baseOrig)
override val baseUrl: String = domain.toString()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (csrfToken.isEmpty()) {
val tokenResponse = client.newCall(popularMangaRequest(page)).execute()
val resBody = tokenResponse.body.string()
csrfToken = "_token\" content=\"(.*)\"".toRegex().find(resBody)!!.groups[1]!!.value
}
val url = super.searchMangaRequest(page, query, filters).url.newBuilder()
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
is AgeList -> filter.state.forEach { age ->
if (age.state != Filter.TriState.STATE_IGNORE) {
url.addQueryParameter(
if (age.isIncluded()) "caution[include][]" else "caution[exclude][]",
age.id,
)
}
}
is TagList -> filter.state.forEach { tag ->
if (tag.state != Filter.TriState.STATE_IGNORE) {
url.addQueryParameter(
if (tag.isIncluded()) "tags[include][]" else "tags[exclude][]",
tag.id,
)
}
}
else -> {}
}
}
return POST(url.toString(), catalogHeaders())
}
// Filters
private class SearchFilter(name: String, val id: String) : Filter.TriState(name)
private class TagList(tags: List<SearchFilter>) : Filter.Group<SearchFilter>("Теги", tags)
private class AgeList(ages: List<SearchFilter>) : Filter.Group<SearchFilter>("Возрастное ограничение", ages)
override fun getFilterList(): FilterList {
val filters = super.getFilterList().toMutableList()
filters.add(4, TagList(getTagList()))
filters.add(7, AgeList(getAgeList()))
return FilterList(filters)
}
private fun getTagList() = listOf(
SearchFilter("Азартные игры", "304"),
SearchFilter("Алхимия", "225"),
SearchFilter("Ангелы", "226"),
SearchFilter("Антигерой", "175"),
SearchFilter("Антиутопия", "227"),
SearchFilter("Апокалипсис", "228"),
SearchFilter("Армия", "229"),
SearchFilter("Артефакты", "230"),
SearchFilter("Боги", "215"),
SearchFilter("Бои на мечах", "231"),
SearchFilter("Борьба за власть", "231"),
SearchFilter("Брат и сестра", "233"),
SearchFilter("Будущее", "234"),
SearchFilter("Ведьма", "338"),
SearchFilter("Вестерн", "235"),
SearchFilter("Видеоигры", "185"),
SearchFilter("Виртуальная реальность", "195"),
SearchFilter("Владыка демонов", "236"),
SearchFilter("Военные", "179"),
SearchFilter("Война", "237"),
SearchFilter("Волшебники / маги", "281"),
SearchFilter("Волшебные существа", "239"),
SearchFilter("Воспоминания из другого мира", "240"),
SearchFilter("Выживание", "193"),
SearchFilter("ГГ женщина", "243"),
SearchFilter("ГГ имба", "291"),
SearchFilter("ГГ мужчина", "244"),
SearchFilter("Геймеры", "241"),
SearchFilter("Гильдии", "242"),
SearchFilter("Глупый ГГ", "297"),
SearchFilter("Гоблины", "245"),
SearchFilter("Горничные", "169"),
SearchFilter("Гяру", "178"),
SearchFilter("Демоны", "151"),
SearchFilter("Драконы", "246"),
SearchFilter("Дружба", "247"),
SearchFilter("Жестокий мир", "249"),
SearchFilter("Животные компаньоны", "250"),
SearchFilter("Завоевание мира", "251"),
SearchFilter("Зверолюди", "162"),
SearchFilter("Злые духи", "252"),
SearchFilter("Зомби", "149"),
SearchFilter("Игровые элементы", "253"),
SearchFilter("Империи", "254"),
SearchFilter("Квесты", "255"),
SearchFilter("Космос", "256"),
SearchFilter("Кулинария", "152"),
SearchFilter("Культивация", "160"),
SearchFilter("Легендарное оружие", "257"),
SearchFilter("Лоли", "187"),
SearchFilter("Магическая академия", "258"),
SearchFilter("Магия", "168"),
SearchFilter("Мафия", "172"),
SearchFilter("Медицина", "153"),
SearchFilter("Месть", "259"),
SearchFilter("Монстр Девушки", "188"),
SearchFilter("Монстры", "189"),
SearchFilter("Музыка", "190"),
SearchFilter("Навыки / способности", "260"),
SearchFilter("Насилие / жестокость", "262"),
SearchFilter("Наёмники", "261"),
SearchFilter("Нежить", "263"),
SearchFilter("Ниндая", "180"),
SearchFilter("Обратный Гарем", "191"),
SearchFilter("Огнестрельное оружие", "264"),
SearchFilter("Офисные Работники", "181"),
SearchFilter("Пародия", "265"),
SearchFilter("Пираты", "340"),
SearchFilter("Подземелья", "266"),
SearchFilter("Политика", "267"),
SearchFilter("Полиция", "182"),
SearchFilter("Преступники / Криминал", "186"),
SearchFilter("Призраки / Духи", "177"),
SearchFilter("Путешествие во времени", "194"),
SearchFilter("Разумные расы", "268"),
SearchFilter("Ранги силы", "248"),
SearchFilter("Реинкарнация", "148"),
SearchFilter("Роботы", "269"),
SearchFilter("Рыцари", "270"),
SearchFilter("Самураи", "183"),
SearchFilter("Система", "271"),
SearchFilter("Скрытие личности", "273"),
SearchFilter("Спасение мира", "274"),
SearchFilter("Спортивное тело", "334"),
SearchFilter("Средневековье", "173"),
SearchFilter("Стимпанк", "272"),
SearchFilter("Супергерои", "275"),
SearchFilter("Традиционные игры", "184"),
SearchFilter("Умный ГГ", "302"),
SearchFilter("Учитель / ученик", "276"),
SearchFilter("Философия", "277"),
SearchFilter("Хикикомори", "166"),
SearchFilter("Холодное оружие", "278"),
SearchFilter("Шантаж", "279"),
SearchFilter("Эльфы", "216"),
SearchFilter("Якудза", "164"),
SearchFilter("Япония", "280"),
)
private fun getAgeList() = listOf(
SearchFilter("Отсутствует", "0"),
SearchFilter("16+", "1"),
SearchFilter("18+", "2"),
)
companion object {
const val PREFIX_SLUG_SEARCH = "slug:"
private const val DOMAIN_PREF = "MangaLibDomain"
private const val DOMAIN_PREF_Title = "Выбор домена"
}
override fun setupPreferenceScreen(screen: PreferenceScreen) {
super.setupPreferenceScreen(screen)
ListPreference(screen.context).apply {
key = DOMAIN_PREF
title = DOMAIN_PREF_Title
entries = arrayOf("Основной (mangalib.me)", "Зеркало (mangalib.org)")
entryValues = arrayOf(baseOrig, baseMirr)
summary = "%s"
setDefaultValue(baseOrig)
setOnPreferenceChangeListener { _, newValue ->
try {
val res = preferences.edit().putString(DOMAIN_PREF, newValue as String).commit()
val warning = "Для смены домена необходимо перезапустить приложение с полной остановкой."
Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show()
res
} catch (e: Exception) {
e.printStackTrace()
false
}
}
}.let(screen::addPreference)
}
}

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity
android:name="eu.kanade.tachiyomi.multisrc.libgroup.LibUrlActivity"
android:excludeFromRecents="true"
android:exported="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- LibUrlActivity sites can be added here. -->
<data
android:host="v1.slashlib.me"
android:pathPattern="/..*/v..*"
android:scheme="https" />
</intent-filter>
</activity>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -0,0 +1,197 @@
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
import eu.kanade.tachiyomi.source.model.FilterList
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<Application>().getSharedPreferences("source_$id", 0x0000)
}
private var domain: String = preferences.getString(DOMAIN_TITLE, DOMAIN_DEFAULT)!!
override val baseUrl: String = domain
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (csrfToken.isEmpty()) {
val tokenResponse = client.newCall(popularMangaRequest(page)).execute()
val resBody = tokenResponse.body.string()
csrfToken = "_token\" content=\"(.*)\"".toRegex().find(resBody)!!.groups[1]!!.value
}
val url = super.searchMangaRequest(page, query, filters).url.newBuilder()
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
is AgeList -> filter.state.forEach { age ->
if (age.state != Filter.TriState.STATE_IGNORE) {
url.addQueryParameter(
if (age.isIncluded()) "caution[include][]" else "caution[exclude][]",
age.id,
)
}
}
is TagList -> filter.state.forEach { tag ->
if (tag.state != Filter.TriState.STATE_IGNORE) {
url.addQueryParameter(
if (tag.isIncluded()) "tags[include][]" else "tags[exclude][]",
tag.id,
)
}
}
else -> {}
}
}
return POST(url.toString(), catalogHeaders())
}
// Filters
private class SearchFilter(name: String, val id: String) : Filter.TriState(name)
private class TagList(tags: List<SearchFilter>) : Filter.Group<SearchFilter>("Теги", tags)
private class AgeList(ages: List<SearchFilter>) : Filter.Group<SearchFilter>("Возрастное ограничение", ages)
override fun getFilterList(): FilterList {
val filters = super.getFilterList().toMutableList()
filters.add(4, TagList(getTagList()))
filters.add(7, AgeList(getAgeList()))
return FilterList(filters)
}
private fun getTagList() = listOf(
SearchFilter("Азартные игры", "304"),
SearchFilter("Алхимия", "225"),
SearchFilter("Ангелы", "226"),
SearchFilter("Антигерой", "175"),
SearchFilter("Антиутопия", "227"),
SearchFilter("Апокалипсис", "228"),
SearchFilter("Армия", "229"),
SearchFilter("Артефакты", "230"),
SearchFilter("Боги", "215"),
SearchFilter("Бои на мечах", "231"),
SearchFilter("Борьба за власть", "231"),
SearchFilter("Брат и сестра", "233"),
SearchFilter("Будущее", "234"),
SearchFilter("Ведьма", "338"),
SearchFilter("Вестерн", "235"),
SearchFilter("Видеоигры", "185"),
SearchFilter("Виртуальная реальность", "195"),
SearchFilter("Владыка демонов", "236"),
SearchFilter("Военные", "179"),
SearchFilter("Война", "237"),
SearchFilter("Волшебники / маги", "281"),
SearchFilter("Волшебные существа", "239"),
SearchFilter("Воспоминания из другого мира", "240"),
SearchFilter("Выживание", "193"),
SearchFilter("ГГ женщина", "243"),
SearchFilter("ГГ имба", "291"),
SearchFilter("ГГ мужчина", "244"),
SearchFilter("Геймеры", "241"),
SearchFilter("Гильдии", "242"),
SearchFilter("Глупый ГГ", "297"),
SearchFilter("Гоблины", "245"),
SearchFilter("Горничные", "169"),
SearchFilter("Гяру", "178"),
SearchFilter("Демоны", "151"),
SearchFilter("Драконы", "246"),
SearchFilter("Дружба", "247"),
SearchFilter("Жестокий мир", "249"),
SearchFilter("Животные компаньоны", "250"),
SearchFilter("Завоевание мира", "251"),
SearchFilter("Зверолюди", "162"),
SearchFilter("Злые духи", "252"),
SearchFilter("Зомби", "149"),
SearchFilter("Игровые элементы", "253"),
SearchFilter("Империи", "254"),
SearchFilter("Квесты", "255"),
SearchFilter("Космос", "256"),
SearchFilter("Кулинария", "152"),
SearchFilter("Культивация", "160"),
SearchFilter("Легендарное оружие", "257"),
SearchFilter("Лоли", "187"),
SearchFilter("Магическая академия", "258"),
SearchFilter("Магия", "168"),
SearchFilter("Мафия", "172"),
SearchFilter("Медицина", "153"),
SearchFilter("Месть", "259"),
SearchFilter("Монстр Девушки", "188"),
SearchFilter("Монстры", "189"),
SearchFilter("Музыка", "190"),
SearchFilter("Навыки / способности", "260"),
SearchFilter("Насилие / жестокость", "262"),
SearchFilter("Наёмники", "261"),
SearchFilter("Нежить", "263"),
SearchFilter("Ниндая", "180"),
SearchFilter("Обратный Гарем", "191"),
SearchFilter("Огнестрельное оружие", "264"),
SearchFilter("Офисные Работники", "181"),
SearchFilter("Пародия", "265"),
SearchFilter("Пираты", "340"),
SearchFilter("Подземелья", "266"),
SearchFilter("Политика", "267"),
SearchFilter("Полиция", "182"),
SearchFilter("Преступники / Криминал", "186"),
SearchFilter("Призраки / Духи", "177"),
SearchFilter("Путешествие во времени", "194"),
SearchFilter("Разумные расы", "268"),
SearchFilter("Ранги силы", "248"),
SearchFilter("Реинкарнация", "148"),
SearchFilter("Роботы", "269"),
SearchFilter("Рыцари", "270"),
SearchFilter("Самураи", "183"),
SearchFilter("Система", "271"),
SearchFilter("Скрытие личности", "273"),
SearchFilter("Спасение мира", "274"),
SearchFilter("Спортивное тело", "334"),
SearchFilter("Средневековье", "173"),
SearchFilter("Стимпанк", "272"),
SearchFilter("Супергерои", "275"),
SearchFilter("Традиционные игры", "184"),
SearchFilter("Умный ГГ", "302"),
SearchFilter("Учитель / ученик", "276"),
SearchFilter("Философия", "277"),
SearchFilter("Хикикомори", "166"),
SearchFilter("Холодное оружие", "278"),
SearchFilter("Шантаж", "279"),
SearchFilter("Эльфы", "216"),
SearchFilter("Якудза", "164"),
SearchFilter("Япония", "280"),
)
private fun getAgeList() = listOf(
SearchFilter("Отсутствует", "0"),
SearchFilter("16+", "1"),
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 ->
val warning = "Для смены домена необходимо перезапустить приложение с полной остановкой."
Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show()
true
}
}.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"
}
}