diff --git a/.github/workflows/autoupdatefork.yml b/.github/workflows/autoupdatefork.yml index 4e9a62855..9fa5d6425 100644 --- a/.github/workflows/autoupdatefork.yml +++ b/.github/workflows/autoupdatefork.yml @@ -2,20 +2,13 @@ name: update fork on: - release: - types: [published] - push: - tags: - - 'v*' schedule: - - cron: '50 3 * * *' #设置定时任务 - watch: - types: [started] -#1.设置secrets并命名为EMAIL,内容为邮箱地址,设置方法百度,不介意邮箱泄露,可以直接将${{ secrets.EMAIL }}替换为邮箱。2.设置用户名 + - cron: '0 16 * * *' #设置定时任务 + jobs: build: runs-on: ubuntu-latest - if: github.event.repository.owner.id == github.event.sender.id + if: ${{ github.event.repository.owner.id == github.event.sender.id && github.actor != 'gedoor' }} steps: - name: Checkout uses: actions/checkout@v2 @@ -27,11 +20,10 @@ jobs: sudo apt-get -y install git - name: Set env run: | - git config --global user.email "${{ secrets.EMAIL }}" - git config --global user.name "[用户名]" + git config --global user.email "github-actions@github.com" + git config --global user.name "github-actions" - name: Update fork run: | - cd /home/runner/work/legado/legado git remote add upstream https://github.com/gedoor/legado.git git remote -v git fetch upstream diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 00e9f11ac..de7a200ad 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/21** +* 图片(漫画源)支持离线下载了 + **2020/08/20** * 正文图片(漫画源)链接支持修改headers diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 7bbbbd001..5a30aba70 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -7,24 +7,30 @@ import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.ReplaceRule import io.legado.app.help.coroutine.Coroutine +import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.localBook.LocalBook import io.legado.app.utils.FileUtils import io.legado.app.utils.MD5Utils import io.legado.app.utils.externalFilesDir import io.legado.app.utils.postEvent +import io.legado.app.utils.NetworkUtils import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.withContext import org.apache.commons.text.similarity.JaccardSimilarity import org.jetbrains.anko.toast import java.io.File +import java.util.regex.Pattern import kotlin.math.min object BookHelp { private const val cacheFolderName = "book_cache" + private const val cacheImageFolderName = "images" private val downloadDir: File = App.INSTANCE.externalFilesDir + private val srcPattern = + Pattern.compile("", Pattern.CASE_INSENSITIVE) - private fun bookFolderName(book: Book): String { + fun bookFolderName(book: Book): String { return formatFolderName(book.name) + MD5Utils.md5Encode16(book.bookUrl) } @@ -63,13 +69,44 @@ object BookHelp { @Synchronized fun saveContent(book: Book, bookChapter: BookChapter, content: String) { if (content.isEmpty()) return + //保存文本 FileUtils.createFileIfNotExist( downloadDir, formatChapterName(bookChapter), subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) ).writeText(content) + //保存图片 + content.split("\n").forEach { + val matcher = srcPattern.matcher(it) + if (matcher.find()) { + var src = matcher.group(1) + src = NetworkUtils.getAbsoluteURL(bookChapter.url, src) + src?.let { + saveImage(book, src) + } + } + } postEvent(EventBus.SAVE_CONTENT, bookChapter) } + + fun saveImage(book: Book, src:String) { + val analyzeUrl = AnalyzeUrl(src, null, null, null, null) + analyzeUrl.getImageBytes(book.origin)?.let { + FileUtils.createFileIfNotExist( + downloadDir, + "${MD5Utils.md5Encode16(src)}${src.substringAfterLast(".").substringBefore(",")}", + subDirs = *arrayOf(cacheFolderName, bookFolderName(book), cacheImageFolderName) + ).writeBytes(it) + } + } + + fun getImage(book:Book, src:String): File { + return FileUtils.getFile( + downloadDir, + "${MD5Utils.md5Encode16(src)}${src.substringAfterLast(".").substringBefore(",")}", + subDirs = *arrayOf(cacheFolderName, bookFolderName(book), cacheImageFolderName) + ) + } fun getChapterFiles(book: Book): List { val fileNameList = arrayListOf() 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 3a6b80d8e..30ac0a613 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 @@ -3,15 +3,13 @@ package io.legado.app.ui.book.read.page.provider import android.graphics.Bitmap import io.legado.app.App import io.legado.app.data.entities.Book -import io.legado.app.help.http.HttpHelper +import io.legado.app.help.BookHelp import io.legado.app.model.localBook.EPUBFile import io.legado.app.utils.BitmapUtils import io.legado.app.utils.FileUtils -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 { @@ -36,11 +34,7 @@ object ImageProvider { getCache(chapterIndex, src)?.let { return it } - val vFile = FileUtils.getFile( - App.INSTANCE.externalFilesDir, - "${MD5Utils.md5Encode16(src)}${src.substringAfterLast(".").substringBefore(",")}", - "images", book.name - ) + val vFile = BookHelp.getImage(book, src) if (!vFile.exists()) { if (book.isEpub()) { EPUBFile.getImage(book, src).use { @@ -50,10 +44,7 @@ object ImageProvider { out.close() } } else if (!onUi) { - val analyzeUrl = AnalyzeUrl(src, null, null, null, null) - analyzeUrl.getImageBytes(book.origin)?.let { - FileUtils.createFileIfNotExist(vFile.absolutePath).writeBytes(it) - } + BookHelp.saveImage(book, src) } } return try {