TopTruyen, DocTruyen3Q: option automatically change domain (#8417)

* add option automatic change domain

add option automatic change domain TopTruyen and DocTruyen3Q

* update
This commit is contained in:
Fioren 2025-04-10 23:29:42 +07:00 committed by Draff
parent eb9b9b9aee
commit fe7d5c5019
Signed by: Draff
GPG Key ID: E8A89F3211677653
4 changed files with 82 additions and 20 deletions

View File

@ -2,8 +2,8 @@ ext {
extName = 'DocTruyen3Q' extName = 'DocTruyen3Q'
extClass = '.DocTruyen3Q' extClass = '.DocTruyen3Q'
themePkg = 'wpcomics' themePkg = 'wpcomics'
baseUrl = 'https://doctruyen3qui5.pro' baseUrl = 'https://doctruyen3qui6.pro'
overrideVersionCode = 7 overrideVersionCode = 8
isNsfw = true isNsfw = true
} }

View File

@ -23,7 +23,7 @@ import java.util.TimeZone
class DocTruyen3Q : class DocTruyen3Q :
WPComics( WPComics(
"DocTruyen3Q", "DocTruyen3Q",
"https://doctruyen3qui5.pro", "https://doctruyen3qui6.pro",
"vi", "vi",
dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.ROOT).apply { dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.ROOT).apply {
timeZone = TimeZone.getTimeZone("Asia/Ho_Chi_Minh") timeZone = TimeZone.getTimeZone("Asia/Ho_Chi_Minh")
@ -31,10 +31,6 @@ class DocTruyen3Q :
gmtOffset = null, gmtOffset = null,
), ),
ConfigurableSource { ConfigurableSource {
override val client = super.client.newBuilder()
.rateLimit(3)
.build()
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
return document.select(".page-chapter[id] img").mapIndexed { index, element -> return document.select(".page-chapter[id] img").mapIndexed { index, element ->
@ -100,7 +96,30 @@ class DocTruyen3Q :
override val genresSelector = ".categories-detail ul.nav li:not(.active) a" override val genresSelector = ".categories-detail ul.nav li:not(.active) a"
// Configurable, automatic change domain
private val preferences: SharedPreferences = getPreferences() private val preferences: SharedPreferences = getPreferences()
private var hasCheckedRedirect = false
// Catch redirects
override val client = super.client.newBuilder()
.addInterceptor { chain ->
val originalRequest = chain.request()
val response = chain.proceed(originalRequest)
if (!hasCheckedRedirect && preferences.getBoolean(AUTO_CHANGE_DOMAIN_PREF, false)) {
hasCheckedRedirect = true
val originalHost = super.baseUrl.toHttpUrl().host
val newHost = response.request.url.host
if (newHost != originalHost) {
val newBaseUrl = "${response.request.url.scheme}://$newHost"
preferences.edit()
.putString(BASE_URL_PREF, newBaseUrl)
.apply()
}
}
response
}
.rateLimit(5)
.build()
init { init {
preferences.getString(DEFAULT_BASE_URL_PREF, null).let { prefDefaultBaseUrl -> preferences.getString(DEFAULT_BASE_URL_PREF, null).let { prefDefaultBaseUrl ->
@ -116,20 +135,28 @@ class DocTruyen3Q :
override val baseUrl by lazy { getPrefBaseUrl() } override val baseUrl by lazy { getPrefBaseUrl() }
override fun setupPreferenceScreen(screen: PreferenceScreen) { override fun setupPreferenceScreen(screen: PreferenceScreen) {
val defaultUrl = super.baseUrl
val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply { val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply {
key = BASE_URL_PREF key = BASE_URL_PREF
title = BASE_URL_PREF_TITLE title = BASE_URL_PREF_TITLE
summary = BASE_URL_PREF_SUMMARY summary = BASE_URL_PREF_SUMMARY
setDefaultValue(super.baseUrl) setDefaultValue(defaultUrl)
dialogTitle = BASE_URL_PREF_TITLE dialogTitle = BASE_URL_PREF_TITLE
dialogMessage = "Default: ${super.baseUrl}" dialogMessage = "Default: $defaultUrl"
setOnPreferenceChangeListener { _, _ -> setOnPreferenceChangeListener { _, _ ->
Toast.makeText(screen.context, RESTART_APP, Toast.LENGTH_LONG).show() Toast.makeText(screen.context, RESTART_APP, Toast.LENGTH_LONG).show()
true true
} }
} }
screen.addPreference(baseUrlPref) screen.addPreference(baseUrlPref)
val autoDomainPref = androidx.preference.SwitchPreferenceCompat(screen.context).apply {
key = AUTO_CHANGE_DOMAIN_PREF
title = AUTO_CHANGE_DOMAIN_TITLE
summary = AUTO_CHANGE_DOMAIN_SUMMARY
setDefaultValue(false)
}
screen.addPreference(autoDomainPref)
} }
private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, super.baseUrl)!! private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, super.baseUrl)!!
@ -141,5 +168,9 @@ class DocTruyen3Q :
private const val BASE_URL_PREF = "overrideBaseUrl" private const val BASE_URL_PREF = "overrideBaseUrl"
private const val BASE_URL_PREF_SUMMARY = 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." "Dành cho sử dụng tạm thời, cập nhật tiện ích sẽ xóa cài đặt."
private const val AUTO_CHANGE_DOMAIN_PREF = "autoChangeDomain"
private const val AUTO_CHANGE_DOMAIN_TITLE = "Tự động cập nhật domain"
private const val AUTO_CHANGE_DOMAIN_SUMMARY =
"Khi mở ứng dụng, ứng dụng sẽ tự động cập nhật domain mới nếu website chuyển hướng."
} }
} }

View File

@ -2,8 +2,8 @@ ext {
extName = 'Top Truyen' extName = 'Top Truyen'
extClass = '.TopTruyen' extClass = '.TopTruyen'
themePkg = 'wpcomics' themePkg = 'wpcomics'
baseUrl = 'https://www.toptruyentv3.pro' baseUrl = 'https://www.toptruyentv5.pro'
overrideVersionCode = 11 overrideVersionCode = 12
isNsfw = true isNsfw = true
} }

View File

@ -23,7 +23,7 @@ import java.util.TimeZone
class TopTruyen : class TopTruyen :
WPComics( WPComics(
"Top Truyen", "Top Truyen",
"https://www.toptruyentv3.pro", "https://www.toptruyentv5.pro",
"vi", "vi",
dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.ROOT).apply { dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.ROOT).apply {
timeZone = TimeZone.getTimeZone("Asia/Ho_Chi_Minh") timeZone = TimeZone.getTimeZone("Asia/Ho_Chi_Minh")
@ -32,10 +32,6 @@ class TopTruyen :
), ),
ConfigurableSource { ConfigurableSource {
override val client = super.client.newBuilder()
.rateLimit(3)
.build()
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
return document.select("div[id^=page_].page-chapter img").mapIndexed { index, element -> return document.select("div[id^=page_].page-chapter img").mapIndexed { index, element ->
val img = element.attr("abs:src") val img = element.attr("abs:src")
@ -94,7 +90,30 @@ class TopTruyen :
override val genresSelector = ".categories-detail ul.nav li:not(.active) a" override val genresSelector = ".categories-detail ul.nav li:not(.active) a"
// Configurable, automatic change domain
private val preferences: SharedPreferences = getPreferences() private val preferences: SharedPreferences = getPreferences()
private var hasCheckedRedirect = false
// Catch redirects
override val client = super.client.newBuilder()
.addInterceptor { chain ->
val originalRequest = chain.request()
val response = chain.proceed(originalRequest)
if (!hasCheckedRedirect && preferences.getBoolean(AUTO_CHANGE_DOMAIN_PREF, false)) {
hasCheckedRedirect = true
val originalHost = super.baseUrl.toHttpUrl().host
val newHost = response.request.url.host
if (newHost != originalHost) {
val newBaseUrl = "${response.request.url.scheme}://$newHost"
preferences.edit()
.putString(BASE_URL_PREF, newBaseUrl)
.apply()
}
}
response
}
.rateLimit(5)
.build()
init { init {
preferences.getString(DEFAULT_BASE_URL_PREF, null).let { prefDefaultBaseUrl -> preferences.getString(DEFAULT_BASE_URL_PREF, null).let { prefDefaultBaseUrl ->
@ -110,20 +129,28 @@ class TopTruyen :
override val baseUrl by lazy { getPrefBaseUrl() } override val baseUrl by lazy { getPrefBaseUrl() }
override fun setupPreferenceScreen(screen: PreferenceScreen) { override fun setupPreferenceScreen(screen: PreferenceScreen) {
val defaultUrl = super.baseUrl
val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply { val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply {
key = BASE_URL_PREF key = BASE_URL_PREF
title = BASE_URL_PREF_TITLE title = BASE_URL_PREF_TITLE
summary = BASE_URL_PREF_SUMMARY summary = BASE_URL_PREF_SUMMARY
setDefaultValue(super.baseUrl) setDefaultValue(defaultUrl)
dialogTitle = BASE_URL_PREF_TITLE dialogTitle = BASE_URL_PREF_TITLE
dialogMessage = "Default: ${super.baseUrl}" dialogMessage = "Default: $defaultUrl"
setOnPreferenceChangeListener { _, _ -> setOnPreferenceChangeListener { _, _ ->
Toast.makeText(screen.context, RESTART_APP, Toast.LENGTH_LONG).show() Toast.makeText(screen.context, RESTART_APP, Toast.LENGTH_LONG).show()
true true
} }
} }
screen.addPreference(baseUrlPref) screen.addPreference(baseUrlPref)
val autoDomainPref = androidx.preference.SwitchPreferenceCompat(screen.context).apply {
key = AUTO_CHANGE_DOMAIN_PREF
title = AUTO_CHANGE_DOMAIN_TITLE
summary = AUTO_CHANGE_DOMAIN_SUMMARY
setDefaultValue(false)
}
screen.addPreference(autoDomainPref)
} }
private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, super.baseUrl)!! private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, super.baseUrl)!!
@ -135,5 +162,9 @@ class TopTruyen :
private const val BASE_URL_PREF = "overrideBaseUrl" private const val BASE_URL_PREF = "overrideBaseUrl"
private const val BASE_URL_PREF_SUMMARY = 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." "Dành cho sử dụng tạm thời, cập nhật tiện ích sẽ xóa cài đặt."
private const val AUTO_CHANGE_DOMAIN_PREF = "autoChangeDomain"
private const val AUTO_CHANGE_DOMAIN_TITLE = "Tự động cập nhật domain"
private const val AUTO_CHANGE_DOMAIN_SUMMARY =
"Khi mở ứng dụng, ứng dụng sẽ tự động cập nhật domain mới nếu website chuyển hướng."
} }
} }