Bato.to: update mirrors, pick one at random, deprecated mirror migration (#7317)

* Bato.to: update mirrors, pick one at random

* add 'auto' mirror option

* Do not use a deprecated mirror, even if explicitly set
This commit is contained in:
Vetle Ledaal 2025-02-01 13:30:31 +01:00 committed by Draff
parent 7722a6e458
commit a0e3441507
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
3 changed files with 75 additions and 14 deletions

View File

@ -14,8 +14,12 @@
<data android:host="*.bato.to" />
<data android:host="bato.to" />
<data android:host="*.batocc.com" />
<data android:host="batocc.com" />
<data android:host="*.batocomic.com" />
<data android:host="batocomic.com" />
<data android:host="*.batocomic.net" />
<data android:host="batocomic.net" />
<data android:host="*.batocomic.org" />
<data android:host="batocomic.org" />
<data android:host="*.batotoo.com" />
<data android:host="batotoo.com" />
<data android:host="*.batotwo.com" />
@ -24,18 +28,40 @@
<data android:host="battwo.com" />
<data android:host="*.comiko.net" />
<data android:host="comiko.net" />
<data android:host="*.comiko.org" />
<data android:host="comiko.org" />
<data android:host="*.mangatoto.com" />
<data android:host="mangatoto.com" />
<data android:host="*.mangatoto.net" />
<data android:host="mangatoto.net" />
<data android:host="*.mangatoto.org" />
<data android:host="mangatoto.org" />
<data android:host="*.mycordant.co.uk" />
<data android:host="mycordant.co.uk" />
<data android:host="*.readtoto.com" />
<data android:host="readtoto.com" />
<data android:host="*.readtoto.net" />
<data android:host="readtoto.net" />
<data android:host="*.readtoto.org" />
<data android:host="readtoto.org" />
<data android:host="*.xbato.com" />
<data android:host="xbato.com" />
<data android:host="*.xbato.net" />
<data android:host="xbato.net" />
<data android:host="*.xbato.org" />
<data android:host="xbato.org" />
<data android:host="*.zbato.com" />
<data android:host="zbato.com" />
<data android:host="*.zbato.net" />
<data android:host="zbato.net" />
<data android:host="*.zbato.org" />
<data android:host="zbato.org" />
<data android:host="*.dto.to" />
<data android:host="dto.to" />
<data android:host="*.fto.to" />
<data android:host="fto.to" />
<data android:host="*.hto.to" />
<data android:host="hto.to" />
<data android:host="*.jto.to" />
<data android:host="jto.to" />
<data android:host="*.mto.to" />
<data android:host="mto.to" />
<data android:host="*.wto.to" />

View File

@ -1,7 +1,7 @@
ext {
extName = 'Bato.to'
extClass = '.BatoToFactory'
extVersionCode = 47
extVersionCode = 48
isNsfw = true
}

View File

@ -5,6 +5,7 @@ import android.content.SharedPreferences
import androidx.preference.CheckBoxPreference
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.extension.BuildConfig
import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
import eu.kanade.tachiyomi.lib.cryptoaes.Deobfuscator
import eu.kanade.tachiyomi.network.GET
@ -100,11 +101,25 @@ open class BatoTo(
if (current.isNotEmpty()) {
return current
}
field = getMirrorPref()!!
field = getMirrorPref()
return field
}
private fun getMirrorPref(): String? = preferences.getString("${MIRROR_PREF_KEY}_$lang", MIRROR_PREF_DEFAULT_VALUE)
private fun getMirrorPref(): String {
return preferences.getString("${MIRROR_PREF_KEY}_$lang", MIRROR_PREF_DEFAULT_VALUE)
?.takeUnless { it == MIRROR_PREF_DEFAULT_VALUE }
?: let {
val seed = runCatching {
val pm = Injekt.get<Application>().packageManager
pm.getPackageInfo(BuildConfig.APPLICATION_ID, 0).lastUpdateTime
}.getOrElse {
BuildConfig.VERSION_NAME.hashCode().toLong()
}
MIRROR_PREF_ENTRY_VALUES[1 + (seed % (MIRROR_PREF_ENTRIES.size - 1)).toInt()]
}
}
private fun getAltChapterListPref(): Boolean = preferences.getBoolean("${ALT_CHAPTER_LIST_PREF_KEY}_$lang", ALT_CHAPTER_LIST_PREF_DEFAULT_VALUE)
private fun isRemoveTitleVersion(): Boolean {
return preferences.getBoolean("${REMOVE_TITLE_VERSION_PREF}_$lang", false)
@ -327,6 +342,12 @@ open class BatoTo(
override fun mangaDetailsRequest(manga: SManga): Request {
if (manga.url.startsWith("http")) {
// Check if trying to use a deprecated mirror, force current mirror
val httpUrl = manga.url.toHttpUrl()
if ("https://${httpUrl.host}" in DEPRECATED_MIRRORS) {
val newHttpUrl = httpUrl.newBuilder().host(getMirrorPref().toHttpUrl().host)
return GET(newHttpUrl.build(), headers)
}
return GET(manga.url, headers)
}
return super.mangaDetailsRequest(manga)
@ -414,6 +435,12 @@ open class BatoTo(
GET("$baseUrl/rss/series/$id.xml", headers)
} else if (manga.url.startsWith("http")) {
// Check if trying to use a deprecated mirror, force current mirror
val httpUrl = manga.url.toHttpUrl()
if ("https://${httpUrl.host}" in DEPRECATED_MIRRORS) {
val newHttpUrl = httpUrl.newBuilder().host(getMirrorPref().toHttpUrl().host)
return GET(newHttpUrl.build(), headers)
}
GET(manga.url, headers)
} else {
super.chapterListRequest(manga)
@ -510,6 +537,12 @@ open class BatoTo(
override fun pageListRequest(chapter: SChapter): Request {
if (chapter.url.startsWith("http")) {
// Check if trying to use a deprecated mirror, force current mirror
val httpUrl = chapter.url.toHttpUrl()
if ("https://${httpUrl.host}" in DEPRECATED_MIRRORS) {
val newHttpUrl = httpUrl.newBuilder().host(getMirrorPref().toHttpUrl().host)
return GET(newHttpUrl.build(), headers)
}
return GET(chapter.url, headers)
}
return super.pageListRequest(chapter)
@ -1004,7 +1037,7 @@ open class BatoTo(
private const val MIRROR_PREF_TITLE = "Mirror"
private const val REMOVE_TITLE_VERSION_PREF = "REMOVE_TITLE_VERSION"
private val MIRROR_PREF_ENTRIES = arrayOf(
"zbato.org",
"Auto",
"batocomic.com",
"batocomic.net",
"batocomic.org",
@ -1016,23 +1049,25 @@ open class BatoTo(
"readtoto.com",
"readtoto.net",
"readtoto.org",
"dto.to",
"fto.to",
"jto.to",
"hto.to",
"mto.to",
"wto.to",
"xbato.com",
"xbato.net",
"xbato.org",
"zbato.com",
"zbato.net",
"zbato.org",
"dto.to",
"fto.to",
"hto.to",
"jto.to",
"mto.to",
"wto.to",
)
private val MIRROR_PREF_ENTRY_VALUES = MIRROR_PREF_ENTRIES.map { "https://$it" }.toTypedArray()
private val MIRROR_PREF_DEFAULT_VALUE = MIRROR_PREF_ENTRY_VALUES[0]
private val DEPRECATED_MIRRORS = listOf(
"https://bato.to",
"https://batocc.com", // parked
"https://mangatoto.com",
"https://mangatoto.net",
"https://mangatoto.org",