[RU] Henchan - Move url definition to preferences (#13783)

This commit is contained in:
Maxim Molochkov 2022-10-09 21:14:09 +04:00 committed by GitHub
parent 704f7bcd42
commit 279026e33b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 81 additions and 12 deletions

View File

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

View File

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