1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-05 07:20:23 +08:00
修复
1. 近期无法加载的问题 (fix #139)
This commit is contained in:
源文雨
2025-05-27 22:41:15 +09:00
parent 98b2d1a4ae
commit b4a6be8470
21 changed files with 84 additions and 63 deletions

View File

@@ -11,8 +11,8 @@ android {
applicationId 'top.fumiama.copymanga' applicationId 'top.fumiama.copymanga'
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 34 targetSdkVersion 34
versionCode 71 versionCode 72
versionName '2.5.0' versionName '2.5.1'
resourceConfigurations += ['zh', 'zh-rCN'] resourceConfigurations += ['zh', 'zh-rCN']
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -55,7 +55,7 @@ object Config {
"region", "region",
if (net_use_foreign.value) "1" else "0" if (net_use_foreign.value) "1" else "0"
) )
.addHeader("platform", "3") .addHeader("platform", platform.value)
.build() .build()
return field return field
} }
@@ -78,7 +78,7 @@ object Config {
mHostApiUrlsMutex.withLock { mHostApiUrlsMutex.withLock {
if (mHostApiUrls.isNotEmpty()) return@runBlocking if (mHostApiUrls.isNotEmpty()) return@runBlocking
try { try {
val u = getString(R.string.networkApiUrl).format(networkApiUrl.value) val u = getString(R.string.networkApiUrl).format(networkApiUrl.value, platform.value)
val r = Gson().fromJson((apiProxy?.comancry(u) { val r = Gson().fromJson((apiProxy?.comancry(u) {
DownloadTools.getHttpContent(it, referer, pc_ua) DownloadTools.getHttpContent(it, referer, pc_ua)
}?:DownloadTools.getHttpContent(u, referer, pc_ua)).decodeToString(), NetworkStructure::class.java) }?:DownloadTools.getHttpContent(u, referer, pc_ua)).decodeToString(), NetworkStructure::class.java)
@@ -107,6 +107,7 @@ object Config {
val navTextInfo = UserPreferenceString("navTextInfo", R.string.navTextInfo) val navTextInfo = UserPreferenceString("navTextInfo", R.string.navTextInfo)
val proxy_key = PreferenceString(R.string.imgProxyCodeKeyID) val proxy_key = PreferenceString(R.string.imgProxyCodeKeyID)
val app_ver = PreferenceString("settings_cat_general_et_app_version", R.string.app_ver) val app_ver = PreferenceString("settings_cat_general_et_app_version", R.string.app_ver)
val platform = PreferenceString("settings_cat_general_et_platform", R.string.platform)
val token = UserPreferenceString("token", "", null) val token = UserPreferenceString("token", "", null)
val pc_ua get() = MainActivity.mainWeakReference?.get()?.getString(R.string.pc_ua)?.format(app_ver.value)?:"" val pc_ua get() = MainActivity.mainWeakReference?.get()?.getString(R.string.pc_ua)?.format(app_ver.value)?:""
val referer get() = MainActivity.mainWeakReference?.get()?.getString(R.string.referer)?.format(app_ver.value)?:"" val referer get() = MainActivity.mainWeakReference?.get()?.getString(R.string.referer)?.format(app_ver.value)?:""
@@ -143,5 +144,5 @@ object Config {
fun getChapterInfoApiUrl(path: String?, uuid: String?, version: Int) = fun getChapterInfoApiUrl(path: String?, uuid: String?, version: Int) =
MainActivity.mainWeakReference?.get()?.getString(R.string.chapterInfoApiUrl) MainActivity.mainWeakReference?.get()?.getString(R.string.chapterInfoApiUrl)
?.format(myHostApiUrl.random(), path, if (version >= 2) "$version" else "" , uuid) ?.format(myHostApiUrl.random(), path, if (version >= 2) "$version" else "" , uuid, platform.value)
} }

View File

@@ -15,7 +15,7 @@ import top.fumiama.dmzj.copymanga.R
import java.io.File import java.io.File
class Book(val path: String, private val getString: (Int) -> String, private val exDir: File, private val loadCache: Boolean = false, private val mPassName: String? = null) { class Book(val path: String, private val getString: (Int) -> String, private val exDir: File, private val loadCache: Boolean = false, private val mPassName: String? = null) {
private val mBookApiUrl = getString(R.string.bookInfoApiUrl).format(Config.myHostApiUrl.random(), path) private val mBookApiUrl = getString(R.string.bookInfoApiUrl).format(Config.myHostApiUrl.random(), path, Config.platform.value)
private val mUserAgent = getString(R.string.pc_ua).format(Config.app_ver.value) private val mUserAgent = getString(R.string.pc_ua).format(Config.app_ver.value)
private var mBook: BookInfoStructure? = null private var mBook: BookInfoStructure? = null
private var mGroupPathWords = arrayOf<String>() private var mGroupPathWords = arrayOf<String>()

View File

@@ -12,8 +12,8 @@ import top.fumiama.dmzj.copymanga.R
class Shelf(private val getString: (Int) -> String) { class Shelf(private val getString: (Int) -> String) {
private val apiUrl: String get() = getString(R.string.shelfOperateApiUrl).format(Config.myHostApiUrl.random()) private val apiUrl: String get() = getString(R.string.shelfOperateApiUrl).format(Config.myHostApiUrl.random())
private val queryApiUrlTemplate = getString(R.string.bookUserQueryApiUrl) private val queryApiUrlTemplate = getString(R.string.bookUserQueryApiUrl)
private val addApiUrl get() = "$apiUrl?platform=3" private val addApiUrl get() = "$apiUrl?platform=${Config.platform.value}"
private val delApiUrl get() = "${apiUrl}s?platform=3" private val delApiUrl get() = "${apiUrl}s?platform=${Config.platform.value}"
suspend fun add(comicId: String): String = withContext(Dispatchers.IO) { suspend fun add(comicId: String): String = withContext(Dispatchers.IO) {
if (comicId.isEmpty()) { if (comicId.isEmpty()) {
return@withContext "空漫画ID" return@withContext "空漫画ID"
@@ -68,7 +68,7 @@ class Shelf(private val getString: (Int) -> String) {
suspend fun query(pathWord: String): BookQueryStructure? = withContext(Dispatchers.IO) { suspend fun query(pathWord: String): BookQueryStructure? = withContext(Dispatchers.IO) {
try { try {
val queryUrl = queryApiUrlTemplate.format(Config.myHostApiUrl.random(), pathWord) val queryUrl = queryApiUrlTemplate.format(Config.myHostApiUrl.random(), pathWord, Config.platform.value)
(Config.apiProxy?.comancry(queryUrl) { url -> (Config.apiProxy?.comancry(queryUrl) { url ->
DownloadTools.getHttpContent(url, Config.referer) DownloadTools.getHttpContent(url, Config.referer)
}?:DownloadTools.getHttpContent(queryUrl, Config.referer)).let { }?:DownloadTools.getHttpContent(queryUrl, Config.referer)).let {

View File

@@ -39,7 +39,7 @@ class Volume(private val path: String, private val groupPathWord: String, getStr
return@withContext mVolume return@withContext mVolume
} }
private fun getApiUrl(offset: Int) = mGroupInfoApiUrlTemplate.format(Config.myHostApiUrl.random(), path, groupPathWord, offset) private fun getApiUrl(offset: Int) = mGroupInfoApiUrlTemplate.format(Config.myHostApiUrl.random(), path, groupPathWord, offset, Config.platform.value)
private suspend fun download(re: Array<VolumeStructure?>, offset: Int, c: Int) = withContext(Dispatchers.IO) { private suspend fun download(re: Array<VolumeStructure?>, offset: Int, c: Int) = withContext(Dispatchers.IO) {
Log.d("MyV", "下载偏移: $offset") Log.d("MyV", "下载偏移: $offset")
getApiUrl(offset).let { getApiUrl(offset).let {

View File

@@ -49,7 +49,7 @@ class Member(private val getString: (Int) -> String) {
} }
try { try {
val u = getString(R.string.memberInfoApiUrl) val u = getString(R.string.memberInfoApiUrl)
.format(Config.myHostApiUrl.random()) .format(Config.myHostApiUrl.random(), Config.platform.value)
val data = (Config.apiProxy?.comancry(u) { val data = (Config.apiProxy?.comancry(u) {
DownloadTools.getHttpContent(it) DownloadTools.getHttpContent(it)
}?:DownloadTools.getHttpContent(u)).decodeToString() }?:DownloadTools.getHttpContent(u)).decodeToString()
@@ -97,7 +97,7 @@ class Member(private val getString: (Int) -> String) {
} }
private suspend fun postLogin(username: String, pwd: String, salt: Int): ByteArray? = private suspend fun postLogin(username: String, pwd: String, salt: Int): ByteArray? =
getString(R.string.loginApiUrl).format(Config.myHostApiUrl.random()).let { u -> getString(R.string.loginApiUrl).format(Config.myHostApiUrl.random(), Config.platform.value).let { u ->
val use: suspend (String) -> ByteArray? = { it: String -> val use: suspend (String) -> ByteArray? = { it: String ->
DownloadTools.getApiConnection(it, "POST").let { c -> DownloadTools.getApiConnection(it, "POST").let { c ->
c.doOutput = true c.doOutput = true
@@ -105,7 +105,7 @@ class Member(private val getString: (Int) -> String) {
"content-type", "content-type",
"application/x-www-form-urlencoded;charset=utf-8" "application/x-www-form-urlencoded;charset=utf-8"
) )
c.setRequestProperty("platform", "3") c.setRequestProperty("platform", Config.platform.value)
c.setRequestProperty("accept", "application/json") c.setRequestProperty("accept", "application/json")
val r = if (!Config.net_use_foreign.value) "1" else "0" val r = if (!Config.net_use_foreign.value) "1" else "0"
val pwdEncoded = val pwdEncoded =
@@ -116,7 +116,7 @@ class Member(private val getString: (Int) -> String) {
username, username,
Charset.defaultCharset().name() Charset.defaultCharset().name()
) )
}&password=$pwdEncoded&salt=$salt&platform=3&authorization=Token+&version=${Config.app_ver.value}&source=copyApp&region=$r&webp=1".toByteArray() }&password=$pwdEncoded&salt=$salt&platform=${Config.platform.value}&authorization=Token+&version=${Config.app_ver.value}&source=copyApp&region=$r&webp=1".toByteArray()
) )
c.outputStream.close() c.outputStream.close()
val b = c.inputStream.readBytes() val b = c.inputStream.readBytes()
@@ -129,11 +129,11 @@ class Member(private val getString: (Int) -> String) {
private suspend fun postComandyLogin(username: String, pwd: String, salt: Int) = private suspend fun postComandyLogin(username: String, pwd: String, salt: Int) =
getString(R.string.loginApiUrl).format(Config.myHostApiUrl.random()).let { u -> getString(R.string.loginApiUrl).format(Config.myHostApiUrl.random(), Config.platform.value).let { u ->
val use: suspend (String) -> ByteArray? = { it: String -> val use: suspend (String) -> ByteArray? = { it: String ->
DownloadTools.getComandyApiConnection(it, "POST", null, Config.pc_ua).apply { DownloadTools.getComandyApiConnection(it, "POST", null, Config.pc_ua).apply {
headers["content-type"] = "application/x-www-form-urlencoded;charset=utf-8" headers["content-type"] = "application/x-www-form-urlencoded;charset=utf-8"
headers["platform"] = "3" headers["platform"] = Config.platform.value
headers["accept"] = "application/json" headers["accept"] = "application/json"
val r = if (!Config.net_use_foreign.value) "1" else "0" val r = if (!Config.net_use_foreign.value) "1" else "0"
val pwdEncoded = val pwdEncoded =
@@ -143,7 +143,7 @@ class Member(private val getString: (Int) -> String) {
username, username,
Charset.defaultCharset().name() Charset.defaultCharset().name()
) )
}&password=$pwdEncoded&salt=$salt&platform=3&authorization=Token+&version=${Config.app_ver.value}&source=copyApp&region=$r&webp=1" }&password=$pwdEncoded&salt=$salt&platform=${Config.platform.value}&authorization=Token+&version=${Config.app_ver.value}&source=copyApp&region=$r&webp=1"
}.let { capsule -> }.let { capsule ->
try { try {
val para = Gson().toJson(capsule) val para = Gson().toJson(capsule)

View File

@@ -46,7 +46,7 @@ object DownloadTools {
Config.token.value?.let { tk -> Config.token.value?.let { tk ->
setRequestProperty("authorization", "Token $tk") setRequestProperty("authorization", "Token $tk")
} }
setRequestProperty("platform", "3") setRequestProperty("platform", Config.platform.value)
} }
Log.d("MyDT", "getConnection: $url\n${connection.requestProperties.map { "${it.key}: ${it.value}" }.joinToString("\n")}") Log.d("MyDT", "getConnection: $url\n${connection.requestProperties.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
return connection return connection
@@ -74,7 +74,7 @@ object DownloadTools {
capsule.headers["authorization"] = "Token $tk" capsule.headers["authorization"] = "Token $tk"
} }
} }
capsule.headers["platform"] = "3" capsule.headers["platform"] = Config.platform.value
capsule.headers["dt"] = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).format(Calendar.getInstance().time) capsule.headers["dt"] = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).format(Calendar.getInstance().time)
Log.d("MyDT", "getComandyConnection: $url\n${capsule.headers.map { "${it.key}: ${it.value}" }.joinToString("\n")}") Log.d("MyDT", "getComandyConnection: $url\n${capsule.headers.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
capsule capsule

View File

@@ -11,7 +11,7 @@ import top.fumiama.dmzj.copymanga.R
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
class HistoryFragment : InfoCardLoader(R.layout.fragment_history, R.id.action_nav_history_to_nav_book, isHistoryBook = true) { class HistoryFragment : InfoCardLoader(R.layout.fragment_history, R.id.action_nav_history_to_nav_book, isHistoryBook = true) {
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.historyApiUrl).format(Config.myHostApiUrl.random(), page * 21) getString(R.string.historyApiUrl).format(Config.myHostApiUrl.random(), page * 21, Config.platform.value)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
if (MainActivity.member?.hasLogin != true) { if (MainActivity.member?.hasLogin != true) {

View File

@@ -7,5 +7,5 @@ import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi @ExperimentalStdlibApi
class NewestFragment : InfoCardLoader(R.layout.fragment_newest, R.id.action_nav_newest_to_nav_book, true) { class NewestFragment : InfoCardLoader(R.layout.fragment_newest, R.id.action_nav_newest_to_nav_book, true) {
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.newestApiUrl).format(Config.myHostApiUrl.random(), page * 21) getString(R.string.newestApiUrl).format(Config.myHostApiUrl.random(), page * 21, Config.platform.value)
} }

View File

@@ -48,11 +48,12 @@ class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.rankApiUrl).format( getString(R.string.rankApiUrl).format(
Config.myHostApiUrl.random(), Config.myHostApiUrl.random(),
page * 21, page * 21,
sortWay[sortValue], sortWay[sortValue],
audienceWay[audience] audienceWay[audience],
) Config.platform.value
)
override fun setListeners() { override fun setListeners() {
super.setListeners() super.setListeners()

View File

@@ -7,5 +7,5 @@ import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi @ExperimentalStdlibApi
class RecFragment : InfoCardLoader(R.layout.fragment_recommend, R.id.action_nav_recommend_to_nav_book, true) { class RecFragment : InfoCardLoader(R.layout.fragment_recommend, R.id.action_nav_recommend_to_nav_book, true) {
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.recommendApiUrl).format(Config.myHostApiUrl.random(), page * 21) getString(R.string.recommendApiUrl).format(Config.myHostApiUrl.random(), page * 21, Config.platform.value)
} }

View File

@@ -13,7 +13,7 @@ class SearchFragment : InfoCardLoader(R.layout.fragment_search, R.id.action_nav_
private var query: String? = null private var query: String? = null
private var type: String? = null private var type: String? = null
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.searchApiUrl).format(Config.myHostApiUrl.random(), page * 21, query, type) getString(R.string.searchApiUrl).format(Config.myHostApiUrl.random(), page * 21, query, type, Config.platform.value)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View File

@@ -28,7 +28,8 @@ class ShelfFragment : InfoCardLoader(R.layout.fragment_shelf, R.id.action_nav_su
getString(R.string.shelfApiUrl).format( getString(R.string.shelfApiUrl).format(
Config.myHostApiUrl.random(), Config.myHostApiUrl.random(),
page * 21, page * 21,
sortWay[sortValue] sortWay[sortValue],
Config.platform.value,
) )
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -25,12 +25,13 @@ class SortFragment : StatusCardFlow(0, R.id.action_nav_sort_to_nav_book, R.layou
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.sortApiUrl).format( getString(R.string.sortApiUrl).format(
Config.myHostApiUrl.random(), Config.myHostApiUrl.random(),
page * 21, page * 21,
sortWay[sortValue], sortWay[sortValue],
if(theme >= 0 && theme < (filter?.results?.theme?.size ?: 0)) (filter?.results?.theme?.get(theme)?.path_word ?: "") else "", if(theme >= 0 && theme < (filter?.results?.theme?.size ?: 0)) (filter?.results?.theme?.get(theme)?.path_word ?: "") else "",
if(region >= 0 && region < (filter?.results?.top?.size ?: 0)) (filter?.results?.top?.get(region)?.path_word ?: "") else "", if(region >= 0 && region < (filter?.results?.top?.size ?: 0)) (filter?.results?.top?.get(region)?.path_word ?: "") else "",
) Config.platform.value,
)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -42,7 +43,7 @@ class SortFragment : StatusCardFlow(0, R.id.action_nav_sort_to_nav_book, R.layou
super.setListeners() super.setListeners()
lifecycleScope.launch { lifecycleScope.launch {
setProgress(5) setProgress(5)
PausableDownloader(getString(R.string.filterApiUrl).format(Config.myHostApiUrl.random())) { PausableDownloader(getString(R.string.filterApiUrl).format(Config.myHostApiUrl.random(), Config.platform.value)) {
if(ad?.exit == true) return@PausableDownloader if(ad?.exit == true) return@PausableDownloader
it.let { it.let {
it.inputStream().use { i -> it.inputStream().use { i ->

View File

@@ -18,13 +18,13 @@ import top.fumiama.dmzj.copymanga.R
class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_topic_to_nav_book) { class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_topic_to_nav_book) {
private var type = 1 private var type = 1
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.topicContentApiUrl).format(Config.myHostApiUrl.random(), arguments?.getString("path"), type, offset) getString(R.string.topicContentApiUrl).format(Config.myHostApiUrl.random(), arguments?.getString("path"), type, offset, Config.platform.value)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
lifecycleScope.launch { lifecycleScope.launch {
setProgress(5) setProgress(5)
PausableDownloader(getString(R.string.topicApiUrl).format(Config.myHostApiUrl.random(), arguments?.getString("path"))) { data -> PausableDownloader(getString(R.string.topicApiUrl).format(Config.myHostApiUrl.random(), arguments?.getString("path"), Config.platform.value)) { data ->
setProgress(10) setProgress(10)
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
if(ad?.exit == true) return@withContext if(ad?.exit == true) return@withContext

View File

@@ -299,7 +299,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
query = q.toString() query = q.toString()
activity?.apply { activity?.apply {
PausableDownloader(getString(R.string.searchApiUrl).format(Config.myHostApiUrl.random(), 0, PausableDownloader(getString(R.string.searchApiUrl).format(Config.myHostApiUrl.random(), 0,
URLEncoder.encode(q.toString(), Charset.defaultCharset().name()), type)) { URLEncoder.encode(q.toString(), Charset.defaultCharset().name()), type, Config.platform.value)) {
results = Gson().fromJson(it.decodeToString(), BookListStructure::class.java) results = Gson().fromJson(it.decodeToString(), BookListStructure::class.java)
count = results?.results?.total?:0 count = results?.results?.total?:0
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {

View File

@@ -40,7 +40,7 @@ import java.lang.ref.WeakReference
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadHandler({ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadHandler({
that.get()?.getString(R.string.mainPageApiUrl)!!.format(Config.myHostApiUrl.random()) that.get()?.getString(R.string.mainPageApiUrl)!!.format(Config.myHostApiUrl.random(), Config.platform.value)
}, },
IndexStructure::class.java, IndexStructure::class.java,
that.get() that.get()

View File

@@ -20,7 +20,8 @@ open class StatusCardFlow(private val api: Int, nav: Int, inflateRes: Int,
getString(api).format( getString(api).format(
Config.myHostApiUrl.random(), Config.myHostApiUrl.random(),
page * 21, page * 21,
sortWay[sortValue] sortWay[sortValue],
Config.platform.value,
) )
override fun setListeners() { override fun setListeners() {

View File

@@ -15,7 +15,8 @@ open class ThemeCardFlow(private val api: Int, nav: Int) : StatusCardFlow(0, nav
Config.myHostApiUrl.random(), Config.myHostApiUrl.random(),
page * 21, page * 21,
sortWay[sortValue], sortWay[sortValue],
theme theme,
Config.platform.value,
) )
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -3,6 +3,7 @@
<!ENTITY hosturl "api.copy-manga.com"> <!ENTITY hosturl "api.copy-manga.com">
<!ENTITY appver "2.3.0"> <!ENTITY appver "2.3.0">
<!ENTITY proxyurl "copymanga.azurewebsites.net"> <!ENTITY proxyurl "copymanga.azurewebsites.net">
<!ENTITY platform "1">
]> ]>
<resources> <resources>
<string name="app_name">拷贝漫画</string> <string name="app_name">拷贝漫画</string>
@@ -63,30 +64,30 @@
<string name="touch_img_error">预载图片头失败</string> <string name="touch_img_error">预载图片头失败</string>
<string name="analyze_img_size_error">读取图片大小失败</string> <string name="analyze_img_size_error">读取图片大小失败</string>
<string name="networkApiUrl">https://%1$s/api/v3/system/network2?platform=3</string> <string name="networkApiUrl">https://%1$s/api/v3/system/network2?platform=%2$s</string>
<string name="mainPageApiUrl">https://%1$s/api/v3/h5/homeIndex?platform=3</string> <string name="mainPageApiUrl">https://%1$s/api/v3/h5/homeIndex?platform=%2$s</string>
<string name="referUrl">https://%1$s</string> <string name="referUrl">https://%1$s</string>
<string name="hostUrl">&hosturl;</string> <string name="hostUrl">&hosturl;</string>
<string name="proxyUrl">&proxyurl;</string> <string name="proxyUrl">&proxyurl;</string>
<string name="rankApiUrl">https://%1$s/api/v3/ranks?limit=21&amp;offset=%2$d&amp;date_type=%3$s&amp;audience_type=%4$s&amp;platform=3</string> <string name="rankApiUrl">https://%1$s/api/v3/ranks?limit=21&amp;offset=%2$d&amp;date_type=%3$s&amp;audience_type=%4$s&amp;platform=%5$s</string>
<string name="searchApiUrl">https://%1$s/api/v3/search/comic?limit=21&amp;offset=%2$d&amp;q=%3$s&amp;q_type=%4$s&amp;platform=3</string> <string name="searchApiUrl">https://%1$s/api/v3/search/comic?limit=21&amp;offset=%2$d&amp;q=%3$s&amp;q_type=%4$s&amp;platform=%5$s</string>
<string name="filterApiUrl">https://%1$s/api/v3/h5/filter/comic/tags?platform=3</string> <string name="filterApiUrl">https://%1$s/api/v3/h5/filter/comic/tags?platform=%2$s</string>
<string name="sortApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;theme=%4$s&amp;top=%5$s&amp;platform=3</string> <string name="sortApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;theme=%4$s&amp;top=%5$s&amp;platform=%6$s</string>
<string name="bookInfoApiUrl">https://%1$s/api/v3/comic2/%2$s?platform=3</string> <string name="bookInfoApiUrl">https://%1$s/api/v3/comic2/%2$s?platform=%3$s</string>
<string name="bookUserQueryApiUrl">https://%1$s/api/v3/comic2/%2$s/query?platform=3</string> <string name="bookUserQueryApiUrl">https://%1$s/api/v3/comic2/%2$s/query?platform=%3$s</string>
<string name="groupInfoApiUrl">https://%1$s/api/v3/comic/%2$s/group/%3$s/chapters?limit=100&amp;offset=%4$d&amp;platform=3</string> <string name="groupInfoApiUrl">https://%1$s/api/v3/comic/%2$s/group/%3$s/chapters?limit=100&amp;offset=%4$d&amp;platform=%5$s</string>
<string name="chapterInfoApiUrl">https://%1$s/api/v3/comic/%2$s/chapter%3$s/%4$s?platform=3</string> <string name="chapterInfoApiUrl">https://%1$s/api/v3/comic/%2$s/chapter%3$s/%4$s?platform=%5$s</string>
<string name="topicApiUrl">https://%1$s/api/v3/topic/%2$s?platform=3</string> <string name="topicApiUrl">https://%1$s/api/v3/topic/%2$s?platform=%3$s</string>
<string name="topicContentApiUrl">https://%1$s/api/v3/topic/%2$s/contents?type=%3$d&amp;limit=21&amp;offset=%4$d&amp;platform=3</string> <string name="topicContentApiUrl">https://%1$s/api/v3/topic/%2$s/contents?type=%3$d&amp;limit=21&amp;offset=%4$d&amp;platform=%5$s</string>
<string name="recommendApiUrl">https://%1$s/api/v3/recs?pos=3200102&amp;limit=21&amp;offset=%2$d&amp;platform=3</string> <string name="recommendApiUrl">https://%1$s/api/v3/recs?pos=3200102&amp;limit=21&amp;offset=%2$d&amp;platform=%3$s</string>
<string name="newestApiUrl">https://%1$s/api/v3/update/newest?limit=21&amp;offset=%2$d&amp;platform=3</string> <string name="newestApiUrl">https://%1$s/api/v3/update/newest?limit=21&amp;offset=%2$d&amp;platform=%3$s</string>
<string name="finishApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;top=finish&amp;platform=3</string> <string name="finishApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;top=finish&amp;platform=%4$s</string>
<string name="authorApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;author=%4$s&amp;platform=3</string> <string name="authorApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;author=%4$s&amp;platform=%5$s</string>
<string name="captionApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;theme=%4$s&amp;platform=3</string> <string name="captionApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;theme=%4$s&amp;platform=%5$s</string>
<string name="loginApiUrl">https://%1$s/api/v3/login?platform=3</string> <string name="loginApiUrl">https://%1$s/api/v3/login?platform=%2$s</string>
<string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=3</string> <string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=%2$s</string>
<string name="historyApiUrl">https://%1$s/api/v3/member/browse/comics?limit=21&amp;offset=%2$d&amp;platform=3</string> <string name="historyApiUrl">https://%1$s/api/v3/member/browse/comics?limit=21&amp;offset=%2$d&amp;platform=%3$s</string>
<string name="shelfApiUrl">https://%1$s/api/v3/member/collect/comics?limit=21&amp;offset=%2$d&amp;free_type=1&amp;ordering=%3$s&amp;platform=3</string> <string name="shelfApiUrl">https://%1$s/api/v3/member/collect/comics?limit=21&amp;offset=%2$d&amp;free_type=1&amp;ordering=%3$s&amp;platform=%4$s</string>
<string name="shelfOperateApiUrl">https://%1$s/api/v3/member/collect/comic</string> <string name="shelfOperateApiUrl">https://%1$s/api/v3/member/collect/comic</string>
<string name="imgProxyApiUrl">https://&proxyurl;/api/img?code=%1$s&amp;url=%2$s</string> <string name="imgProxyApiUrl">https://&proxyurl;/api/img?code=%1$s&amp;url=%2$s</string>
@@ -115,6 +116,7 @@
<string name="pc_ua">COPY/%1$s</string> <string name="pc_ua">COPY/%1$s</string>
<string name="app_ver">&appver;</string> <string name="app_ver">&appver;</string>
<string name="referer">com.copymanga.app-%1$s</string> <string name="referer">com.copymanga.app-%1$s</string>
<string name="platform">&platform;</string>
<string name="menu_update_time">更新时间</string> <string name="menu_update_time">更新时间</string>
<string name="menu_hot">热度</string> <string name="menu_hot">热度</string>
@@ -154,6 +156,8 @@
<string name="settings_cat_general_sb_summary_startup_menu">默认主页</string> <string name="settings_cat_general_sb_summary_startup_menu">默认主页</string>
<string name="settings_cat_general_et_title_app_version">拷贝版本号</string> <string name="settings_cat_general_et_title_app_version">拷贝版本号</string>
<string name="settings_cat_general_et_summary_app_version">默认&appver;</string> <string name="settings_cat_general_et_summary_app_version">默认&appver;</string>
<string name="settings_cat_general_et_title_platform">平台版本号</string>
<string name="settings_cat_general_et_summary_platform">默认&platform;</string>
<string name="settings_cat_general_sb_card_per_row">每行加载卡片数偏移</string> <string name="settings_cat_general_sb_card_per_row">每行加载卡片数偏移</string>
<string name="settings_cat_general_sm_card_per_row">默认为0表示无偏移, 在此基础上加减</string> <string name="settings_cat_general_sm_card_per_row">默认为0表示无偏移, 在此基础上加减</string>
<string name="settings_cat_general_sw_disable_kanban_animation">不显示看板娘动画</string> <string name="settings_cat_general_sw_disable_kanban_animation">不显示看板娘动画</string>

View File

@@ -47,6 +47,17 @@
app:enableCopying="true" app:enableCopying="true"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="settings_cat_general_et_app_version" /> app:key="settings_cat_general_et_app_version" />
<EditTextPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:defaultValue="@string/platform"
android:selectAllOnFocus="false"
android:singleLine="true"
android:title="@string/settings_cat_general_et_title_platform"
android:summary="@string/settings_cat_general_et_summary_platform"
app:enableCopying="true"
app:iconSpaceReserved="false"
app:key="settings_cat_general_et_platform" />
<SeekBarPreference <SeekBarPreference
android:defaultValue="0" android:defaultValue="0"
android:max="8" android:max="8"