CbHentai: Add override baseUrl, Change baseUrl, Fix Regex (#7786)

* bump version

* Add override baseUrl, Change baseUrl, Fix Regex
This commit is contained in:
are-are-are 2025-03-01 10:24:03 +07:00 committed by Draff
parent 25a118d501
commit 481fd54452
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
2 changed files with 67 additions and 8 deletions

View File

@ -2,8 +2,8 @@ ext {
extName = 'CBHentai' extName = 'CBHentai'
extClass = '.HentaiCB' extClass = '.HentaiCB'
themePkg = 'madara' themePkg = 'madara'
baseUrl = 'https://hentaicube.xyz' baseUrl = 'https://hentaicb.love'
overrideVersionCode = 12 overrideVersionCode = 13
isNsfw = true isNsfw = true
} }

View File

@ -1,25 +1,59 @@
package eu.kanade.tachiyomi.extension.vi.hentaicube package eu.kanade.tachiyomi.extension.vi.hentaicube
import android.content.SharedPreferences
import android.widget.Toast
import androidx.preference.EditTextPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import keiyoushi.utils.getPreferences
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import rx.Observable import rx.Observable
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
class HentaiCB : Madara("CBHentai", "https://hentaicube.xyz", "vi", SimpleDateFormat("dd/MM/yyyy", Locale("vi"))) { class HentaiCB :
Madara(
"CBHentai",
"https://hentaicb.love",
"vi",
SimpleDateFormat("dd/MM/yyyy", Locale("vi")),
),
ConfigurableSource {
override val id: Long = 823638192569572166 override val id: Long = 823638192569572166
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.rateLimit(3)
.build()
private val preferences: SharedPreferences = getPreferences()
init {
preferences.getString(DEFAULT_BASE_URL_PREF, null).let { prefDefaultBaseUrl ->
if (prefDefaultBaseUrl != super.baseUrl) {
preferences.edit()
.putString(BASE_URL_PREF, super.baseUrl)
.putString(DEFAULT_BASE_URL_PREF, super.baseUrl)
.apply()
}
}
}
private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, super.baseUrl)!!
override val baseUrl by lazy { getPrefBaseUrl() }
override val filterNonMangaItems = false override val filterNonMangaItems = false
// Changed from 'manga' to 'read'
override val mangaSubString = "read" override val mangaSubString = "read"
override val altNameSelector = ".post-content_item:contains(Tên khác) .summary-content" override val altNameSelector = ".post-content_item:contains(Tên khác) .summary-content"
@ -27,7 +61,7 @@ class HentaiCB : Madara("CBHentai", "https://hentaicube.xyz", "vi", SimpleDateFo
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
if (query.startsWith(URL_SEARCH_PREFIX)) { if (query.startsWith(URL_SEARCH_PREFIX)) {
val mangaUrl = baseUrl.toHttpUrl().newBuilder().apply { val mangaUrl = baseUrl.toHttpUrl().newBuilder().apply {
addPathSegment("manga") addPathSegment(mangaSubString)
addPathSegment(query.substringAfter(URL_SEARCH_PREFIX)) addPathSegment(query.substringAfter(URL_SEARCH_PREFIX))
}.build() }.build()
return client.newCall(GET(mangaUrl, headers)) return client.newCall(GET(mangaUrl, headers))
@ -51,15 +85,40 @@ class HentaiCB : Madara("CBHentai", "https://hentaicube.xyz", "vi", SimpleDateFo
return super.fetchSearchManga(page, queryFixed, filters) return super.fetchSearchManga(page, queryFixed, filters)
} }
private val oldMangaUrlRegex = Regex("""^$baseUrl/read/""") private val oldMangaUrlRegex = Regex("^$baseUrl/\\w+/")
// Change old entries from 'read' to 'manga' // Change old entries from mangaSubString
override fun getMangaUrl(manga: SManga): String { override fun getMangaUrl(manga: SManga): String {
return super.getMangaUrl(manga) return super.getMangaUrl(manga)
.replace(oldMangaUrlRegex, "$baseUrl/manga/") .replace(oldMangaUrlRegex, "$baseUrl/$mangaSubString/")
} }
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
return super.pageListParse(document).distinctBy { it.imageUrl } return super.pageListParse(document).distinctBy { it.imageUrl }
} }
override fun setupPreferenceScreen(screen: PreferenceScreen) {
EditTextPreference(screen.context).apply {
key = BASE_URL_PREF
title = BASE_URL_PREF_TITLE
summary = BASE_URL_PREF_SUMMARY
setDefaultValue(super.baseUrl)
dialogTitle = BASE_URL_PREF_TITLE
dialogMessage = "Default: ${super.baseUrl}"
setOnPreferenceChangeListener { _, _ ->
Toast.makeText(screen.context, RESTART_APP, Toast.LENGTH_LONG).show()
true
}
}.let(screen::addPreference)
}
companion object {
private const val DEFAULT_BASE_URL_PREF = "defaultBaseUrl"
private const val RESTART_APP = "Khởi chạy lại ứng dụng để áp dụng thay đổi."
private const val BASE_URL_PREF_TITLE = "Ghi đè URL cơ sở"
private const val BASE_URL_PREF = "overrideBaseUrl"
private const val BASE_URL_PREF_SUMMARY =
"Dành cho sử dụng tạm thời, cập nhật tiện ích sẽ xóa cài đặt."
}
} }