diff --git a/.idea/dictionaries/fumiama.xml b/.idea/dictionaries/fumiama.xml index 7d7a688..64540c6 100644 --- a/.idea/dictionaries/fumiama.xml +++ b/.idea/dictionaries/fumiama.xml @@ -5,6 +5,7 @@ grps imgs lowpan + mangacopy mangafuna nisi pausable diff --git a/app/build.gradle b/app/build.gradle index a2937a3..7d653d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId 'top.fumiama.copymanga' minSdkVersion 23 targetSdkVersion 34 - versionCode 49 - versionName '2.2.1' + versionCode 50 + versionName '2.2.2' resourceConfigurations += ['zh', 'zh-rCN'] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt b/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt index 8f6cc38..5ab7ca3 100644 --- a/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt @@ -55,7 +55,7 @@ class LoginActivity : AppCompatActivity() { finish() return@launch } - Toast.makeText(this@LoginActivity, l?.message, Toast.LENGTH_SHORT).show() + Toast.makeText(this@LoginActivity, l?.message, Toast.LENGTH_LONG).show() } } } diff --git a/app/src/main/java/top/fumiama/copymanga/manga/Book.kt b/app/src/main/java/top/fumiama/copymanga/manga/Book.kt index 98ac831..df385c8 100644 --- a/app/src/main/java/top/fumiama/copymanga/manga/Book.kt +++ b/app/src/main/java/top/fumiama/copymanga/manga/Book.kt @@ -5,20 +5,19 @@ import com.google.gson.Gson import kotlinx.android.synthetic.main.card_book.* import kotlinx.android.synthetic.main.line_booktandb.* import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import top.fumiama.copymanga.json.BookInfoStructure import top.fumiama.copymanga.json.ThemeStructure import top.fumiama.copymanga.json.VolumeStructure -import top.fumiama.copymanga.template.http.PausableDownloader import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.dmzj.copymanga.R 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) { - private val mBookApiUrl = getString(R.string.bookInfoApiUrl).format(CMApi.myHostApiUrl, path) + private val mBookApiUrl = getString(R.string.bookInfoApiUrl).format(CMApi.myHostApiUrl, path).let { + CMApi.apiProxy?.wrap(it)?:it + } private val mUserAgent = getString(R.string.pc_ua) private var mBook: BookInfoStructure? = null private var mGroupPathWords = arrayOf() @@ -131,7 +130,7 @@ class Book(val path: String, private val getString: (Int) -> String, private val mJsonString = Gson().toJson(volumes) File(mangaFolder, "info.json").writeText(mJsonString) File(mangaFolder, "grps.json").writeText(Gson().toJson(mKeys)) - (cover?.let { CMApi.proxy?.wrap(it) } ?:cover)?.let { + (cover?.let { CMApi.imageProxy?.wrap(it) } ?:cover)?.let { Thread { DownloadTools.getHttpContent(it, -1)?.let { data -> File(mangaFolder, "head.jpg").writeBytes(data) diff --git a/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt b/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt index 428f32f..0bea645 100644 --- a/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt +++ b/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt @@ -5,15 +5,18 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import top.fumiama.copymanga.json.BookQueryStructure import top.fumiama.copymanga.json.ReturnBase +import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.dmzj.copymanga.R class Shelf(private val token: String, getString: (Int) -> String) { private val hostUrl: String = getString(R.string.hostUrl) private val apiUrl: String = getString(R.string.shelfOperateApiUrl).format(hostUrl) - private val queryApiUrl = getString(R.string.bookUserQueryApiUrl) + private val queryApiUrlTemplate = getString(R.string.bookUserQueryApiUrl) private val referer: String = getString(R.string.referer) private val ua: String = getString(R.string.pc_ua) + private val addApiUrl get() = "$apiUrl?platform=3".let { CMApi.apiProxy?.wrap(it)?:it } + private val delApiUrl get() = "${apiUrl}s?platform=3".let { CMApi.apiProxy?.wrap(it)?:it } suspend fun add(comicId: String): String = withContext(Dispatchers.IO) { if (comicId.isEmpty()) { return@withContext "空漫画ID" @@ -26,7 +29,7 @@ class Shelf(private val token: String, getString: (Int) -> String) { append(token) } val re = DownloadTools.requestWithBody( - "$apiUrl?platform=3", "POST", body.encodeToByteArray(), referer, ua + addApiUrl, "POST", body.encodeToByteArray(), referer, ua )?.decodeToString() ?: return@withContext "空回应" return@withContext Gson().fromJson(re, ReturnBase::class.java).message } @@ -45,7 +48,7 @@ class Shelf(private val token: String, getString: (Int) -> String) { append(token) } val re = DownloadTools.requestWithBody( - "${apiUrl}s?platform=3", "DELETE", body.encodeToByteArray(), referer, ua + delApiUrl, "DELETE", body.encodeToByteArray(), referer, ua )?.decodeToString() ?: return@withContext "空回应" return@withContext Gson().fromJson(re, ReturnBase::class.java).message } @@ -53,7 +56,9 @@ class Shelf(private val token: String, getString: (Int) -> String) { suspend fun query(pathWord: String): BookQueryStructure? = withContext(Dispatchers.IO) { try { Gson().fromJson(DownloadTools.getHttpContent( - queryApiUrl.format(hostUrl, pathWord), referer, ua + queryApiUrlTemplate.format(hostUrl, pathWord).let { + CMApi.apiProxy?.wrap(it)?:it + }, referer, ua ).decodeToString(), BookQueryStructure::class.java) } catch (e: Exception) { e.printStackTrace() diff --git a/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt b/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt index 84d2bfa..a407916 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt @@ -13,47 +13,39 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.json.ReturnBase +import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.http.DownloadTools -import top.fumiama.copymanga.tools.thread.TimeThread import top.fumiama.dmzj.copymanga.R import java.io.File -import java.lang.Thread.sleep import java.security.MessageDigest open class AutoDownloadHandler( private val url: String, private val jsonClass: Class<*>, private val context: LifecycleOwner?, - private val callCheckMsg: Int = -1, private val loadFromCache: Boolean = false, private val customCacheFile: File? = null): Handler(Looper.myLooper()!!) { - private var timeThread: TimeThread? = null private var checkTimes = 0 var exit = false override fun handleMessage(msg: Message) { super.handleMessage(msg) when(msg.what){ - callCheckMsg -> check() - 0 -> setLayouts() + MSG_START_LOAD -> setLayouts() } } open fun setGsonItem(gsonObj: Any): Boolean = true open fun getGsonItem(): ReturnBase? = null - open fun onError() {} + open suspend fun onError() {} open suspend fun doWhenFinishDownload() {} fun startLoad() { - sendEmptyMessage(0) + sendEmptyMessage(MSG_START_LOAD) } fun destroy() { exit = true } private suspend fun download() = withContext(Dispatchers.IO) { checkTimes = 0 - TimeThread(this@AutoDownloadHandler, callCheckMsg, 100).let { - timeThread = it - it.canDo = true - it.start() - } downloadCoroutine() + check() } private fun toHexStr(byteArray: ByteArray) = with(StringBuilder()) { @@ -86,7 +78,10 @@ open class AutoDownloadHandler( var cnt = 0 while (cnt++ <= 3) { try { - val data = DownloadTools.getHttpContent(url, null, mainWeakReference?.get()?.getString(R.string.pc_ua)!!) + val data = DownloadTools.getHttpContent( + CMApi.apiProxy?.wrap(url)?:url, null, + mainWeakReference?.get()?.getString(R.string.pc_ua)!! + ) if(exit) return@withContext val fi = data.inputStream() val pass = setGsonItem(Gson().fromJson(fi.reader(), jsonClass)) @@ -105,17 +100,18 @@ open class AutoDownloadHandler( } } } - private fun check() { - val g = getGsonItem() - if(g != null) { - timeThread?.canDo = false - if(g.code == 200) sendEmptyMessage(0) - else onError() - Log.d("MyADH", "[${g.code}]${g.message}") - } else if(checkTimes++ > 1000) timeThread?.canDo = false + private suspend fun check() { + getGsonItem()?.let { + Log.d("MyADH", "[${it.code}]${it.message}") + if (it.code == 200) startLoad() else null + }?:onError() } private fun setLayouts() = context?.lifecycleScope?.launch { if(getGsonItem() == null) download() else doWhenFinishDownload() } + + companion object { + const val MSG_START_LOAD = 0 + } } diff --git a/app/src/main/java/top/fumiama/copymanga/template/http/PausableDownloader.kt b/app/src/main/java/top/fumiama/copymanga/template/http/PausableDownloader.kt index dcbf5c6..08e47bc 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/http/PausableDownloader.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/http/PausableDownloader.kt @@ -5,18 +5,20 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.withContext import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference +import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.dmzj.copymanga.R import java.lang.Thread.sleep import kotlin.random.Random -class PausableDownloader(private val url: String, private val waitMilliseconds: Long = 0, private val whenFinish: (suspend (result: ByteArray)->Unit)? = null) { +class PausableDownloader(private val url: String, private val waitMilliseconds: Long = 0, private val isApi: Boolean = true, private val whenFinish: (suspend (result: ByteArray)->Unit)? = null) { var exit = false suspend fun run() = withContext(Dispatchers.IO) { var c = 0 while (!exit && c++ < 3) { try { - val data = (DownloadTools.getHttpContent(url, + val data = (DownloadTools.getHttpContent( + (if(isApi) CMApi.apiProxy?.wrap(url) else null)?:url, mainWeakReference?.get()?.getString(R.string.referer)!!, mainWeakReference?.get()?.getString(R.string.pc_ua)!! )) diff --git a/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt b/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt index bcc9912..b6c08d9 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt @@ -114,7 +114,7 @@ class CardList( that?.context?.let { context -> val waitMillis = cardLoadingWaits.getAndIncrement().toLong()*200 val g = Glide.with(context).load( - GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders) + GlideUrl(CMApi.imageProxy?.wrap(head)?:head, CMApi.myGlideHeaders) ).addListener(GlideHideLottieViewListener(WeakReference(it.laic)) { if (exitCardList) return@GlideHideLottieViewListener cardLoadingWaits.decrementAndGet() diff --git a/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt b/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt index badbb0a..033501a 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt @@ -9,11 +9,26 @@ import top.fumiama.dmzj.copymanga.R import java.io.File object CMApi { - var proxy = if (Proxy.useImageProxy) Proxy( - R.string.imgProxyApiUrl, - R.string.imgProxyApiRegex, - R.string.imgProxyKeyID - ) else null + var imageProxy: Proxy? = null + get() { + if (field != null) return field + if (Proxy.useImageProxy) field = Proxy( + R.string.imgProxyApiUrl, + Regex("^https://[0-9a-z-]+\\.mangafuna\\.xyz/"), + R.string.imgProxyKeyID + ) + return field + } + var apiProxy: Proxy? = null + get() { + if (field != null) return field + if (Proxy.useApiProxy) field = Proxy( + R.string.apiProxyApiUrl, + Regex("^https://api\\.(copymanga|mangacopy)\\.\\w+/api/"), + R.string.imgProxyKeyID + ) + return field + } var resolution = Resolution(Regex("c\\d+x\\.")) var myGlideHeaders: LazyHeaders? = null get() { @@ -68,8 +83,4 @@ object CMApi { 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) } diff --git a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadPool.kt b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadPool.kt index 0bf22a0..3422d54 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadPool.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadPool.kt @@ -97,7 +97,7 @@ class DownloadPool(folder: String) { var s = false while (!s && tryTimes-- > 0) { val u = imgUrls[index] - s = (DownloadTools.getHttpContent(CMApi.resolution.wrap(CMApi.proxy?.wrap(u)?:u), -1))?.let { + s = (DownloadTools.getHttpContent(CMApi.resolution.wrap(CMApi.imageProxy?.wrap(u)?:u), -1))?.let { zip.putNextEntry(ZipEntry("$index.${if(imgUrls[index].contains(".webp")) "webp" else "jpg"}")) zip.write(it) zip.closeEntry() diff --git a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt index 94cea10..c516bfd 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt @@ -38,7 +38,7 @@ object DownloadTools { } setRequestProperty("platform", "3") } - Log.d("Mydl", "getConnection: ${connection.requestProperties.map { "${it.key}: ${it.value}" }.joinToString("\n")}") + Log.d("Mydl", "getConnection: $url\n${connection.requestProperties.map { "${it.key}: ${it.value}" }.joinToString("\n")}") connection } diff --git a/app/src/main/java/top/fumiama/copymanga/tools/http/Proxy.kt b/app/src/main/java/top/fumiama/copymanga/tools/http/Proxy.kt index ea0d5d8..e08a624 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/http/Proxy.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/http/Proxy.kt @@ -6,17 +6,16 @@ import top.fumiama.copymanga.MainActivity import java.net.URLEncoder import java.nio.charset.Charset -class Proxy(id: Int, apiRegexID: Int, keyID: Int? = null) { +class Proxy(id: Int, private val apiRegex: Regex, keyID: Int? = null) { private val code = keyID?.let { k -> MainActivity.mainWeakReference?.get()?.let { PreferenceManager.getDefaultSharedPreferences(it).getString(it.getString(k), null) } } private val proxyApiUrl = MainActivity.mainWeakReference?.get()?.getString(id) - private val apiRegex = Regex(MainActivity.mainWeakReference?.get()?.getString(apiRegexID)?:"") fun wrap(u: String): String { - if(!apiRegex.matches(u)) { + if(!apiRegex.containsMatchIn(u)) { Log.d("MyP", "[N] wrap: $u") return u } @@ -42,7 +41,7 @@ class Proxy(id: Int, apiRegexID: Int, keyID: Int? = null) { } return false } - /*val useApiProxy: Boolean + val useApiProxy: Boolean get() { MainActivity.mainWeakReference?.get()?.let { PreferenceManager.getDefaultSharedPreferences(it).apply { @@ -52,6 +51,6 @@ class Proxy(id: Int, apiRegexID: Int, keyID: Int? = null) { } } return false - }*/ + } } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt index 6ffcaab..111d3e1 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt @@ -39,7 +39,6 @@ import top.fumiama.copymanga.tools.ui.GlideHideLottieViewListener import top.fumiama.copymanga.tools.ui.Navigate import top.fumiama.copymanga.ui.vm.ViewMangaActivity import top.fumiama.dmzj.copymanga.R -import java.lang.Thread.sleep import java.lang.ref.WeakReference class BookHandler(private val th: WeakReference): Handler(Looper.myLooper()!!) { @@ -82,7 +81,7 @@ class BookHandler(private val th: WeakReference): Handler(Looper.m that?.apply { val load = Glide.with(this).load( if (book?.cover != null) - GlideUrl(CMApi.proxy?.wrap(book?.cover!!)?:book?.cover!!, CMApi.myGlideHeaders) + GlideUrl(CMApi.imageProxy?.wrap(book?.cover!!)?:book?.cover!!, CMApi.myGlideHeaders) else book?.cachedCover ).addListener(GlideHideLottieViewListener(WeakReference(laic))) load.into(imic) diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt index b32cdad..79cc412 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt @@ -37,7 +37,6 @@ import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.ui.GlideHideLottieViewListener import top.fumiama.copymanga.tools.ui.Navigate import top.fumiama.dmzj.copymanga.R -import java.lang.Thread.sleep import java.lang.ref.WeakReference class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { @@ -196,7 +195,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { thisBanner?.cover?.let { //Log.d("MyHomeFVP", "Load img: $it") Glide.with(this@HomeFragment).load( - GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders) + GlideUrl(CMApi.imageProxy?.wrap(it)?:it, CMApi.myGlideHeaders) ).addListener(GlideHideLottieViewListener(WeakReference(holder.itemView.lai))).into(holder.itemView.vpi) } holder.itemView.vpt.text = thisBanner?.brief @@ -255,7 +254,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { holder.itemView.tb.text = popular.toString() context?.let { Glide.with(it) - .load(GlideUrl(CMApi.proxy?.wrap(cover)?:cover, CMApi.myGlideHeaders)) + .load(GlideUrl(CMApi.imageProxy?.wrap(cover)?:cover, CMApi.myGlideHeaders)) .addListener(GlideHideLottieViewListener(WeakReference(holder.itemView.laic))) .into(holder.itemView.imic) } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt index a078f98..1b6bf12 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt @@ -35,15 +35,13 @@ import top.fumiama.copymanga.tools.ui.GlideHideLottieViewListener import top.fumiama.copymanga.tools.ui.Navigate import top.fumiama.copymanga.tools.ui.UITools import top.fumiama.dmzj.copymanga.R -import java.lang.Thread.sleep import java.lang.ref.WeakReference import java.util.concurrent.atomic.AtomicInteger class HomeHandler(private val that: WeakReference) : AutoDownloadHandler( that.get()?.getString(R.string.mainPageApiUrl)!!.format(CMApi.myHostApiUrl), IndexStructure::class.java, - that.get(), - 9 + that.get() ) { private val homeF get() = that.get() var index: IndexStructure? = null @@ -87,7 +85,6 @@ class HomeHandler(private val that: WeakReference) : AutoDownloadH homeF?.fhl?.addView(indexLines[msg.arg1]) } } - //9 -> checkIndex() } } @@ -104,10 +101,14 @@ class HomeHandler(private val that: WeakReference) : AutoDownloadH index?.results?.banners = banners return pass } - override fun onError() { + override suspend fun onError() { super.onError() if(exit) return - Toast.makeText(homeF?.context, R.string.web_error, Toast.LENGTH_SHORT).show() + sendEmptyMessage(2) //setSwipe + obtainMessage(-1, false).sendToTarget() //closeLoad + withContext(Dispatchers.Main) { + Toast.makeText(homeF?.context, R.string.web_error, Toast.LENGTH_SHORT).show() + } } override suspend fun doWhenFinishDownload() = withContext(Dispatchers.IO) { super.doWhenFinishDownload() @@ -329,7 +330,7 @@ class HomeHandler(private val that: WeakReference) : AutoDownloadH if(img.startsWith("http")) { Log.d("MyHH", "load card image: $img") val waitMillis = cardLoadingWaits.getAndIncrement().toLong()*200 - val g = Glide.with(it).load(GlideUrl(CMApi.proxy?.wrap(img)?:img, CMApi.myGlideHeaders)) + val g = Glide.with(it).load(GlideUrl(CMApi.imageProxy?.wrap(img)?:img, CMApi.myGlideHeaders)) .addListener(GlideHideLottieViewListener(WeakReference(cv.laic)) { cardLoadingWaits.decrementAndGet() }) diff --git a/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt index 5c15e26..5c9c422 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt @@ -145,13 +145,11 @@ class VMHandler(activity: ViewMangaActivity, private val chapterUrl: String, pri manga = m return true } - override fun onError() { + override suspend fun onError() { super.onError() if(exit) return - wv.get()?.apply { - lifecycleScope.launch { - toolsBox.toastError(R.string.download_chapter_info_failed) - } + withContext(Dispatchers.Main) { + wv.get()?.toolsBox?.toastError(R.string.download_chapter_info_failed) } } @@ -193,7 +191,9 @@ class VMHandler(activity: ViewMangaActivity, private val chapterUrl: String, pri } private suspend fun fakeLoad() = withContext(Dispatchers.IO) { - if(MainActivity.member?.hasLogin == true) PausableDownloader(chapterUrl) { _ -> }.run() + if(MainActivity.member?.hasLogin == true) launch { + PausableDownloader(chapterUrl) { _ -> }.run() + } } private suspend fun prepareManga() = withContext(Dispatchers.Main) { diff --git a/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt b/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt index ad893c0..f1a2f13 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt @@ -12,6 +12,7 @@ import android.graphics.drawable.Drawable import android.media.AudioManager import android.os.Bundle import android.os.Handler +import android.os.Looper import android.util.Log import android.util.TypedValue import android.view.* @@ -217,7 +218,7 @@ class ViewMangaActivity : TitleActivityTemplate() { return if(flag) true else super.onKeyDown(keyCode, event) } - private fun alertCellar() { + private suspend fun alertCellar() = withContext(Dispatchers.Main) { toolsBox.buildInfo( "注意", "要使用使用流量观看吗?", "确定", "本次阅读不再提醒", "取消", { handler.startLoad() }, { noCellarAlert = true; handler.startLoad() }, { finish() } @@ -238,7 +239,7 @@ class ViewMangaActivity : TitleActivityTemplate() { getImgUrlArray()?.let { tasks = Array(it.size) { i -> val u = it[i]?:return@Array null - return@Array DownloadTools.prepare(CMApi.resolution.wrap(CMApi.proxy?.wrap(u)?:u)) + return@Array DownloadTools.prepare(CMApi.resolution.wrap(CMApi.imageProxy?.wrap(u)?:u)) } tasksRunStatus = Array(it.size) { return@Array false } } @@ -255,7 +256,7 @@ class ViewMangaActivity : TitleActivityTemplate() { forEachIndexed { i, it -> if(it != null) { Thread{ - DownloadTools.getHttpContent(CMApi.resolution.wrap(CMApi.proxy?.wrap(it)?:it), 1024)?.inputStream()?.let { + DownloadTools.getHttpContent(CMApi.resolution.wrap(CMApi.imageProxy?.wrap(it)?:it), 1024)?.inputStream()?.let { isCut[i] = canCut(it) analyzedCnt[i] = true } @@ -293,7 +294,7 @@ class ViewMangaActivity : TitleActivityTemplate() { if (!isVertical) restorePN() } - private fun prepareImgFromWeb() { + private suspend fun prepareImgFromWeb() { if(!noCellarAlert && toolsBox.netInfo == getString(R.string.TRANSPORT_CELLULAR)) alertCellar() else handler.startLoad() } @@ -410,7 +411,7 @@ class ViewMangaActivity : TitleActivityTemplate() { private suspend fun loadImgUrlInto(imgView: ScaleImageView, url: String, useCut: Boolean, isLeft: Boolean){ Log.d("MyVM", "Load from adt: $url") - PausableDownloader(CMApi.resolution.wrap(CMApi.proxy?.wrap(url)?:url), 1000) { + PausableDownloader(CMApi.resolution.wrap(CMApi.imageProxy?.wrap(url)?:url), 1000, false) { it.let { loadImg(imgView, BitmapFactory.decodeByteArray(it, 0, it.size), useCut, isLeft, false) } }.run() } @@ -861,7 +862,7 @@ class ViewMangaActivity : TitleActivityTemplate() { val thisOneI = holder.itemView.onei Glide.with(this@ViewMangaActivity.applicationContext) .asBitmap() - .load(GlideUrl(CMApi.resolution.wrap(CMApi.proxy?.wrap(it)?:it), CMApi.myGlideHeaders)) + .load(GlideUrl(CMApi.resolution.wrap(CMApi.imageProxy?.wrap(it)?:it), CMApi.myGlideHeaders)) .placeholder(BitmapDrawable(resources, getLoadingBitmap(pos))) .into(object : CustomTarget() { override fun onResourceReady(resource: Bitmap, transition: Transition?) { @@ -870,7 +871,7 @@ class ViewMangaActivity : TitleActivityTemplate() { override fun onLoadCleared(placeholder: Drawable?) { } }) } else Glide.with(this@ViewMangaActivity.applicationContext) - .load(GlideUrl(CMApi.resolution.wrap(CMApi.proxy?.wrap(it)?:it), CMApi.myGlideHeaders)) + .load(GlideUrl(CMApi.resolution.wrap(CMApi.imageProxy?.wrap(it)?:it), CMApi.myGlideHeaders)) .placeholder(BitmapDrawable(resources, getLoadingBitmap(pos))) .into(holder.itemView.onei) } diff --git a/app/src/main/java/top/fumiama/copymanga/user/Member.kt b/app/src/main/java/top/fumiama/copymanga/user/Member.kt index 69e11da..47d3b60 100644 --- a/app/src/main/java/top/fumiama/copymanga/user/Member.kt +++ b/app/src/main/java/top/fumiama/copymanga/user/Member.kt @@ -37,12 +37,12 @@ class Member(private val pref: SharedPreferences, private val getString: (Int) - } val l = LoginInfoStructure() l.code = 400 - l.message = getString(R.string.login_get_conn_failed) + l.message = getString(R.string.login_get_conn_failed) return@withContext l } catch (e: Exception) { val l = LoginInfoStructure() l.code = 400 - l.message = e.localizedMessage + l.message = e.toString() return@withContext l } } @@ -63,7 +63,10 @@ class Member(private val pref: SharedPreferences, private val getString: (Int) - } return@withContext try { val l = Gson().fromJson(DownloadTools.getHttpContent( - getString(R.string.memberInfoApiUrl).format(CMApi.myHostApiUrl)).decodeToString(), + getString(R.string.memberInfoApiUrl).format(CMApi.myHostApiUrl).let { + CMApi.apiProxy?.wrap(it)?:it + } + ).decodeToString(), LoginInfoStructure::class.java) if(l.code == 200) pref.edit()?.apply { putString("avatar", l.results.avatar) @@ -91,6 +94,8 @@ class Member(private val pref: SharedPreferences, private val getString: (Int) - private fun getLoginConnection(username: String, pwd: String, salt: Int) = getString(R.string.loginApiUrl).format(CMApi.myHostApiUrl).let { + CMApi.apiProxy?.wrap(it)?:it + }.let { DownloadTools.getApiConnection(it, "POST").apply { pref.apply { doOutput = true diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4d7008c..aa0ac99 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -82,12 +82,8 @@ https://%1$s/api/v3/member/collect/comic https://copymanga.azurewebsites.net/api/img?code=%1$s&url=%2$s - ^https://[0-9a-z-]+\.mangafuna\.xyz/ settings_cat_net_et_img_proxy_code - + https://copymanga.azurewebsites.net/api/api?code=%1$s&url=%2$s settings_cat_net_sb_image_resolution 已完结 @@ -147,8 +143,8 @@ 作者自建的API代理,可缓解国内图书详情加载问题,但不保证100%解决,也不保证一直可用 使用图床代理(重启生效) 作者自建的图床代理,可缓解国内图片无法加载问题,但不保证100%解决,也不保证一直可用 - 图床代理密钥(重启生效) - 为避免滥用,代理密钥需加群(559748702)获得,且随时可能会刷新 + 代理密钥(重启生效) + 为避免滥用,该密钥需加群(559748702)获得,且随时可能会刷新 漫画浏览 深色阅读背景 diff --git a/app/src/main/res/xml/pref_setting.xml b/app/src/main/res/xml/pref_setting.xml index 36d84d8..1336f83 100644 --- a/app/src/main/res/xml/pref_setting.xml +++ b/app/src/main/res/xml/pref_setting.xml @@ -37,14 +37,12 @@ app:enableCopying="true" app:iconSpaceReserved="false" app:key="settings_cat_net_et_api_url" /> -