[RU] Henchan - Move url definition to preferences (#13783)
This commit is contained in:
parent
704f7bcd42
commit
279026e33b
|
@ -1,9 +1,14 @@
|
||||||
package eu.kanade.tachiyomi.extension.ru.henchan
|
package eu.kanade.tachiyomi.extension.ru.henchan
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.Application
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.preference.EditTextPreference
|
||||||
import eu.kanade.tachiyomi.multisrc.multichan.MultiChan
|
import eu.kanade.tachiyomi.multisrc.multichan.MultiChan
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.asObservable
|
import eu.kanade.tachiyomi.network.asObservable
|
||||||
|
import eu.kanade.tachiyomi.source.ConfigurableSource
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
import eu.kanade.tachiyomi.source.model.Filter
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
|
@ -16,15 +21,25 @@ import okhttp3.Response
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
|
import uy.kohesive.injekt.Injekt
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
class HenChan : MultiChan("HenChan", "https://hchan.live", "ru") {
|
class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableSource {
|
||||||
|
|
||||||
override val id: Long = 5504588601186153612
|
override val id: Long = 5504588601186153612
|
||||||
|
|
||||||
|
private val preferences: SharedPreferences by lazy {
|
||||||
|
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val domain = preferences.getString(DOMAIN_TITLE, DOMAIN_DEFAULT)!!
|
||||||
|
|
||||||
|
override val baseUrl = domain
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||||
|
|
||||||
val url = if (query.isNotEmpty()) {
|
val url = if (query.isNotEmpty()) {
|
||||||
|
@ -76,8 +91,17 @@ class HenChan : MultiChan("HenChan", "https://hchan.live", "ru") {
|
||||||
val isExHenManga = this.contains("/manganew_thumbs_blur/")
|
val isExHenManga = this.contains("/manganew_thumbs_blur/")
|
||||||
val regex = "(?<=/)manganew_thumbs\\w*?(?=/)".toRegex(RegexOption.IGNORE_CASE)
|
val regex = "(?<=/)manganew_thumbs\\w*?(?=/)".toRegex(RegexOption.IGNORE_CASE)
|
||||||
return this.replace(regex, "showfull_retina/manga")
|
return this.replace(regex, "showfull_retina/manga")
|
||||||
.replace("_".plus(URL(baseUrl).host), "_hentaichan.ru") // domain-related replacing for very old mangas
|
.replace(
|
||||||
.plus(if (isExHenManga) { "#" } else { "" }) // # for later so we know what type manga is it
|
"_".plus(URL(baseUrl).host),
|
||||||
|
"_hentaichan.ru"
|
||||||
|
) // domain-related replacing for very old mangas
|
||||||
|
.plus(
|
||||||
|
if (isExHenManga) {
|
||||||
|
"#"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
) // # for later so we know what type manga is it
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element): SManga {
|
override fun popularMangaFromElement(element: Element): SManga {
|
||||||
|
@ -154,7 +178,8 @@ class HenChan : MultiChan("HenChan", "https://hchan.live", "ru") {
|
||||||
.replace("\\\"", "\"")
|
.replace("\\\"", "\"")
|
||||||
.replace("\\'", "'")
|
.replace("\\'", "'")
|
||||||
chap.chapter_number = 1F
|
chap.chapter_number = 1F
|
||||||
chap.date_upload = Date().time // setting to current date because of a sorting in the "Recent updates" section
|
chap.date_upload =
|
||||||
|
Date().time // setting to current date because of a sorting in the "Recent updates" section
|
||||||
return listOf(chap)
|
return listOf(chap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,8 +215,11 @@ class HenChan : MultiChan("HenChan", "https://hchan.live", "ru") {
|
||||||
chapter.setUrlWithoutDomain(element.select("h2 a").attr("href"))
|
chapter.setUrlWithoutDomain(element.select("h2 a").attr("href"))
|
||||||
val chapterName = element.select("h2 a").attr("title")
|
val chapterName = element.select("h2 a").attr("title")
|
||||||
chapter.name = chapterName
|
chapter.name = chapterName
|
||||||
chapter.chapter_number = "(глава\\s|часть\\s)([0-9]+\\.?[0-9]*)".toRegex(RegexOption.IGNORE_CASE).find(chapterName)?.groupValues?.get(2)?.toFloat() ?: -1F
|
chapter.chapter_number =
|
||||||
chapter.date_upload = Date().time // setting to current date because of a sorting in the "Recent updates" section
|
"(глава\\s|часть\\s)([0-9]+\\.?[0-9]*)".toRegex(RegexOption.IGNORE_CASE)
|
||||||
|
.find(chapterName)?.groupValues?.get(2)?.toFloat() ?: -1F
|
||||||
|
chapter.date_upload =
|
||||||
|
Date().time // setting to current date because of a sorting in the "Recent updates" section
|
||||||
return chapter
|
return chapter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,19 +245,35 @@ class HenChan : MultiChan("HenChan", "https://hchan.live", "ru") {
|
||||||
return pageUrls.mapIndexed { i, url -> Page(i, "", url) }
|
return pageUrls.mapIndexed { i, url -> Page(i, "", url) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Genre(val id: String, @SuppressLint("DefaultLocale") name: String = id.replace('_', ' ').capitalize()) : Filter.TriState(name)
|
private class Genre(
|
||||||
|
val id: String,
|
||||||
|
@SuppressLint("DefaultLocale") name: String = id.replace('_', ' ').capitalize()
|
||||||
|
) : Filter.TriState(name)
|
||||||
|
|
||||||
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Тэги", genres)
|
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Тэги", genres)
|
||||||
private class OrderBy : UriPartFilter(
|
private class OrderBy : UriPartFilter(
|
||||||
"Сортировка",
|
"Сортировка",
|
||||||
arrayOf("Дата", "Популярность", "Алфавит"),
|
arrayOf("Дата", "Популярность", "Алфавит"),
|
||||||
arrayOf("&n=dateasc" to "", "&n=favasc" to "&n=favdesc", "&n=abcdesc" to "&n=abcasc"),
|
arrayOf("&n=dateasc" to "", "&n=favasc" to "&n=favdesc", "&n=abcdesc" to "&n=abcasc"),
|
||||||
arrayOf("manga/new&n=dateasc" to "manga/new", "manga/new&n=favasc" to "mostfavorites&sort=manga", "manga/new&n=abcdesc" to "manga/new&n=abcasc")
|
arrayOf(
|
||||||
|
"manga/new&n=dateasc" to "manga/new",
|
||||||
|
"manga/new&n=favasc" to "mostfavorites&sort=manga",
|
||||||
|
"manga/new&n=abcdesc" to "manga/new&n=abcasc"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
private open class UriPartFilter(displayName: String, sortNames: Array<String>, val withGenres: Array<Pair<String, String>>, val withoutGenres: Array<Pair<String, String>>) :
|
private open class UriPartFilter(
|
||||||
|
displayName: String,
|
||||||
|
sortNames: Array<String>,
|
||||||
|
val withGenres: Array<Pair<String, String>>,
|
||||||
|
val withoutGenres: Array<Pair<String, String>>
|
||||||
|
) :
|
||||||
Filter.Sort(displayName, sortNames, Selection(1, false)) {
|
Filter.Sort(displayName, sortNames, Selection(1, false)) {
|
||||||
fun toUriPartWithGenres() = if (state!!.ascending) withGenres[state!!.index].first else withGenres[state!!.index].second
|
fun toUriPartWithGenres() =
|
||||||
fun toUriPartWithoutGenres() = if (state!!.ascending) withoutGenres[state!!.index].first else withoutGenres[state!!.index].second
|
if (state!!.ascending) withGenres[state!!.index].first else withGenres[state!!.index].second
|
||||||
|
|
||||||
|
fun toUriPartWithoutGenres() =
|
||||||
|
if (state!!.ascending) withoutGenres[state!!.index].first else withoutGenres[state!!.index].second
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFilterList() = FilterList(
|
override fun getFilterList() = FilterList(
|
||||||
|
@ -415,4 +459,29 @@ class HenChan : MultiChan("HenChan", "https://hchan.live", "ru") {
|
||||||
Genre("яндере"),
|
Genre("яндере"),
|
||||||
Genre("яой")
|
Genre("яой")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
|
||||||
|
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 {
|
||||||
|
private const val DOMAIN_TITLE = "Домен"
|
||||||
|
private const val DOMAIN_DEFAULT = "http://y.hchan.live"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ class ChanGenerator : ThemeSourceGenerator {
|
||||||
|
|
||||||
override val sources = listOf(
|
override val sources = listOf(
|
||||||
SingleLang("MangaChan", "https://manga-chan.me", "ru", overrideVersionCode = 14),
|
SingleLang("MangaChan", "https://manga-chan.me", "ru", overrideVersionCode = 14),
|
||||||
SingleLang("HenChan", "https://hchan.live", "ru", isNsfw = true, overrideVersionCode = 36),
|
SingleLang("HenChan", "http://y.hchan.live", "ru", isNsfw = true, overrideVersionCode = 37),
|
||||||
SingleLang("YaoiChan", "https://yaoi-chan.me", "ru", isNsfw = true, overrideVersionCode = 4)
|
SingleLang("YaoiChan", "https://yaoi-chan.me", "ru", isNsfw = true, overrideVersionCode = 4)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue