diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index e0f13a0c8..00e9f11ac 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 关注合作公众号 **[小说拾遗]()** 获取好看的小说。 - 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2020/08/20** +* 正文图片(漫画源)链接支持修改headers + **2020/08/19** * 选择文本替换时带入书名和书源 diff --git a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt index 8879e19b9..51103b52e 100644 --- a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt +++ b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt @@ -49,13 +49,11 @@ object HttpHelper { return null } - fun getBytes(url: String, referer: String): ByteArray? { + fun getBytes(url: String, queryMap: Map, headers: Map): ByteArray? { NetworkUtils.getBaseUrl(url)?.let { baseUrl -> - val headers = - mapOf(Pair(AppConst.UA_NAME, AppConst.userAgent), Pair("Referer", referer)) return getByteRetrofit(baseUrl) .create(HttpGetApi::class.java) - .getMapByte(url, mapOf(), headers) + .getMapByte(url, queryMap, headers) .execute() .body() } diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index 0e6031755..9cbf64f8f 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -4,6 +4,8 @@ import android.annotation.SuppressLint import android.text.TextUtils import androidx.annotation.Keep import io.legado.app.constant.AppConst.SCRIPT_ENGINE +import io.legado.app.constant.AppConst.UA_NAME +import io.legado.app.constant.AppConst.userAgent import io.legado.app.constant.AppPattern.EXP_PATTERN import io.legado.app.constant.AppPattern.JS_PATTERN import io.legado.app.data.entities.BaseBook @@ -321,6 +323,34 @@ class AnalyzeUrl( return Res(NetworkUtils.getUrl(res), res.body()) } + @Throws(Exception::class) + fun getImageBytes( + tag: String + ): ByteArray? { + //资源为本站的资源,保留cookie + //图片盗链的不保留当前的cookie,可由js生成图片源站的cookie + val cookie = CookieStore.getCookie(tag) + NetworkUtils.getBaseUrl(url)?.let { + val regex: Any + if(it.lastIndexOf(".") != it.indexOf(".")) { + regex = it.substring(it.indexOf(".")+1).toRegex() + } else { + regex = it.substring(it.lastIndexOf("/")+1).toRegex() + } + if(regex.containsMatchIn(tag)) { + if (cookie.isNotEmpty()) { + headerMap["Cookie"] += cookie + } + } + } + headerMap[UA_NAME] = headerMap[UA_NAME] ?:userAgent + if(fieldMap.isEmpty()) { + return HttpHelper.getBytes(url, mapOf(), headerMap) + } else { + return HttpHelper.getBytes(url, fieldMap, headerMap) + } + } + data class UrlOption( val method: String?, val charset: String?, diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt index bc7e8c5b6..d21988163 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt @@ -163,7 +163,6 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at ReadBook.book!!, textPage.chapterIndex, textChar.charData, - null, true )?.let { canvas.drawBitmap(it, null, rectF, null) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt index c1e4bdf1e..3dbc0a5e1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt @@ -39,7 +39,7 @@ object ChapterProvider { lateinit var titlePaint: TextPaint lateinit var contentPaint: TextPaint private val srcPattern = - Pattern.compile("", Pattern.CASE_INSENSITIVE) + Pattern.compile("", Pattern.CASE_INSENSITIVE) init { upStyle() @@ -122,7 +122,7 @@ object ChapterProvider { imageStyle: String? ): Float { var durY = y - ImageProvider.getImage(book, chapter.index, src, chapter.url)?.let { + ImageProvider.getImage(book, chapter.index, src)?.let { if (durY > visibleHeight) { textPages.last().height = durY textPages.add(TextPage()) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt index b6109e9d3..3a6b80d8e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt @@ -11,6 +11,7 @@ import io.legado.app.utils.MD5Utils import io.legado.app.utils.externalFilesDir import java.io.FileOutputStream import java.util.concurrent.ConcurrentHashMap +import io.legado.app.model.analyzeRule.AnalyzeUrl object ImageProvider { @@ -31,13 +32,13 @@ object ImageProvider { indexCache[src] = bitmap } - fun getImage(book: Book, chapterIndex: Int, src: String, referrer: String?, onUi: Boolean = false): Bitmap? { + fun getImage(book: Book, chapterIndex: Int, src: String, onUi: Boolean = false): Bitmap? { getCache(chapterIndex, src)?.let { return it } val vFile = FileUtils.getFile( App.INSTANCE.externalFilesDir, - "${MD5Utils.md5Encode16(src)}${src.substringAfterLast(".")}", + "${MD5Utils.md5Encode16(src)}${src.substringAfterLast(".").substringBefore(",")}", "images", book.name ) if (!vFile.exists()) { @@ -48,8 +49,9 @@ object ImageProvider { out.flush() out.close() } - } else if (!onUi && referrer != null) { - HttpHelper.getBytes(src, referrer)?.let { + } else if (!onUi) { + val analyzeUrl = AnalyzeUrl(src, null, null, null, null) + analyzeUrl.getImageBytes(book.origin)?.let { FileUtils.createFileIfNotExist(vFile.absolutePath).writeBytes(it) } } diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt index 69c062295..74dfe23cd 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt @@ -56,7 +56,7 @@ class PhotoDialog : BaseDialogFragment() { val src = it.getString("src") ReadBook.book?.let { book -> src?.let { - ImageProvider.getImage(book, chapterIndex, src, null)?.let { bitmap -> + ImageProvider.getImage(book, chapterIndex, src)?.let { bitmap -> photo_view.setImageBitmap(bitmap) } }