1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-04 23:10:23 +08:00

v2.0.beta18

新增
1. 自定义API地址
2. 图片代理
修复
1. 文本编辑框不跟随输入法上移
2. 获取图书信息失败(#26)
This commit is contained in:
源文雨
2023-09-05 00:37:53 +08:00
parent 306e69ff3a
commit 49b3f7a1c7
32 changed files with 233 additions and 116 deletions

1
.idea/gradle.xml generated
View File

@@ -14,6 +14,7 @@
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>

1
.idea/misc.xml generated
View File

@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">

View File

@@ -9,8 +9,8 @@ android {
applicationId 'top.fumiama.copymanga'
minSdkVersion 23
targetSdkVersion 33
versionCode 29
versionName '2.0.beta17'
versionCode 30
versionName '2.0.beta18'
resConfigs 'zh', 'zh-rCN'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -25,7 +25,7 @@
<activity
android:name="top.fumiama.copymanga.MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"
android:theme="@style/AppTheme.Default"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -43,7 +43,7 @@
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
<activity
android:name="top.fumiama.copymanga.ui.vm.ViewMangaActivity"
android:theme="@style/AppTheme.NoActionBar"/>
android:theme="@style/AppTheme.Default"/>
</application>
</manifest>

View File

@@ -33,7 +33,7 @@ class LoginActivity:Activity() {
putString("username", it.results?.username)
putString("nickname", it.results?.nickname)
apply()
DownloadTools.getHttpContent(getString(R.string.memberInfoApiUrl))?.decodeToString()?.let {
DownloadTools.getHttpContent(getString(R.string.memberInfoApiUrl).format(CMApi.myHostApiUrl))?.decodeToString()?.let {
val l = Gson().fromJson(it, LoginInfoStructure::class.java)
if(l.code == 200) {
putString("avatar", l.results.avatar)

View File

@@ -58,10 +58,13 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainWeakReference = WeakReference(this)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
//translucentStatusBar()
coordiv.layoutParams.height = getStatusBarHeight()
//coordiv.layoutParams.height = getStatusBarHeight()
navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration(
@@ -79,7 +82,6 @@ class MainActivity : AppCompatActivity() {
nav_view.setupWithNavController(navController!!)
headPic = File(getExternalFilesDir(""), "headPic")
mainWeakReference = WeakReference(this)
drawer_layout.addDrawerListener(object : DrawerLayout.DrawerListener {
override fun onDrawerClosed(drawerView: View) {
Log.d("MyMain", "onDrawerClosed")
@@ -290,14 +292,14 @@ class MainActivity : AppCompatActivity() {
coordiv.layoutParams.height = getStatusBarHeight()
}*/
private fun getStatusBarHeight() =
/*private fun getStatusBarHeight() =
resources.getDimensionPixelOffset(
resources.getIdentifier(
"status_bar_height",
"dimen",
"android"
)
)
)*/
private fun checkUpdate(ignoreSkip: Boolean) {
Thread{

View File

@@ -2,6 +2,7 @@ package top.fumiama.copymanga.template.http
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.http.DownloadTools
class AutoDownloadThread(private val url: String, private val whenFinish: (result: ByteArray?)->Unit): Thread() {
@@ -12,7 +13,7 @@ class AutoDownloadThread(private val url: String, private val whenFinish: (resul
var c = 0
while (!exit && re == null && c++ < 3){
re = DownloadTools.getHttpContent(url,
mainWeakReference?.get()?.getString(R.string.referUrl)!!,
mainWeakReference?.get()?.getString(R.string.referUrl)!!.format(CMApi.myHostApiUrl),
mainWeakReference?.get()?.getString(R.string.pc_ua)!!
)
}

View File

@@ -94,7 +94,10 @@ class CardList(
it.tic.text = name
if(!file.exists()){
that?.context?.let { context ->
if(!exitCardList) Glide.with(context).load(GlideUrl(head, CMApi.myGlideHeaders)).into(it.imic)
if(!exitCardList && head != null)
Glide.with(context).load(
GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders)
).into(it.imic)
}
}else {
val img = File(file, "head.jpg")

View File

@@ -6,6 +6,7 @@ import kotlinx.android.synthetic.main.anchor_popular.view.*
import kotlinx.android.synthetic.main.line_finish.*
import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi
@@ -14,13 +15,11 @@ open class StatusCardFlow(private val api: Int, nav: Int) : InfoCardLoader(R.lay
var sortValue = 0
override fun getApiUrl() =
getString(api).let {
String.format(
it,
page * 21,
sortWay[sortValue]
)
}
getString(api).format(
CMApi.myHostApiUrl,
page * 21,
sortWay[sortValue]
)
override fun setListeners() {
super.setListeners()

View File

@@ -3,19 +3,18 @@ package top.fumiama.copymanga.template.ui
import android.os.Bundle
import kotlinx.android.synthetic.main.app_bar_main.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.tools.api.CMApi
@ExperimentalStdlibApi
open class ThemeCardFlow(private val api: Int, nav: Int) : StatusCardFlow(0, nav) {
private var theme = ""
override fun getApiUrl() =
getString(api).let {
String.format(
it,
page * 21,
sortWay[sortValue],
theme
)
}
getString(api).format(
CMApi.myHostApiUrl,
page * 21,
sortWay[sortValue],
theme
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

View File

@@ -1,16 +1,17 @@
package top.fumiama.copymanga.tools.api
import android.content.Context
import android.util.Base64
import androidx.preference.PreferenceManager
import com.bumptech.glide.load.model.LazyHeaders
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.tools.http.DownloadTools
import top.fumiama.copymanga.tools.http.Proxy
import java.io.File
import java.net.URLEncoder
object CMApi {
var proxy = if(Proxy.useProxy) Proxy() else null
var myGlideHeaders: LazyHeaders? = null
get() {
MainActivity.mainWeakReference?.get()?.let {
@@ -28,10 +29,30 @@ object CMApi {
}
return field
}
var myHostApiUrl: String = ""
get() {
if(field != "") return field
MainActivity.mainWeakReference?.get()?.let {
PreferenceManager.getDefaultSharedPreferences(it).apply {
getString("settings_cat_net_et_api_url", "")?.let { host ->
if(host != "") {
field = host
return host
}
}
}
field = it.getString(R.string.hostUrl)
}
return field
}
fun getZipFile(exDir: File?, manga: String, caption: CharSequence, name: CharSequence) = File(exDir, "$manga/$caption/$name.zip")
fun getApiUrl(id: Int, arg1: String?, arg2: String?) = MainActivity.mainWeakReference?.get()?.getString(id)?.let { String.format(it, arg1, arg2) }
fun getApiUrl(id: Int, arg1: String?, arg2: String?, arg3: Int? = 0) = MainActivity.mainWeakReference?.get()?.getString(id)?.let { String.format(it, arg1, arg2, arg3) }
fun getLoginConnection(username: String, pwd: String, salt: Int) = MainActivity.mainWeakReference?.get()?.getString(R.string.loginApiUrl)?.let {
fun getChapterInfoApiUrl(arg1: String?, arg2: String?) =
MainActivity.mainWeakReference?.get()?.getString(R.string.chapterInfoApiUrl)?.format(myHostApiUrl, arg1, arg2)
fun getGroupInfoApiUrl(arg1: String?, arg2: String?, arg3: Int? = 0) =
MainActivity.mainWeakReference?.get()?.getString(R.string.groupInfoApiUrl)?.format(myHostApiUrl, arg1, arg2, arg3)
fun getLoginConnection(username: String, pwd: String, salt: Int) =
MainActivity.mainWeakReference?.get()?.getString(R.string.loginApiUrl)?.format(myHostApiUrl)?.let {
DownloadTools.getConnection(it, "POST")?.apply {
MainActivity.mainWeakReference?.get()?.let {
PreferenceManager.getDefaultSharedPreferences(it).apply {

View File

@@ -1,6 +1,7 @@
package top.fumiama.copymanga.tools.http
import android.util.Log
import top.fumiama.copymanga.tools.api.CMApi
import java.io.File
import java.lang.Thread.sleep
import java.util.zip.CRC32
@@ -66,7 +67,8 @@ class DownloadPool(folder: String) {
var tryTimes = 3
var s = false
while (!s && tryTimes-- > 0){
s = (DownloadTools.getHttpContent(imgUrls[index], -1))?.let { zip.write(it); true }?:false
val u = imgUrls[index]
s = (DownloadTools.getHttpContent(CMApi.proxy?.wrap(u)?:u, -1))?.let { zip.write(it); true }?:false
if (!s) sleep(2000)
}
if(!s && tryTimes <= 0) {

View File

@@ -8,7 +8,6 @@ import java.net.HttpURLConnection
import java.net.URL
import java.util.concurrent.Callable
import java.util.concurrent.FutureTask
import javax.net.ssl.HttpsURLConnection
object DownloadTools {
fun getConnection(url: String?, method: String = "GET", refer: String? = null, ua: String? = null) =
@@ -37,7 +36,7 @@ object DownloadTools {
}
setRequestProperty("platform", "3")
}
Log.d("Mydl", "getHttp: ${connection.getRequestProperties().map({ "${it.key}: ${it.value}" }).joinToString("\n")}")
Log.d("Mydl", "getHttp: ${connection.requestProperties.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
connection
}
@@ -53,12 +52,12 @@ object DownloadTools {
}
}
fun getHttpContent(Url: String, refer: String? = null, ua: String? = null): ByteArray? {
Log.d("Mydl", "getHttp: $Url")
fun getHttpContent(u: String, refer: String? = null, ua: String? = null): ByteArray? {
Log.d("Mydl", "getHttp: $u")
var ret: ByteArray? = null
val task = FutureTask(Callable {
try {
getConnection(Url, "GET", refer, ua)?.apply {
getConnection(u, "GET", refer, ua)?.apply {
ret = inputStream.readBytes()
disconnect()
}
@@ -76,12 +75,12 @@ object DownloadTools {
}
}
fun getHttpContent(Url: String, readSize: Int): ByteArray? {
Log.d("Mydl", "getHttp: $Url")
fun getHttpContent(u: String, readSize: Int): ByteArray? {
Log.d("Mydl", "getHttp: $u")
var ret: ByteArray? = null
val task = FutureTask(Callable {
try {
val connection = getNormalConnection(Url, "GET")
val connection = getNormalConnection(u, "GET")
val ci = connection?.inputStream
if(readSize > 0) {
ret = ByteArray(readSize)

View File

@@ -0,0 +1,38 @@
package top.fumiama.copymanga.tools.http
import android.util.Log
import androidx.preference.PreferenceManager
import top.fumiama.copymanga.MainActivity
import top.fumiama.dmzj.copymanga.R
import java.net.URLEncoder
import java.nio.charset.Charset
class Proxy(private val code: String) {
constructor(): this(
MainActivity.mainWeakReference?.get()?.let {
PreferenceManager.getDefaultSharedPreferences(it).let {sp ->
sp.getString("settings_cat_net_et_img_proxy_code", "")
}
}?:""
)
fun wrap(u: String): String {
return MainActivity.mainWeakReference?.get()?.getString(R.string.imgProxyApiUrl)
?.format(code, URLEncoder.encode(u, Charset.defaultCharset().name()))
?:u
}
companion object {
val useProxy: Boolean
get() {
MainActivity.mainWeakReference?.get()?.let {
PreferenceManager.getDefaultSharedPreferences(it).apply {
val b = getBoolean("settings_cat_net_sw_use_img_proxy", false)
Log.d("MyProxy", "use proxy: $b")
return b
}
}
return false
}
}
}

View File

@@ -40,8 +40,7 @@ import java.lang.Thread.sleep
import java.lang.ref.WeakReference
class BookHandler(private val th: WeakReference<BookFragment>, private val path: String)
: AutoDownloadHandler(
th.get()?.getString(R.string.bookInfoApiUrl)?.let { String.format(it, path) } ?: "",
: AutoDownloadHandler(th.get()?.getString(R.string.bookInfoApiUrl)?.format(CMApi.myHostApiUrl, path)?: "",
BookInfoStructure::class.java,
Looper.myLooper()!!){
private val that get() = th.get()
@@ -132,13 +131,15 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
(fbibinfo!!.parent as LinearLayout).removeAllViews()
fbl.addView(fbibinfo)
}
val load = Glide.with(this).load(
GlideUrl(book?.results?.comic?.cover, CMApi.myGlideHeaders)
).timeout(10000)
load.into(imic)
context?.let { it1 -> GlideBlurTransformation(it1) }
?.let { it2 -> RequestOptions.bitmapTransform(it2) }
?.let { it3 -> load.apply(it3).into(lbibg) }
book?.results?.comic?.cover?.let { cover ->
val load = Glide.with(this).load(
GlideUrl(CMApi.proxy?.wrap(cover)?:cover, CMApi.myGlideHeaders)
).timeout(10000)
load.into(imic)
context?.let { it1 -> GlideBlurTransformation(it1) }
?.let { it2 -> RequestOptions.bitmapTransform(it2) }
?.let { it3 -> load.apply(it3).into(lbibg) }
}
imf.visibility = View.GONE
fbl.addView(divider)
}
@@ -246,7 +247,10 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
var line: View? = null
val last = v.results.list.size - 1
v.results.list.onEachIndexed { i, it ->
ViewMangaActivity.urlArray += CMApi.getApiUrl(R.string.chapterInfoApiUrl, comic.path_word, it.uuid)?:""
ViewMangaActivity.urlArray += CMApi.getChapterInfoApiUrl(
comic.path_word,
it.uuid
)?:""
ViewMangaActivity.fileArray += CMApi.getZipFile(context?.getExternalFilesDir(""), comic.name, keys[iv], it.name)
chapterNames += it.name
if(line == null) {
@@ -301,7 +305,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
Log.d("MyBFH", "${i}卷共${if(times == 0) 1 else times}次加载")
do {
counts[i] = counts[i] - 100
CMApi.getApiUrl(R.string.groupInfoApiUrl, path, gpw, offset)?.let {
CMApi.getGroupInfoApiUrl(path, gpw, offset)?.let {
Log.d("MyBFH", "get api: $it")
if(ComicDlFragment.exit) return
val ad = AutoDownloadThread(it) { result ->

View File

@@ -4,14 +4,13 @@ import android.view.View
import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R
@OptIn(ExperimentalStdlibApi::class)
class HistoryFragment : InfoCardLoader(R.layout.fragment_history, R.id.action_nav_history_to_nav_book, isHistoryBook = true) {
override fun getApiUrl() =
getString(R.string.historyApiUrl).let {
String.format(it, page * 21)
}
getString(R.string.historyApiUrl).format(CMApi.myHostApiUrl, page * 21)
override fun onLoadFinish() {
super.onLoadFinish()

View File

@@ -4,14 +4,13 @@ import android.view.View
import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi
class NewestFragment : InfoCardLoader(R.layout.fragment_newest, R.id.action_nav_newest_to_nav_book, true) {
override fun getApiUrl() =
getString(R.string.newestApiUrl).let {
String.format(it, page * 21)
}
getString(R.string.newestApiUrl).format(CMApi.myHostApiUrl, page * 21)
override fun onLoadFinish() {
super.onLoadFinish()

View File

@@ -7,6 +7,7 @@ import kotlinx.android.synthetic.main.line_lazybooklines.*
import kotlinx.android.synthetic.main.line_rank.view.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R
import java.lang.Thread.sleep
@@ -16,13 +17,11 @@ class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank
private var sortValue = 0
override fun getApiUrl() =
getString(R.string.rankApiUrl).let {
String.format(
it,
getString(R.string.rankApiUrl).format(
CMApi.myHostApiUrl,
page * 21,
sortWay[sortValue]
)
}
override fun setListeners() {
super.setListeners()

View File

@@ -4,14 +4,13 @@ import android.view.View
import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi
class RecFragment : InfoCardLoader(R.layout.fragment_recommend, R.id.action_nav_recommend_to_nav_book, true) {
override fun getApiUrl() =
getString(R.string.recommendApiUrl).let {
String.format(it, page * 21)
}
getString(R.string.recommendApiUrl).format(CMApi.myHostApiUrl, page * 21)
override fun onLoadFinish() {
super.onLoadFinish()

View File

@@ -12,6 +12,7 @@ import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.FilterStructure
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import java.lang.Thread.sleep
@ExperimentalStdlibApi
@@ -22,20 +23,18 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort
private var filter: FilterStructure? = null
override fun getApiUrl() =
getString(R.string.sortApiUrl).let {
String.format(
it,
getString(R.string.sortApiUrl).format(
CMApi.myHostApiUrl,
page * 21,
sortWay[sortValue],
if(theme >= 0) (filter?.results?.theme?.get(theme)?.path_word ?: "") else ""
)
}
override fun setListeners() {
super.setListeners()
setUpdate()
setHot()
AutoDownloadThread(getString(R.string.filterApiUrl)) {
AutoDownloadThread(getString(R.string.filterApiUrl).format(CMApi.myHostApiUrl)) {
if(ad?.exit == true) return@AutoDownloadThread
it?.let {
filter = Gson().fromJson(it.inputStream().reader(), FilterStructure::class.java)

View File

@@ -10,21 +10,18 @@ import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.TopicStructure
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi
class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_topic_to_nav_book) {
private var type = 1
override fun getApiUrl() =
getString(R.string.topicContentApiUrl).let {
String.format(it, arguments?.getString("path"), type, offset)
}
getString(R.string.topicContentApiUrl).format(CMApi.myHostApiUrl, arguments?.getString("path"), type, offset)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AutoDownloadThread(getString(R.string.topicApiUrl).let {
String.format(it, arguments?.getString("path"))
}) {
AutoDownloadThread(getString(R.string.topicApiUrl).format(CMApi.myHostApiUrl, arguments?.getString("path"))) {
if(ad?.exit == true) return@AutoDownloadThread
it?.apply {
val r = inputStream().reader()

View File

@@ -3,7 +3,6 @@ package top.fumiama.copymanga.ui.comicdl
import android.os.Bundle
import android.os.Looper
import android.util.Log
import android.view.Menu
import android.view.View
import com.google.gson.Gson
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
@@ -97,7 +96,7 @@ class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) {
Log.d("MyCDF", "${i}卷共${if(times == 0) 1 else times}次加载")
do {
counts?.set(i, counts[i] - 100)
CMApi.getApiUrl(R.string.groupInfoApiUrl, pw, gpw, offset)?.let {
CMApi.getGroupInfoApiUrl(pw, gpw, offset)?.let {
if(exit) return
val ad = AutoDownloadThread(it) { result ->
Log.d("MyCDF", "${i}卷返回")

View File

@@ -8,7 +8,6 @@ import android.os.Handler
import android.os.Looper
import android.os.Message
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.widget.Toast
@@ -116,7 +115,7 @@ class ComicDlHandler(looper: Looper, private val th: WeakReference<ComicDlFragme
data += chapter.name
data += chapter.uuid
data += caption
data += CMApi.getApiUrl(R.string.chapterInfoApiUrl, chapter.comic_path_word, chapter.uuid)?:""
data += CMApi.getChapterInfoApiUrl(chapter.comic_path_word, chapter.uuid)?:""
obtainMessage(10, data).sendToTarget()
}
sendEmptyMessage(12) //addDiv
@@ -407,7 +406,10 @@ class ComicDlHandler(looper: Looper, private val th: WeakReference<ComicDlFragme
)
isNewTitle = true
for (chapter in group.chapters) {
val newUrl = CMApi.getApiUrl(R.string.chapterInfoApiUrl, chapter.url.substringAfter("/comic/").substringBefore('/'), chapter.url.substringAfterLast('/'))?:""
val newUrl = CMApi.getChapterInfoApiUrl(
chapter.url.substringAfter("/comic/").substringBefore('/'),
chapter.url.substringAfterLast('/')
)?:""
Log.d("MyCD", "Generate new url: $newUrl")
obtainMessage(10, arrayOf(chapter.name, "", group.name, newUrl)).sendToTarget()
}

View File

@@ -152,7 +152,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
thisBanner?.cover?.let {
//Log.d("MyHomeFVP", "Load img: $it")
Glide.with(this@HomeFragment).load(
GlideUrl(it, CMApi.myGlideHeaders)
GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)
).timeout(10000).into(holder.itemView.vpi)
}
holder.itemView.vpt.text = thisBanner?.brief
@@ -193,7 +193,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
}
holder.itemView.tb.text = popular.toString()
context?.let {
Glide.with(it).load(GlideUrl(cover, CMApi.myGlideHeaders)).into(holder.itemView.imic)
Glide.with(it).load(GlideUrl(CMApi.proxy?.wrap(cover)?:cover, CMApi.myGlideHeaders)).into(holder.itemView.imic)
}
holder.itemView.lwc.setOnClickListener {
val bundle = Bundle()
@@ -208,7 +208,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
fun refresh(query: CharSequence) {
mainWeakReference?.get()?.apply {
AutoDownloadThread(String.format(getString(R.string.searchApiUrl), 0, query, type)) {
AutoDownloadThread(getString(R.string.searchApiUrl).format(CMApi.myHostApiUrl, 0, query, type)) {
results = Gson().fromJson(it?.decodeToString(), BookListStructure::class.java)
runOnUiThread { notifyDataSetChanged() }
}.start()

View File

@@ -33,7 +33,7 @@ import java.lang.Thread.sleep
import java.lang.ref.WeakReference
class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadHandler(
that.get()?.getString(R.string.mainPageApiUrl) ?: "",
that.get()?.getString(R.string.mainPageApiUrl)!!.format(CMApi.myHostApiUrl),
IndexStructure::class.java,
Looper.myLooper()!!,
9
@@ -310,7 +310,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
cv.tic.text = name
homeF?.let {
if(img.startsWith("http")) {
Glide.with(it).load(GlideUrl(img, CMApi.myGlideHeaders)).timeout(20000).into(cv.imic)
Glide.with(it).load(GlideUrl(CMApi.proxy?.wrap(img)?:img, CMApi.myGlideHeaders)).timeout(20000).into(cv.imic)
}
}
if (isFinal) cv.sgnic.visibility = View.VISIBLE

View File

@@ -170,8 +170,10 @@ class ViewMangaActivity : TitleActivityTemplate() {
for (i in right until it.size) {
if(destroy) break
tasks?.let { tasks ->
tasks[i] = DownloadTools.touch(it[i])
Thread.sleep(1000)
it[i]?.let { u ->
tasks[i] = DownloadTools.touch(CMApi.proxy?.wrap(u)?:u)
Thread.sleep(1000)
}
}
}
}.start()
@@ -180,8 +182,10 @@ class ViewMangaActivity : TitleActivityTemplate() {
for (i in left downTo 0) {
if(destroy) break
tasks?.let { tasks ->
tasks[i] = DownloadTools.touch(it[i])
Thread.sleep(1000)
it[i]?.let { u ->
tasks[i] = DownloadTools.touch(CMApi.proxy?.wrap(u)?:u)
Thread.sleep(1000)
}
}
}
}.start()
@@ -198,7 +202,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
forEachIndexed{ i, it ->
if(it != null) {
Thread{
DownloadTools.getHttpContent(it, 1024)?.inputStream()?.let {
DownloadTools.getHttpContent(CMApi.proxy?.wrap(it)?:it, 1024)?.inputStream()?.let {
isCut[i] = canCut(it)
analyzedCnt[i] = true
}
@@ -635,12 +639,12 @@ class ViewMangaActivity : TitleActivityTemplate() {
val thisOneI = holder.itemView.onei
Glide.with(this@ViewMangaActivity)
.asBitmap()
.load(GlideUrl(it, CMApi.myGlideHeaders)
.load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)
).into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
thisOneI.setImageBitmap(cutBitmap(resource, isLeft))
} })
} else Glide.with(this@ViewMangaActivity).load(GlideUrl(it, CMApi.myGlideHeaders)).into(holder.itemView.onei)
} else Glide.with(this@ViewMangaActivity).load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)).into(holder.itemView.onei)
}
}

View File

@@ -18,7 +18,7 @@ import java.security.MessageDigest
object Update {
fun checkUpdate(activity: Activity, toolsBox: UITools, ignoreSkip: Boolean = false) = activity.apply{
val client = Client("copymanga.v6.army", 12316)
val client = Client("reilia.fumiama.top", 13212)
val progressBar = layoutInflater.inflate(R.layout.dialog_progress, null, false)
val progressHandler = object : Client.Progress{
override fun notify(progressPercentage: Int) {

View File

@@ -17,6 +17,7 @@
android:layout_width="match_parent"
android:layout_height="16dp"
android:background="?attr/colorPrimarySurface"
android:visibility="gone"
app:layout_scrollFlags="scroll|enterAlways" />
<androidx.appcompat.widget.Toolbar

View File

@@ -1,3 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY hosturl "api.mangacopy.com">
]>
<resources>
<string name="app_name">拷贝漫画</string>
<string name="action_settings">设定</string>
@@ -8,7 +12,7 @@
<string name="menu_home">主页</string>
<string name="menu_sort">分类</string>
<string name="menu_rank">排行</string>
<string name="app_description">©2022源文雨\n本应用为拷贝漫画的第三方客户端数据均来源于网络作者不对其中所呈现的任何内容负责。</string>
<string name="app_description">©20222023源文雨\n本应用为拷贝漫画的第三方客户端数据均来源于网络作者不对其中所呈现的任何内容负责。</string>
<string name="menu_history">浏览历史</string>
<string name="menu_sub">我的订阅</string>
<string name="menu_download">我的下载</string>
@@ -31,26 +35,28 @@
<string name="null_book">获取图书信息失败</string>
<string name="web_error">网络错误</string>
<string name="mainPageApiUrl">https://api.copymanga.info/api/v3/h5/homeIndex?platform=3</string>
<string name="referUrl">"https://api.copymanga.info"</string>
<string name="hostUrl">"api.copymanga.info"</string>
<string name="rankApiUrl">https://api.copymanga.info/api/v3/ranks?limit=21&amp;offset=%1$d&amp;date_type=%2$s&amp;platform=3</string>
<string name="searchApiUrl">https://api.copymanga.info/api/v3/search/comic?limit=21&amp;offset=%1$d&amp;q=%2$s&amp;q_type=%3$s&amp;platform=3</string>
<string name="filterApiUrl">https://api.copymanga.info/api/v3/h5/filterIndex/comic/tags?platform=3</string>
<string name="sortApiUrl">https://api.copymanga.info/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;theme=%3$s&amp;platform=3</string>
<string name="bookInfoApiUrl">https://api.copymanga.info/api/v3/comic2/%1$s?platform=3</string>
<string name="groupInfoApiUrl">https://api.copymanga.info/api/v3/comic/%1$s/group/%2$s/chapters?limit=100&amp;offset=%3$d&amp;platform=3</string>
<string name="chapterInfoApiUrl">https://api.copymanga.info/api/v3/comic/%1$s/chapter2/%2$s?platform=3</string>
<string name="topicApiUrl">https://api.copymanga.info/api/v3/topic/%1$s?platform=3</string>
<string name="topicContentApiUrl">https://api.copymanga.info/api/v3/topic/%1$s/contents?type=%2$d&amp;limit=21&amp;offset=%3$d&amp;platform=3</string>
<string name="recommendApiUrl">https://api.copymanga.info/api/v3/recs?pos=3200102&amp;limit=21&amp;offset=%1$d&amp;platform=3</string>
<string name="newestApiUrl">https://api.copymanga.info/api/v3/update/newest?limit=21&amp;offset=%1$d&amp;platform=3</string>
<string name="finishApiUrl">https://api.copymanga.info/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;top=finish&amp;platform=3</string>
<string name="authorApiUrl">https://api.copymanga.info/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;author=%3$s&amp;platform=3</string>
<string name="captionApiUrl">https://api.copymanga.info/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;theme=%3$s&amp;platform=3</string>
<string name="loginApiUrl">https://api.copymanga.info/api/v3/login?platform=3</string>
<string name="memberInfoApiUrl">https://api.copymanga.info/api/v3/member/info?platform=3</string>
<string name="historyApiUrl">https://api.copymanga.info/api/v3/member/browse/comics?limit=21&amp;offset=%1$d&amp;platform=3</string>
<string name="mainPageApiUrl">https://%1$s/api/v3/h5/homeIndex?platform=3</string>
<string name="referUrl">https://%1$s</string>
<string name="hostUrl">&hosturl;</string>
<string name="rankApiUrl">https://%1$s/api/v3/ranks?limit=21&amp;offset=%2$d&amp;date_type=%3$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=3</string>
<string name="filterApiUrl">https://%1$s/api/v3/h5/filterIndex/comic/tags?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;platform=3</string>
<string name="bookInfoApiUrl">https://%1$s/api/v3/comic2/%2$s?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=3</string>
<string name="chapterInfoApiUrl">https://%1$s/api/v3/comic/%2$s/chapter2/%3$s?platform=3</string>
<string name="topicApiUrl">https://%1$s/api/v3/topic/%2$s?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=3</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="newestApiUrl">https://%1$s/api/v3/update/newest?limit=21&amp;offset=%2$d&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=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=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=3</string>
<string name="loginApiUrl">https://%1$s/api/v3/login?platform=3</string>
<string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=3</string>
<string name="historyApiUrl">https://%1$s/api/v3/member/browse/comics?limit=21&amp;offset=%2$d&amp;platform=3</string>
<string name="imgProxyApiUrl">https://copymanga.azurewebsites.net/api/img?code=%1$s&amp;url=%2$s</string>
<string name="complete">已完结</string>
@@ -90,7 +96,13 @@
<string name="settings_cat_net">网络</string>
<string name="settings_cat_net_sw_use_foreign">使用海外线路</string>
<string name="settings_cat_net_sm_use_foreign">不管使用什么线路, API访问均是海外, 只有图片CDN可能会变化, 请酌情选择使用</string>
<string name="settings_cat_net_sm_use_foreign">不管使用什么线路, API访问均是海外, 只有图片CDN可能会变化(也可能不变), 请酌情选择使用</string>
<string name="settings_cat_net_et_title_api_url">请求API网址</string>
<string name="settings_cat_net_et_summary_api_url">一般无需更改,除非拷贝漫画官方更改网址,默认:&hosturl;</string>
<string name="settings_cat_net_sw_use_img_proxy">使用图床代理(重启生效)</string>
<string name="settings_cat_net_sm_use_img_proxy">作者自建的图床代理可缓解国内图片无法加载问题但不保证100%解决,也不保证一直可用</string>
<string name="settings_cat_net_et_title_img_proxy">图床代理密钥(重启生效)</string>
<string name="settings_cat_net_et_summary_img_proxy">为避免滥用代理密钥需加群559748702获得且随时可能会刷新</string>
<string name="settings_cat_vm">漫画浏览</string>
<string name="settings_cat_vm_sw_vol_turn">音量键翻页</string>

View File

@@ -4,6 +4,18 @@
<!-- Customize your theme here. -->
</style>
<style name="AppTheme.Default" parent="Theme.MaterialComponents.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!--
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
-->
</style>
<style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

View File

@@ -10,6 +10,33 @@
app:selectable="true"
app:summary="@string/settings_cat_net_sm_use_foreign"
app:title="@string/settings_cat_net_sw_use_foreign" />
<EditTextPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:defaultValue="@string/hostUrl"
android:selectAllOnFocus="false"
android:singleLine="true"
android:title="@string/settings_cat_net_et_title_api_url"
android:summary="@string/settings_cat_net_et_summary_api_url"
app:enableCopying="true"
app:iconSpaceReserved="false"
app:key="settings_cat_net_et_api_url" />
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_net_sw_use_img_proxy"
app:selectable="true"
app:summary="@string/settings_cat_net_sm_use_img_proxy"
app:title="@string/settings_cat_net_sw_use_img_proxy" />
<EditTextPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:selectAllOnFocus="false"
android:singleLine="true"
android:title="@string/settings_cat_net_et_title_img_proxy"
android:summary="@string/settings_cat_net_et_summary_img_proxy"
app:enableCopying="true"
app:iconSpaceReserved="false"
app:key="settings_cat_net_et_img_proxy_code" />
</PreferenceCategory>
<PreferenceCategory
app:iconSpaceReserved="false"

View File

@@ -10,7 +10,7 @@ buildscript {
maven { url "https://jitpack.io" }
}
dependencies {
classpath 'com.android.tools.build:gradle:8.1.0'
classpath 'com.android.tools.build:gradle:8.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong