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="bato.to" /> <data android:host="bato.to" />
<data android:host="*.batocc.com" /> <data android:host="*.batocomic.com" />
<data android:host="batocc.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="batotoo.com" /> <data android:host="batotoo.com" />
<data android:host="*.batotwo.com" /> <data android:host="*.batotwo.com" />
@ -24,18 +28,40 @@
<data android:host="battwo.com" /> <data android:host="battwo.com" />
<data android:host="*.comiko.net" /> <data android:host="*.comiko.net" />
<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.com" /> <data android:host="mangatoto.com" />
<data android:host="*.mangatoto.net" /> <data android:host="*.mangatoto.net" />
<data android:host="mangatoto.net" /> <data android:host="mangatoto.net" />
<data android:host="*.mangatoto.org" /> <data android:host="*.mangatoto.org" />
<data android:host="mangatoto.org" /> <data android:host="mangatoto.org" />
<data android:host="*.mycordant.co.uk" /> <data android:host="*.readtoto.com" />
<data android:host="mycordant.co.uk" /> <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="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="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="mto.to" /> <data android:host="mto.to" />
<data android:host="*.wto.to" /> <data android:host="*.wto.to" />

View File

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

View File

@ -5,6 +5,7 @@ import android.content.SharedPreferences
import androidx.preference.CheckBoxPreference import androidx.preference.CheckBoxPreference
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.extension.BuildConfig
import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
import eu.kanade.tachiyomi.lib.cryptoaes.Deobfuscator import eu.kanade.tachiyomi.lib.cryptoaes.Deobfuscator
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
@ -100,11 +101,25 @@ open class BatoTo(
if (current.isNotEmpty()) { if (current.isNotEmpty()) {
return current return current
} }
field = getMirrorPref()!! field = getMirrorPref()
return field 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 getAltChapterListPref(): Boolean = preferences.getBoolean("${ALT_CHAPTER_LIST_PREF_KEY}_$lang", ALT_CHAPTER_LIST_PREF_DEFAULT_VALUE)
private fun isRemoveTitleVersion(): Boolean { private fun isRemoveTitleVersion(): Boolean {
return preferences.getBoolean("${REMOVE_TITLE_VERSION_PREF}_$lang", false) return preferences.getBoolean("${REMOVE_TITLE_VERSION_PREF}_$lang", false)
@ -327,6 +342,12 @@ open class BatoTo(
override fun mangaDetailsRequest(manga: SManga): Request { override fun mangaDetailsRequest(manga: SManga): Request {
if (manga.url.startsWith("http")) { 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 GET(manga.url, headers)
} }
return super.mangaDetailsRequest(manga) return super.mangaDetailsRequest(manga)
@ -414,6 +435,12 @@ open class BatoTo(
GET("$baseUrl/rss/series/$id.xml", headers) GET("$baseUrl/rss/series/$id.xml", headers)
} else if (manga.url.startsWith("http")) { } 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) GET(manga.url, headers)
} else { } else {
super.chapterListRequest(manga) super.chapterListRequest(manga)
@ -510,6 +537,12 @@ open class BatoTo(
override fun pageListRequest(chapter: SChapter): Request { override fun pageListRequest(chapter: SChapter): Request {
if (chapter.url.startsWith("http")) { 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 GET(chapter.url, headers)
} }
return super.pageListRequest(chapter) return super.pageListRequest(chapter)
@ -1004,7 +1037,7 @@ open class BatoTo(
private const val MIRROR_PREF_TITLE = "Mirror" private const val MIRROR_PREF_TITLE = "Mirror"
private const val REMOVE_TITLE_VERSION_PREF = "REMOVE_TITLE_VERSION" private const val REMOVE_TITLE_VERSION_PREF = "REMOVE_TITLE_VERSION"
private val MIRROR_PREF_ENTRIES = arrayOf( private val MIRROR_PREF_ENTRIES = arrayOf(
"zbato.org", "Auto",
"batocomic.com", "batocomic.com",
"batocomic.net", "batocomic.net",
"batocomic.org", "batocomic.org",
@ -1016,23 +1049,25 @@ open class BatoTo(
"readtoto.com", "readtoto.com",
"readtoto.net", "readtoto.net",
"readtoto.org", "readtoto.org",
"dto.to",
"fto.to",
"jto.to",
"hto.to",
"mto.to",
"wto.to",
"xbato.com", "xbato.com",
"xbato.net", "xbato.net",
"xbato.org", "xbato.org",
"zbato.com", "zbato.com",
"zbato.net", "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_ENTRY_VALUES = MIRROR_PREF_ENTRIES.map { "https://$it" }.toTypedArray()
private val MIRROR_PREF_DEFAULT_VALUE = MIRROR_PREF_ENTRY_VALUES[0] private val MIRROR_PREF_DEFAULT_VALUE = MIRROR_PREF_ENTRY_VALUES[0]
private val DEPRECATED_MIRRORS = listOf( private val DEPRECATED_MIRRORS = listOf(
"https://bato.to", "https://bato.to",
"https://batocc.com", // parked
"https://mangatoto.com", "https://mangatoto.com",
"https://mangatoto.net", "https://mangatoto.net",
"https://mangatoto.org", "https://mangatoto.org",